From a6a047950a1da6126a59cd62561982cfdebe4e7c Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 16 Jun 2026 15:50:23 -0700 Subject: [PATCH 01/16] feat(galileo-a2a): rebrand to SPLUNK_AO_* env vars and SplunkAOSpanProcessor (HYBIM-716) Core package: - Rename GALILEO_OBSERVE_KEY -> SPLUNK_AO_OBSERVE_KEY in _constants.py - Rename GALILEO_* context vars to SPLUNK_AO_* in _context.py and _client_patches.py - Update pyproject.toml: galileo dependency -> splunk-ao, update classifiers Examples: - examples/.env.example: replace SPLUNK_AO_CONSOLE_URL with SPLUNK_AO_API_URL (direct API host is required for self-hosted deployments) Documentation (README.md): - Replace GalileoSpanProcessor -> SplunkAOSpanProcessor in all code examples - Replace GALILEO_* env vars -> SPLUNK_AO_* in configuration table - Add SPLUNK_AO_API_URL row (required for self-hosted) - Update all Galileo brand mentions to Splunk AO Tests: - Update all GALILEO_* env var references to SPLUNK_AO_* in conftest.py and test_context.py Co-authored-by: Cursor --- galileo-a2a/README.md | 33 ++++++++++--------- galileo-a2a/examples/.env.example | 8 ++--- galileo-a2a/pyproject.toml | 8 ++--- .../src/galileo_a2a/_client_patches.py | 4 +-- galileo-a2a/src/galileo_a2a/_constants.py | 4 +-- galileo-a2a/src/galileo_a2a/_context.py | 6 ++-- galileo-a2a/tests/conftest.py | 8 ++--- galileo-a2a/tests/test_context.py | 18 +++++----- 8 files changed, 45 insertions(+), 44 deletions(-) diff --git a/galileo-a2a/README.md b/galileo-a2a/README.md index 6f8dc303..9fd510ba 100644 --- a/galileo-a2a/README.md +++ b/galileo-a2a/README.md @@ -4,7 +4,7 @@ [![Python versions](https://img.shields.io/pypi/pyversions/galileo-a2a.svg)](https://pypi.org/project/galileo-a2a/) [![License](https://img.shields.io/pypi/l/galileo-a2a.svg)](https://github.com/rungalileo/galileo-python/blob/main/LICENSE) -Galileo observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A) protocol interactions. Automatic tracing of agent-to-agent calls, task lifecycle, and cross-agent distributed trace correlation. +Splunk AO observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A) protocol interactions. Automatic tracing of agent-to-agent calls, task lifecycle, and cross-agent distributed trace correlation. ## How It Works @@ -25,13 +25,13 @@ Galileo observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A) │ └─────────────────┬────────────────────────┘ │ │ │ │ │ ┌──────────▼──────────┐ │ -│ │ Galileo │ │ +│ │ Splunk AO │ │ │ │ (Trace Explorer) │ │ │ └─────────────────────┘ │ └──────────────────────────────────────────────────────────────────────┘ ``` -`galileo-a2a` instruments both the **client** (outbound calls) and **server** (inbound requests) sides of the A2A protocol. Trace context is propagated through A2A message metadata so all agents appear in a single distributed trace in Galileo. +`galileo-a2a` instruments both the **client** (outbound calls) and **server** (inbound requests) sides of the A2A protocol. Trace context is propagated through A2A message metadata so all agents appear in a single distributed trace in Splunk AO. ## Installation @@ -39,17 +39,17 @@ Galileo observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A) pip install galileo-a2a ``` -**Requirements:** Python 3.10+, a [Galileo API key](https://www.rungalileo.io/), and [a2a-sdk](https://pypi.org/project/a2a-sdk/) 0.3+ +**Requirements:** Python 3.10+, a [Splunk AO API key](https://www.splunk.com/), and [a2a-sdk](https://pypi.org/project/a2a-sdk/) 0.3+ ## Quick Start ```python -from splunk_ao.otel import GalileoSpanProcessor, add_galileo_span_processor +from splunk_ao.otel import SplunkAOSpanProcessor, add_galileo_span_processor from galileo_a2a import A2AInstrumentor from opentelemetry.sdk.trace import TracerProvider provider = TracerProvider() -add_galileo_span_processor(provider, GalileoSpanProcessor()) +add_galileo_span_processor(provider, SplunkAOSpanProcessor()) A2AInstrumentor().instrument(tracer_provider=provider, agent_name="orchestrator") ``` @@ -63,13 +63,14 @@ Once instrumented, all `a2a-sdk` client and server interactions produce OTel spa | `agent_name` | Name of this agent, set on spans as `gen_ai.agent.name`. | | `capture_content` | Set to `False` to disable capturing message content (e.g. for PII compliance). | -Environment variables for the Galileo exporter: +Environment variables for the Splunk AO exporter: | Environment Variable | Description | |---------------------|-------------| -| `GALILEO_API_KEY` | Galileo API key (required) | -| `GALILEO_PROJECT` | Project name (alternative to `GalileoSpanProcessor(project=...)`) | -| `GALILEO_LOG_STREAM` | Log stream name (alternative to `GalileoSpanProcessor(logstream=...)`) | +| `SPLUNK_AO_API_KEY` | Splunk AO API key (required) | +| `SPLUNK_AO_API_URL` | Splunk AO API host URL (required for self-hosted deployments, e.g. `https://agent-observability-api.rc0.signalfx.com`) | +| `SPLUNK_AO_PROJECT` | Project name (alternative to `SplunkAOSpanProcessor(project=...)`) | +| `SPLUNK_AO_LOG_STREAM` | Log stream name (alternative to `SplunkAOSpanProcessor(logstream=...)`) | ## Features @@ -83,11 +84,11 @@ The instrumentor patches both sides of the A2A protocol: ### Cross-Agent Distributed Tracing -When Agent A calls Agent B, trace context is propagated through A2A message metadata. The receiving agent joins the caller's trace, so both agents appear in a single distributed trace in Galileo. +When Agent A calls Agent B, trace context is propagated through A2A message metadata. The receiving agent joins the caller's trace, so both agents appear in a single distributed trace in Splunk AO. ### Session Tracking -A2A's `context_id` is mapped to `session.id`, grouping all interactions within the same conversation into a Galileo session. +A2A's `context_id` is mapped to `session.id`, grouping all interactions within the same conversation into a Splunk AO session. ### Disabling Instrumentation @@ -119,7 +120,7 @@ from a2a.types import ( AgentCapabilities, AgentCard, AgentSkill, Message, Role, TaskState, TaskStatus, TaskStatusUpdateEvent, TextPart, ) -from splunk_ao.otel import GalileoSpanProcessor, add_galileo_span_processor +from splunk_ao.otel import SplunkAOSpanProcessor, add_galileo_span_processor from galileo_a2a import A2AInstrumentor from langchain.agents import create_agent from langchain_core.tools import tool @@ -132,7 +133,7 @@ from typing_extensions import TypedDict # ---- Only 4 lines needed for full distributed tracing ---- provider = TracerProvider() -add_galileo_span_processor(provider, GalileoSpanProcessor()) +add_galileo_span_processor(provider, SplunkAOSpanProcessor()) A2AInstrumentor().instrument(tracer_provider=provider, agent_name="orchestrator") LangchainInstrumentor().instrument(tracer_provider=provider) @@ -255,13 +256,13 @@ async def main(): provider.shutdown() if __name__ == "__main__": - # Set environment variables: GALILEO_API_KEY, OPENAI_API_KEY + # Set environment variables: SPLUNK_AO_API_KEY, OPENAI_API_KEY asyncio.run(main()) ``` ## Resources -- [Galileo Documentation](https://v2docs.galileo.ai) +- [Splunk AO Documentation](https://docs.splunk.com/) - [A2A Protocol Specification](https://a2a-protocol.org) - [a2a-sdk Documentation](https://pypi.org/project/a2a-sdk) diff --git a/galileo-a2a/examples/.env.example b/galileo-a2a/examples/.env.example index c3dfd4d9..9b256d21 100644 --- a/galileo-a2a/examples/.env.example +++ b/galileo-a2a/examples/.env.example @@ -1,5 +1,5 @@ -GALILEO_API_KEY=your-galileo-key -GALILEO_CONSOLE_URL=http://localhost:8088 -GALILEO_PROJECT=a2a-distributed-tracing-demo -GALILEO_LOG_STREAM=dev +SPLUNK_AO_API_KEY=your-splunk-ao-key +SPLUNK_AO_API_URL=https:// +SPLUNK_AO_PROJECT=a2a-distributed-tracing-demo +SPLUNK_AO_LOG_STREAM=dev OPENAI_API_KEY=your-openai-key diff --git a/galileo-a2a/pyproject.toml b/galileo-a2a/pyproject.toml index f3a9a925..c352f3f4 100644 --- a/galileo-a2a/pyproject.toml +++ b/galileo-a2a/pyproject.toml @@ -69,10 +69,10 @@ python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] env = [ - "GALILEO_CONSOLE_URL=http://fake.test:8088", - "GALILEO_API_KEY=api-1234567890", - "GALILEO_PROJECT=test-project", - "GALILEO_LOG_STREAM=test-log-stream", + "SPLUNK_AO_CONSOLE_URL=http://fake.test:8088", + "SPLUNK_AO_API_KEY=api-1234567890", + "SPLUNK_AO_PROJECT=test-project", + "SPLUNK_AO_LOG_STREAM=test-log-stream", ] addopts = [ "-v", diff --git a/galileo-a2a/src/galileo_a2a/_client_patches.py b/galileo-a2a/src/galileo_a2a/_client_patches.py index 8e3f0ae0..4f30281d 100644 --- a/galileo-a2a/src/galileo_a2a/_client_patches.py +++ b/galileo-a2a/src/galileo_a2a/_client_patches.py @@ -11,7 +11,7 @@ from opentelemetry import trace from opentelemetry.trace import StatusCode, Tracer -from galileo_a2a._constants import GALILEO_OBSERVE_KEY +from galileo_a2a._constants import SPLUNK_AO_OBSERVE_KEY from galileo_a2a._context import inject_trace_context, iter_with_context from galileo_a2a._spans import ( set_client_attributes, @@ -107,7 +107,7 @@ async def wrapper( otel_context.detach(token) request_metadata = dict(request_metadata) if request_metadata else {} - request_metadata[GALILEO_OBSERVE_KEY] = observe_ctx + request_metadata[SPLUNK_AO_OBSERVE_KEY] = observe_ctx result = original( self, diff --git a/galileo-a2a/src/galileo_a2a/_constants.py b/galileo-a2a/src/galileo_a2a/_constants.py index edc10a89..a3ecbcaf 100644 --- a/galileo-a2a/src/galileo_a2a/_constants.py +++ b/galileo-a2a/src/galileo_a2a/_constants.py @@ -3,11 +3,11 @@ # Instrumentor identity from galileo_a2a._version import __version__ -INSTRUMENTOR_NAME = "galileo-a2a" +INSTRUMENTOR_NAME = "splunk-ao-a2a" INSTRUMENTOR_VERSION = __version__ # Metadata keys for in-band trace context propagation -GALILEO_OBSERVE_KEY = "galileo_observe" +SPLUNK_AO_OBSERVE_KEY = "splunk_ao_observe" AGNTCY_OBSERVE_KEY = "observe" # compatibility with AGNTCY Observe SDK # A2A span attribute keys (match API-side A2A extension expectations) diff --git a/galileo-a2a/src/galileo_a2a/_context.py b/galileo-a2a/src/galileo_a2a/_context.py index e1fd4ab3..3479d56e 100644 --- a/galileo-a2a/src/galileo_a2a/_context.py +++ b/galileo-a2a/src/galileo_a2a/_context.py @@ -12,7 +12,7 @@ from galileo_a2a._constants import ( AGNTCY_OBSERVE_KEY, - GALILEO_OBSERVE_KEY, + SPLUNK_AO_OBSERVE_KEY, LINK_FROM_AGENT, LINK_TYPE, LINK_TYPE_AGENT_HANDOFF, @@ -46,14 +46,14 @@ def inject_trace_context(agent_name: str | None = None) -> dict[str, str]: def extract_trace_context(metadata: dict[str, Any] | None) -> dict[str, str] | None: """Extract trace context from A2A request metadata. - Checks the Galileo key first, then falls back to the AGNTCY key for + Checks the Splunk AO key first, then falls back to the AGNTCY key for interoperability with the AGNTCY Observe SDK. Returns ``None`` when no trace context is present. """ if not metadata or not isinstance(metadata, dict): return None - ctx = metadata.get(GALILEO_OBSERVE_KEY) + ctx = metadata.get(SPLUNK_AO_OBSERVE_KEY) if ctx and isinstance(ctx, dict): return {str(k): str(v) for k, v in ctx.items()} diff --git a/galileo-a2a/tests/conftest.py b/galileo-a2a/tests/conftest.py index 22e5d807..0049f4a9 100644 --- a/galileo-a2a/tests/conftest.py +++ b/galileo-a2a/tests/conftest.py @@ -9,8 +9,8 @@ # 3. Security - prevents real API keys from leaking into test logs import os -os.environ["GALILEO_CONSOLE_URL"] = "http://fake.test:8088" -os.environ["GALILEO_API_KEY"] = "api-1234567890" -os.environ["GALILEO_PROJECT"] = "test-project" -os.environ["GALILEO_LOG_STREAM"] = "test-log-stream" +os.environ["SPLUNK_AO_CONSOLE_URL"] = "http://fake.test:8088" +os.environ["SPLUNK_AO_API_KEY"] = "api-1234567890" +os.environ["SPLUNK_AO_PROJECT"] = "test-project" +os.environ["SPLUNK_AO_LOG_STREAM"] = "test-log-stream" # fmt: on diff --git a/galileo-a2a/tests/test_context.py b/galileo-a2a/tests/test_context.py index cd897422..72e17938 100644 --- a/galileo-a2a/tests/test_context.py +++ b/galileo-a2a/tests/test_context.py @@ -5,7 +5,7 @@ from opentelemetry.sdk.trace import TracerProvider from opentelemetry.trace import Link -from galileo_a2a._constants import AGNTCY_OBSERVE_KEY, GALILEO_OBSERVE_KEY +from galileo_a2a._constants import AGNTCY_OBSERVE_KEY, SPLUNK_AO_OBSERVE_KEY from galileo_a2a._context import ( create_span_link_from_context, extract_trace_context, @@ -33,10 +33,10 @@ def test_includes_agent_name(self): class TestExtractTraceContext: - def test_extracts_from_galileo_observe_key(self): - # Given: metadata with galileo_observe context + def test_extracts_from_splunk_ao_observe_key(self): + # Given: metadata with splunk_ao_observe context metadata = { - GALILEO_OBSERVE_KEY: { + SPLUNK_AO_OBSERVE_KEY: { "traceparent": "00-aabb00112233445566778899aabbccdd-1122334455667788-01", "agent_name": "planner", } @@ -45,7 +45,7 @@ def test_extracts_from_galileo_observe_key(self): # When: extracting trace context result = extract_trace_context(metadata) - # Then: context extracted from galileo_observe key + # Then: context extracted from splunk_ao_observe key assert result is not None assert result["traceparent"] == "00-aabb00112233445566778899aabbccdd-1122334455667788-01" assert result["agent_name"] == "planner" @@ -66,19 +66,19 @@ def test_extracts_from_agntcy_observe_key(self): assert result is not None assert "traceparent" in result - def test_galileo_key_takes_precedence_over_agntcy(self): + def test_splunk_ao_key_takes_precedence_over_agntcy(self): # Given: metadata with both keys metadata = { - GALILEO_OBSERVE_KEY: {"traceparent": "galileo-traceparent"}, + SPLUNK_AO_OBSERVE_KEY: {"traceparent": "splunk-ao-traceparent"}, AGNTCY_OBSERVE_KEY: {"traceparent": "agntcy-traceparent"}, } # When: extracting trace context result = extract_trace_context(metadata) - # Then: galileo key takes precedence + # Then: splunk_ao key takes precedence assert result is not None - assert result["traceparent"] == "galileo-traceparent" + assert result["traceparent"] == "splunk-ao-traceparent" def test_returns_none_when_missing(self): # Given: metadata with no observe keys From 6afc9bdaa943eb85f62a3f9a8a600652202ae018 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 16 Jun 2026 16:24:31 -0700 Subject: [PATCH 02/16] fix(galileo-a2a): rename package to splunk-ao-a2a and reset to v0.1.0 - Rename PyPI package: galileo-a2a -> splunk-ao-a2a - Reset version to 0.1.0 (pyproject.toml + _version.py) - Update description, authors (Splunk Inc.), repository URL - Replace galileo dependency with splunk-ao>=2.0.0,<3.0.0 - Update tool.uv.sources key: galileo -> splunk-ao - Update pytest env vars: GALILEO_* -> SPLUNK_AO_* - Update semantic_release tags: galileo-a2a-v* -> splunk-ao-a2a-v* - Update dev deps to splunk-ao[otel] - Update ruff isort known-first-party to splunk_ao - Update README: badges, pip install -> splunk-ao-a2a Co-authored-by: Cursor --- galileo-a2a/README.md | 12 ++++++------ galileo-a2a/pyproject.toml | 22 +++++++++++----------- galileo-a2a/src/galileo_a2a/_version.py | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/galileo-a2a/README.md b/galileo-a2a/README.md index 9fd510ba..69682729 100644 --- a/galileo-a2a/README.md +++ b/galileo-a2a/README.md @@ -1,8 +1,8 @@ -# galileo-a2a +# splunk-ao-a2a -[![PyPI version](https://img.shields.io/pypi/v/galileo-a2a.svg)](https://pypi.org/project/galileo-a2a/) -[![Python versions](https://img.shields.io/pypi/pyversions/galileo-a2a.svg)](https://pypi.org/project/galileo-a2a/) -[![License](https://img.shields.io/pypi/l/galileo-a2a.svg)](https://github.com/rungalileo/galileo-python/blob/main/LICENSE) +[![PyPI version](https://img.shields.io/pypi/v/splunk-ao-a2a.svg)](https://pypi.org/project/splunk-ao-a2a/) +[![Python versions](https://img.shields.io/pypi/pyversions/splunk-ao-a2a.svg)](https://pypi.org/project/splunk-ao-a2a/) +[![License](https://img.shields.io/pypi/l/splunk-ao-a2a.svg)](https://github.com/splunk/splunk-ao-python/blob/main/LICENSE) Splunk AO observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A) protocol interactions. Automatic tracing of agent-to-agent calls, task lifecycle, and cross-agent distributed trace correlation. @@ -31,12 +31,12 @@ Splunk AO observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A └──────────────────────────────────────────────────────────────────────┘ ``` -`galileo-a2a` instruments both the **client** (outbound calls) and **server** (inbound requests) sides of the A2A protocol. Trace context is propagated through A2A message metadata so all agents appear in a single distributed trace in Splunk AO. +`splunk-ao-a2a` instruments both the **client** (outbound calls) and **server** (inbound requests) sides of the A2A protocol. Trace context is propagated through A2A message metadata so all agents appear in a single distributed trace in Splunk AO. ## Installation ```bash -pip install galileo-a2a +pip install splunk-ao-a2a ``` **Requirements:** Python 3.10+, a [Splunk AO API key](https://www.splunk.com/), and [a2a-sdk](https://pypi.org/project/a2a-sdk/) 0.3+ diff --git a/galileo-a2a/pyproject.toml b/galileo-a2a/pyproject.toml index c352f3f4..8d25ee2d 100644 --- a/galileo-a2a/pyproject.toml +++ b/galileo-a2a/pyproject.toml @@ -1,11 +1,11 @@ [project] -name = "galileo-a2a" -version = "1.0.0" -description = "Galileo observability auto-instrumentation for A2A (Agent-to-Agent) protocol" +name = "splunk-ao-a2a" +version = "0.1.0" +description = "Splunk AO observability auto-instrumentation for A2A (Agent-to-Agent) protocol" readme = "README.md" requires-python = ">=3.10,<3.15" license = { text = "Apache-2.0" } -authors = [{ name = "Galileo Technologies Inc.", email = "team@galileo.ai" }] +authors = [{ name = "Splunk Inc.", email = "team@splunk.com" }] classifiers = [ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", @@ -15,18 +15,18 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "galileo>=1.47.0,<2.0.0", + "splunk-ao>=2.0.0,<3.0.0", "a2a-sdk>=0.3.0,<1.0.0", "opentelemetry-api>=1.38.0", "opentelemetry-sdk>=1.38.0", ] [project.urls] -Repository = "https://github.com/rungalileo/galileo-python" +Repository = "https://github.com/splunk/splunk-ao-python" # UV-specific configuration (path for dev, ignored when installed from PyPI) [tool.uv] -sources = { galileo = { path = "../", editable = true } } +sources = { "splunk-ao" = { path = "../", editable = true } } [dependency-groups] dev = [ @@ -38,7 +38,7 @@ dev = [ "ruff>=0.12.3", "mypy>=1.16.0", "opentelemetry-instrumentation>=0.61b0", - "galileo[otel]>=1.47.0", + "splunk-ao[otel]>=2.0.0,<3.0.0", ] examples = [ "uvicorn>=0.42.0", @@ -95,7 +95,7 @@ ignore = ["ARG001", "ARG002", "D"] "tests/**/*.py" = ["ARG", "D"] [tool.ruff.lint.isort] -known-first-party = ["galileo_a2a", "galileo"] +known-first-party = ["galileo_a2a", "splunk_ao"] [tool.mypy] python_version = "3.10" @@ -122,9 +122,9 @@ exclude_lines = [ [tool.semantic_release] version_variables = ["src/galileo_a2a/_version.py:__version__"] version_toml = ["pyproject.toml:project.version"] -tag_format = "galileo-a2a-v{version}" +tag_format = "splunk-ao-a2a-v{version}" version_source = "tag" -commit_message = "chore(release): galileo-a2a v{version}\n\nAutomatically generated by python-semantic-release" +commit_message = "chore(release): splunk-ao-a2a v{version}\n\nAutomatically generated by python-semantic-release" [tool.semantic_release.commit_parser_options] patch_tags = ["fix", "perf", "chore", "docs", "style", "refactor"] diff --git a/galileo-a2a/src/galileo_a2a/_version.py b/galileo-a2a/src/galileo_a2a/_version.py index 53138230..3dc1f76b 100644 --- a/galileo-a2a/src/galileo_a2a/_version.py +++ b/galileo-a2a/src/galileo_a2a/_version.py @@ -1 +1 @@ -__version__ = "1.0.0b1" +__version__ = "0.1.0" From 79f1996f3c4f297a127bb189939a910f7f424c24 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Wed, 17 Jun 2026 12:03:37 -0700 Subject: [PATCH 03/16] refactor(galileo-a2a): rename dir to splunk-ao-a2a and module to splunk_ao_a2a - Rename top-level directory: galileo-a2a/ -> splunk-ao-a2a/ - Rename source package: src/galileo_a2a/ -> src/splunk_ao_a2a/ - Update all internal imports: galileo_a2a -> splunk_ao_a2a in all .py files - Update pyproject.toml: packages, coverage.source, semantic_release.version_variables, ruff.isort.known-first-party to reference splunk_ao_a2a - Update tests: all from/import/patch paths now use splunk_ao_a2a - Move examples/ into splunk-ao-a2a/examples/ Co-authored-by: Cursor --- galileo-a2a/src/galileo_a2a/__init__.py | 4 ---- {galileo-a2a => splunk-ao-a2a}/CHANGELOG.md | 0 {galileo-a2a => splunk-ao-a2a}/README.md | 4 ++-- .../examples/.env.example | 0 .../examples/two_agent_demo.py | 2 +- {galileo-a2a => splunk-ao-a2a}/pyproject.toml | 8 ++++---- splunk-ao-a2a/src/splunk_ao_a2a/__init__.py | 4 ++++ .../src/splunk_ao_a2a}/_client_patches.py | 6 +++--- .../src/splunk_ao_a2a}/_constants.py | 2 +- .../src/splunk_ao_a2a}/_context.py | 2 +- .../src/splunk_ao_a2a}/_server_patches.py | 4 ++-- .../src/splunk_ao_a2a}/_spans.py | 2 +- .../src/splunk_ao_a2a}/_version.py | 0 .../src/splunk_ao_a2a}/instrumentor.py | 10 +++++----- .../src/splunk_ao_a2a}/py.typed | 0 {galileo-a2a => splunk-ao-a2a}/tests/conftest.py | 0 .../tests/test_client_patches.py | 8 ++++---- .../tests/test_context.py | 4 ++-- .../tests/test_instrumentor.py | 14 +++++++------- .../tests/test_server_patches.py | 6 +++--- {galileo-a2a => splunk-ao-a2a}/tests/test_spans.py | 4 ++-- 21 files changed, 42 insertions(+), 42 deletions(-) delete mode 100644 galileo-a2a/src/galileo_a2a/__init__.py rename {galileo-a2a => splunk-ao-a2a}/CHANGELOG.md (100%) rename {galileo-a2a => splunk-ao-a2a}/README.md (99%) rename {galileo-a2a => splunk-ao-a2a}/examples/.env.example (100%) rename {galileo-a2a => splunk-ao-a2a}/examples/two_agent_demo.py (99%) rename {galileo-a2a => splunk-ao-a2a}/pyproject.toml (94%) create mode 100644 splunk-ao-a2a/src/splunk_ao_a2a/__init__.py rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_client_patches.py (96%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_constants.py (96%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_context.py (99%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_server_patches.py (97%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_spans.py (99%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/_version.py (100%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/instrumentor.py (87%) rename {galileo-a2a/src/galileo_a2a => splunk-ao-a2a/src/splunk_ao_a2a}/py.typed (100%) rename {galileo-a2a => splunk-ao-a2a}/tests/conftest.py (100%) rename {galileo-a2a => splunk-ao-a2a}/tests/test_client_patches.py (96%) rename {galileo-a2a => splunk-ao-a2a}/tests/test_context.py (98%) rename {galileo-a2a => splunk-ao-a2a}/tests/test_instrumentor.py (82%) rename {galileo-a2a => splunk-ao-a2a}/tests/test_server_patches.py (96%) rename {galileo-a2a => splunk-ao-a2a}/tests/test_spans.py (99%) diff --git a/galileo-a2a/src/galileo_a2a/__init__.py b/galileo-a2a/src/galileo_a2a/__init__.py deleted file mode 100644 index 447fa717..00000000 --- a/galileo-a2a/src/galileo_a2a/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from galileo_a2a._version import __version__ -from galileo_a2a.instrumentor import A2AInstrumentor - -__all__ = ["A2AInstrumentor", "__version__"] diff --git a/galileo-a2a/CHANGELOG.md b/splunk-ao-a2a/CHANGELOG.md similarity index 100% rename from galileo-a2a/CHANGELOG.md rename to splunk-ao-a2a/CHANGELOG.md diff --git a/galileo-a2a/README.md b/splunk-ao-a2a/README.md similarity index 99% rename from galileo-a2a/README.md rename to splunk-ao-a2a/README.md index 1d04ad12..a2ce1dc0 100644 --- a/galileo-a2a/README.md +++ b/splunk-ao-a2a/README.md @@ -45,7 +45,7 @@ pip install splunk-ao-a2a ```python from splunk_ao.otel import SplunkAOSpanProcessor, add_splunk_ao_span_processor -from galileo_a2a import A2AInstrumentor +from splunk_ao_a2a import A2AInstrumentor from opentelemetry.sdk.trace import TracerProvider provider = TracerProvider() @@ -121,7 +121,7 @@ from a2a.types import ( TaskState, TaskStatus, TaskStatusUpdateEvent, TextPart, ) from splunk_ao.otel import SplunkAOSpanProcessor, add_splunk_ao_span_processor -from galileo_a2a import A2AInstrumentor +from splunk_ao_a2a import A2AInstrumentor from langchain.agents import create_agent from langchain_core.tools import tool from langchain_openai import ChatOpenAI diff --git a/galileo-a2a/examples/.env.example b/splunk-ao-a2a/examples/.env.example similarity index 100% rename from galileo-a2a/examples/.env.example rename to splunk-ao-a2a/examples/.env.example diff --git a/galileo-a2a/examples/two_agent_demo.py b/splunk-ao-a2a/examples/two_agent_demo.py similarity index 99% rename from galileo-a2a/examples/two_agent_demo.py rename to splunk-ao-a2a/examples/two_agent_demo.py index b9477c39..dbbd5491 100644 --- a/galileo-a2a/examples/two_agent_demo.py +++ b/splunk-ao-a2a/examples/two_agent_demo.py @@ -52,7 +52,7 @@ from starlette.applications import Starlette from typing_extensions import TypedDict -from galileo_a2a import A2AInstrumentor +from splunk_ao_a2a import A2AInstrumentor load_dotenv(Path(__file__).parent / ".env") diff --git a/galileo-a2a/pyproject.toml b/splunk-ao-a2a/pyproject.toml similarity index 94% rename from galileo-a2a/pyproject.toml rename to splunk-ao-a2a/pyproject.toml index 8d25ee2d..2c14540d 100644 --- a/galileo-a2a/pyproject.toml +++ b/splunk-ao-a2a/pyproject.toml @@ -58,7 +58,7 @@ requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] -packages = ["src/galileo_a2a"] +packages = ["src/splunk_ao_a2a"] [tool.pytest.ini_options] testpaths = ["tests"] @@ -95,7 +95,7 @@ ignore = ["ARG001", "ARG002", "D"] "tests/**/*.py" = ["ARG", "D"] [tool.ruff.lint.isort] -known-first-party = ["galileo_a2a", "splunk_ao"] +known-first-party = ["splunk_ao_a2a", "splunk_ao"] [tool.mypy] python_version = "3.10" @@ -106,7 +106,7 @@ ignore_missing_imports = true follow_imports = "skip" [tool.coverage.run] -source = ["src/galileo_a2a"] +source = ["src/splunk_ao_a2a"] omit = ["tests/*"] [tool.coverage.report] @@ -120,7 +120,7 @@ exclude_lines = [ ] [tool.semantic_release] -version_variables = ["src/galileo_a2a/_version.py:__version__"] +version_variables = ["src/splunk_ao_a2a/_version.py:__version__"] version_toml = ["pyproject.toml:project.version"] tag_format = "splunk-ao-a2a-v{version}" version_source = "tag" diff --git a/splunk-ao-a2a/src/splunk_ao_a2a/__init__.py b/splunk-ao-a2a/src/splunk_ao_a2a/__init__.py new file mode 100644 index 00000000..df09343c --- /dev/null +++ b/splunk-ao-a2a/src/splunk_ao_a2a/__init__.py @@ -0,0 +1,4 @@ +from splunk_ao_a2a._version import __version__ +from splunk_ao_a2a.instrumentor import A2AInstrumentor + +__all__ = ["A2AInstrumentor", "__version__"] diff --git a/galileo-a2a/src/galileo_a2a/_client_patches.py b/splunk-ao-a2a/src/splunk_ao_a2a/_client_patches.py similarity index 96% rename from galileo-a2a/src/galileo_a2a/_client_patches.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_client_patches.py index 4f30281d..1c839218 100644 --- a/galileo-a2a/src/galileo_a2a/_client_patches.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_client_patches.py @@ -11,9 +11,9 @@ from opentelemetry import trace from opentelemetry.trace import StatusCode, Tracer -from galileo_a2a._constants import SPLUNK_AO_OBSERVE_KEY -from galileo_a2a._context import inject_trace_context, iter_with_context -from galileo_a2a._spans import ( +from splunk_ao_a2a._constants import SPLUNK_AO_OBSERVE_KEY +from splunk_ao_a2a._context import inject_trace_context, iter_with_context +from splunk_ao_a2a._spans import ( set_client_attributes, set_input, set_simple_input, diff --git a/galileo-a2a/src/galileo_a2a/_constants.py b/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py similarity index 96% rename from galileo-a2a/src/galileo_a2a/_constants.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_constants.py index a3ecbcaf..aa9ce724 100644 --- a/galileo-a2a/src/galileo_a2a/_constants.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py @@ -1,7 +1,7 @@ """Constants for galileo-a2a instrumentation.""" # Instrumentor identity -from galileo_a2a._version import __version__ +from splunk_ao_a2a._version import __version__ INSTRUMENTOR_NAME = "splunk-ao-a2a" INSTRUMENTOR_VERSION = __version__ diff --git a/galileo-a2a/src/galileo_a2a/_context.py b/splunk-ao-a2a/src/splunk_ao_a2a/_context.py similarity index 99% rename from galileo-a2a/src/galileo_a2a/_context.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_context.py index 3479d56e..12b9a1de 100644 --- a/galileo-a2a/src/galileo_a2a/_context.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_context.py @@ -10,7 +10,7 @@ from opentelemetry.propagate import inject as otel_inject from opentelemetry.trace import Link, NonRecordingSpan, SpanContext, TraceFlags -from galileo_a2a._constants import ( +from splunk_ao_a2a._constants import ( AGNTCY_OBSERVE_KEY, SPLUNK_AO_OBSERVE_KEY, LINK_FROM_AGENT, diff --git a/galileo-a2a/src/galileo_a2a/_server_patches.py b/splunk-ao-a2a/src/splunk_ao_a2a/_server_patches.py similarity index 97% rename from galileo-a2a/src/galileo_a2a/_server_patches.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_server_patches.py index 50a103fc..46ea20bb 100644 --- a/galileo-a2a/src/galileo_a2a/_server_patches.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_server_patches.py @@ -10,13 +10,13 @@ from opentelemetry import trace from opentelemetry.trace import StatusCode, Tracer -from galileo_a2a._context import ( +from splunk_ao_a2a._context import ( create_parent_context_from_trace, create_span_link_from_context, extract_trace_context, iter_with_context, ) -from galileo_a2a._spans import set_input, set_output, set_server_attributes, track_task_state +from splunk_ao_a2a._spans import set_input, set_output, set_server_attributes, track_task_state _logger = logging.getLogger(__name__) diff --git a/galileo-a2a/src/galileo_a2a/_spans.py b/splunk-ao-a2a/src/splunk_ao_a2a/_spans.py similarity index 99% rename from galileo-a2a/src/galileo_a2a/_spans.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_spans.py index a6ea1bd1..2e37f88c 100644 --- a/galileo-a2a/src/galileo_a2a/_spans.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_spans.py @@ -9,7 +9,7 @@ from opentelemetry import trace from opentelemetry.trace import StatusCode -from galileo_a2a._constants import ( +from splunk_ao_a2a._constants import ( A2A_CONTEXT_ID, A2A_RPC_METHOD, A2A_TASK_ID, diff --git a/galileo-a2a/src/galileo_a2a/_version.py b/splunk-ao-a2a/src/splunk_ao_a2a/_version.py similarity index 100% rename from galileo-a2a/src/galileo_a2a/_version.py rename to splunk-ao-a2a/src/splunk_ao_a2a/_version.py diff --git a/galileo-a2a/src/galileo_a2a/instrumentor.py b/splunk-ao-a2a/src/splunk_ao_a2a/instrumentor.py similarity index 87% rename from galileo-a2a/src/galileo_a2a/instrumentor.py rename to splunk-ao-a2a/src/splunk_ao_a2a/instrumentor.py index 1d7e9eaf..3db3bc62 100644 --- a/galileo-a2a/src/galileo_a2a/instrumentor.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/instrumentor.py @@ -9,10 +9,10 @@ from opentelemetry import trace from opentelemetry.instrumentation.instrumentor import BaseInstrumentor # type: ignore[import-untyped] -from galileo_a2a import _spans -from galileo_a2a._client_patches import _patch_client, _unpatch_client -from galileo_a2a._constants import INSTRUMENTOR_NAME, INSTRUMENTOR_VERSION -from galileo_a2a._server_patches import _patch_server, _unpatch_server +from splunk_ao_a2a import _spans +from splunk_ao_a2a._client_patches import _patch_client, _unpatch_client +from splunk_ao_a2a._constants import INSTRUMENTOR_NAME, INSTRUMENTOR_VERSION +from splunk_ao_a2a._server_patches import _patch_server, _unpatch_server _logger = logging.getLogger(__name__) @@ -33,7 +33,7 @@ class A2AInstrumentor(BaseInstrumentor): # type: ignore[misc] from opentelemetry.sdk.trace import TracerProvider from splunk_ao.otel import SplunkAOSpanProcessor, add_splunk_ao_span_processor - from galileo_a2a import A2AInstrumentor + from splunk_ao_a2a import A2AInstrumentor provider = TracerProvider() add_splunk_ao_span_processor(provider, SplunkAOSpanProcessor()) diff --git a/galileo-a2a/src/galileo_a2a/py.typed b/splunk-ao-a2a/src/splunk_ao_a2a/py.typed similarity index 100% rename from galileo-a2a/src/galileo_a2a/py.typed rename to splunk-ao-a2a/src/splunk_ao_a2a/py.typed diff --git a/galileo-a2a/tests/conftest.py b/splunk-ao-a2a/tests/conftest.py similarity index 100% rename from galileo-a2a/tests/conftest.py rename to splunk-ao-a2a/tests/conftest.py diff --git a/galileo-a2a/tests/test_client_patches.py b/splunk-ao-a2a/tests/test_client_patches.py similarity index 96% rename from galileo-a2a/tests/test_client_patches.py rename to splunk-ao-a2a/tests/test_client_patches.py index 419c3bc7..5f18f0b7 100644 --- a/galileo-a2a/tests/test_client_patches.py +++ b/splunk-ao-a2a/tests/test_client_patches.py @@ -6,10 +6,10 @@ import pytest from opentelemetry.trace import Span, StatusCode, Tracer -from galileo_a2a._client_patches import _originals, _patch_client, _unpatch_client, _wrap_send_message +from splunk_ao_a2a._client_patches import _originals, _patch_client, _unpatch_client, _wrap_send_message -@patch("galileo_a2a._client_patches.BaseClient") +@patch("splunk_ao_a2a._client_patches.BaseClient") class TestPatchClient: def test_patches_all_methods(self, mock_base_client): # Given: a fresh state @@ -45,7 +45,7 @@ def test_idempotent_second_call_is_noop(self, mock_base_client): # Cleanup _originals.clear() - @patch("galileo_a2a._client_patches._wrap_simple_method") + @patch("splunk_ao_a2a._client_patches._wrap_simple_method") def test_rollback_on_failure(self, mock_wrap, mock_base_client): # Given: _wrap_simple_method raises on the third call (get_card) _originals.clear() @@ -59,7 +59,7 @@ def test_rollback_on_failure(self, mock_wrap, mock_base_client): assert len(_originals) == 0 -@patch("galileo_a2a._client_patches.BaseClient") +@patch("splunk_ao_a2a._client_patches.BaseClient") class TestUnpatchClient: def test_restores_originals(self, mock_base_client): # Given: patched state diff --git a/galileo-a2a/tests/test_context.py b/splunk-ao-a2a/tests/test_context.py similarity index 98% rename from galileo-a2a/tests/test_context.py rename to splunk-ao-a2a/tests/test_context.py index 72e17938..6b9ac655 100644 --- a/galileo-a2a/tests/test_context.py +++ b/splunk-ao-a2a/tests/test_context.py @@ -5,8 +5,8 @@ from opentelemetry.sdk.trace import TracerProvider from opentelemetry.trace import Link -from galileo_a2a._constants import AGNTCY_OBSERVE_KEY, SPLUNK_AO_OBSERVE_KEY -from galileo_a2a._context import ( +from splunk_ao_a2a._constants import AGNTCY_OBSERVE_KEY, SPLUNK_AO_OBSERVE_KEY +from splunk_ao_a2a._context import ( create_span_link_from_context, extract_trace_context, inject_trace_context, diff --git a/galileo-a2a/tests/test_instrumentor.py b/splunk-ao-a2a/tests/test_instrumentor.py similarity index 82% rename from galileo-a2a/tests/test_instrumentor.py rename to splunk-ao-a2a/tests/test_instrumentor.py index fb80bcb8..23f1fcb1 100644 --- a/galileo-a2a/tests/test_instrumentor.py +++ b/splunk-ao-a2a/tests/test_instrumentor.py @@ -2,7 +2,7 @@ from unittest.mock import MagicMock, patch -from galileo_a2a.instrumentor import A2AInstrumentor +from splunk_ao_a2a.instrumentor import A2AInstrumentor class TestA2AInstrumentor: @@ -16,8 +16,8 @@ def test_instrumentation_dependencies(self): # Then: requires a2a-sdk assert "a2a-sdk>=0.3.0,<1.0.0" in deps - @patch("galileo_a2a.instrumentor._patch_server") - @patch("galileo_a2a.instrumentor._patch_client") + @patch("splunk_ao_a2a.instrumentor._patch_server") + @patch("splunk_ao_a2a.instrumentor._patch_client") def test_instrument_calls_patch_functions(self, mock_patch_client, mock_patch_server): # Given: an instrumentor instrumentor = A2AInstrumentor() @@ -33,8 +33,8 @@ def test_instrument_calls_patch_functions(self, mock_patch_client, mock_patch_se _, kwargs = mock_patch_client.call_args assert kwargs["agent_name"] == "test-agent" - @patch("galileo_a2a.instrumentor._unpatch_server") - @patch("galileo_a2a.instrumentor._unpatch_client") + @patch("splunk_ao_a2a.instrumentor._unpatch_server") + @patch("splunk_ao_a2a.instrumentor._unpatch_client") def test_uninstrument_calls_unpatch_functions(self, mock_unpatch_client, mock_unpatch_server): # Given: an instrumentor instrumentor = A2AInstrumentor() @@ -46,8 +46,8 @@ def test_uninstrument_calls_unpatch_functions(self, mock_unpatch_client, mock_un mock_unpatch_client.assert_called_once() mock_unpatch_server.assert_called_once() - @patch("galileo_a2a.instrumentor._patch_server") - @patch("galileo_a2a.instrumentor._patch_client") + @patch("splunk_ao_a2a.instrumentor._patch_server") + @patch("splunk_ao_a2a.instrumentor._patch_client") def test_instrument_passes_tracer_provider(self, mock_patch_client, mock_patch_server): # Given: a mock tracer provider mock_provider = MagicMock() diff --git a/galileo-a2a/tests/test_server_patches.py b/splunk-ao-a2a/tests/test_server_patches.py similarity index 96% rename from galileo-a2a/tests/test_server_patches.py rename to splunk-ao-a2a/tests/test_server_patches.py index 044f3c4e..86985880 100644 --- a/galileo-a2a/tests/test_server_patches.py +++ b/splunk-ao-a2a/tests/test_server_patches.py @@ -6,10 +6,10 @@ import pytest from opentelemetry.trace import Span, StatusCode, Tracer -from galileo_a2a._server_patches import _originals, _patch_server, _unpatch_server, _wrap_on_message_send_stream +from splunk_ao_a2a._server_patches import _originals, _patch_server, _unpatch_server, _wrap_on_message_send_stream -@patch("galileo_a2a._server_patches.DefaultRequestHandler") +@patch("splunk_ao_a2a._server_patches.DefaultRequestHandler") class TestPatchServer: def test_patches_all_methods(self, mock_handler): # Given: a fresh state @@ -44,7 +44,7 @@ def test_idempotent_second_call_is_noop(self, mock_handler): _originals.clear() -@patch("galileo_a2a._server_patches.DefaultRequestHandler") +@patch("splunk_ao_a2a._server_patches.DefaultRequestHandler") class TestUnpatchServer: def test_restores_originals(self, mock_handler): # Given: patched state diff --git a/galileo-a2a/tests/test_spans.py b/splunk-ao-a2a/tests/test_spans.py similarity index 99% rename from galileo-a2a/tests/test_spans.py rename to splunk-ao-a2a/tests/test_spans.py index d603a9d2..39e4f196 100644 --- a/galileo-a2a/tests/test_spans.py +++ b/splunk-ao-a2a/tests/test_spans.py @@ -7,8 +7,8 @@ import pytest from opentelemetry.trace import Span, StatusCode -from galileo_a2a import _spans -from galileo_a2a._constants import ( +from splunk_ao_a2a import _spans +from splunk_ao_a2a._constants import ( A2A_CONTEXT_ID, A2A_RPC_METHOD, A2A_TASK_ID, From a7393440ea6249c2bbdeb5cbc80b7c22f4ac51f2 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Thu, 18 Jun 2026 09:57:44 -0700 Subject: [PATCH 04/16] fix(splunk-ao-a2a): correct version ranges and stale docstring (PR #33 review) - Lower splunk-ao runtime dep floor: >=2.0.0 -> >=0.1.0,<1.0.0 to match actual package version (was unsatisfiable from PyPI) - Lower splunk-ao[otel] dev dep floor: >=2.0.0 -> >=0.1.0,<1.0.0 - Fix stale module docstring in _constants.py: galileo-a2a -> splunk-ao-a2a Note: SPLUNK_AO_API_URL bridge (SPLUNK_AO_API_URL -> GALILEO_API_URL) is already added in src/splunk_ao/config.py via PR #32. Co-authored-by: Cursor --- splunk-ao-a2a/pyproject.toml | 4 ++-- splunk-ao-a2a/src/splunk_ao_a2a/_constants.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/splunk-ao-a2a/pyproject.toml b/splunk-ao-a2a/pyproject.toml index 2c14540d..b9fed817 100644 --- a/splunk-ao-a2a/pyproject.toml +++ b/splunk-ao-a2a/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "splunk-ao>=2.0.0,<3.0.0", + "splunk-ao>=0.1.0,<1.0.0", "a2a-sdk>=0.3.0,<1.0.0", "opentelemetry-api>=1.38.0", "opentelemetry-sdk>=1.38.0", @@ -38,7 +38,7 @@ dev = [ "ruff>=0.12.3", "mypy>=1.16.0", "opentelemetry-instrumentation>=0.61b0", - "splunk-ao[otel]>=2.0.0,<3.0.0", + "splunk-ao[otel]>=0.1.0,<1.0.0", ] examples = [ "uvicorn>=0.42.0", diff --git a/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py b/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py index aa9ce724..6dade0cb 100644 --- a/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py +++ b/splunk-ao-a2a/src/splunk_ao_a2a/_constants.py @@ -1,4 +1,4 @@ -"""Constants for galileo-a2a instrumentation.""" +"""Constants for splunk-ao-a2a instrumentation.""" # Instrumentor identity from splunk_ao_a2a._version import __version__ From d5bad7251e9f2a8dac9beb8d9966e58bb59ef41c Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 11:37:34 -0700 Subject: [PATCH 05/16] ci: add GitHub Actions workflow to test splunk-ao-a2a Adds test-splunk-ao-a2a.yaml to run unit tests on pull requests and pushes to main that touch the splunk-ao-a2a package. Key differences from the galileo-python reference workflow: - Removes galileo-version min/latest matrix; splunk-ao is always installed as a local editable from the monorepo root via [tool.uv] sources in pyproject.toml - Python matrix: 3.10, 3.12, 3.13, 3.14 (drops 3.11, adds 3.14) - Coverage upload pinned to Python 3.13 (replaces 3.11 + latest axis) Co-authored-by: Cursor --- .github/workflows/test-splunk-ao-a2a.yaml | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/test-splunk-ao-a2a.yaml diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/test-splunk-ao-a2a.yaml new file mode 100644 index 00000000..3aa93dab --- /dev/null +++ b/.github/workflows/test-splunk-ao-a2a.yaml @@ -0,0 +1,66 @@ +name: Test splunk-ao-a2a + +on: + push: + branches: [main] + paths: + - 'splunk-ao-a2a/**' + - '.github/workflows/test-splunk-ao-a2a.yaml' + pull_request: + paths: + - 'splunk-ao-a2a/**' + - '.github/workflows/test-splunk-ao-a2a.yaml' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + test: + name: Python ${{ matrix.python-version }} + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.12", "3.13", "3.14"] + + runs-on: ubuntu-latest + # Hard cap per matrix job to bail out fast on real hangs. + timeout-minutes: 30 + + defaults: + run: + working-directory: splunk-ao-a2a + + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: ${{ matrix.python-version }} + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + # uv sources in pyproject.toml pins splunk-ao to the local monorepo root + # as an editable install, so this always tests against the latest local code. + - name: Install dependencies + run: uv sync --dev + + - name: Show installed versions + run: uv pip list | grep -E "^(splunk-ao|a2a-sdk)" + + - name: Run type check + run: uv run mypy src/ + + - name: Run tests + run: uv run pytest --cov=splunk_ao_a2a --cov-report=xml + + - name: Upload coverage + if: matrix.python-version == '3.13' + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: splunk-ao-a2a + files: splunk-ao-a2a/coverage.xml From 5d175f9c81ecc8c7dbc635a1b25e37be575bde14 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 11:51:30 -0700 Subject: [PATCH 06/16] fix(ci): use uv run pip list to avoid VIRTUAL_ENV override in show-versions step Co-authored-by: Cursor --- .github/workflows/test-splunk-ao-a2a.yaml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/test-splunk-ao-a2a.yaml index 3aa93dab..6d603e0f 100644 --- a/.github/workflows/test-splunk-ao-a2a.yaml +++ b/.github/workflows/test-splunk-ao-a2a.yaml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14"] runs-on: ubuntu-latest # Hard cap per matrix job to bail out fast on real hangs. @@ -49,18 +49,10 @@ jobs: run: uv sync --dev - name: Show installed versions - run: uv pip list | grep -E "^(splunk-ao|a2a-sdk)" + run: uv run pip list | grep -E "^(splunk-ao|a2a-sdk)" - name: Run type check run: uv run mypy src/ - name: Run tests run: uv run pytest --cov=splunk_ao_a2a --cov-report=xml - - - name: Upload coverage - if: matrix.python-version == '3.13' - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - flags: splunk-ao-a2a - files: splunk-ao-a2a/coverage.xml From c2ad92789cafd3cb313385aad7613a024eebb286 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 11:54:18 -0700 Subject: [PATCH 07/16] fix(ci): use pip show instead of pip list grep for installed versions step Co-authored-by: Cursor --- .github/workflows/test-splunk-ao-a2a.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/test-splunk-ao-a2a.yaml index 6d603e0f..9a1abec1 100644 --- a/.github/workflows/test-splunk-ao-a2a.yaml +++ b/.github/workflows/test-splunk-ao-a2a.yaml @@ -49,7 +49,7 @@ jobs: run: uv sync --dev - name: Show installed versions - run: uv run pip list | grep -E "^(splunk-ao|a2a-sdk)" + run: uv run pip show splunk-ao a2a-sdk - name: Run type check run: uv run mypy src/ From 8c2a462de64852d72276c28dbe2592242e123bbc Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 12:06:49 -0700 Subject: [PATCH 08/16] fix(ci): use uv tree --depth 1 for show-versions step to avoid VIRTUAL_ENV pip routing Co-authored-by: Cursor --- .github/workflows/test-splunk-ao-a2a.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/test-splunk-ao-a2a.yaml index 9a1abec1..0449bbec 100644 --- a/.github/workflows/test-splunk-ao-a2a.yaml +++ b/.github/workflows/test-splunk-ao-a2a.yaml @@ -49,7 +49,7 @@ jobs: run: uv sync --dev - name: Show installed versions - run: uv run pip show splunk-ao a2a-sdk + run: uv tree --depth 1 - name: Run type check run: uv run mypy src/ From 4512c71202dea71c7bce23f5f2234ea44aabd572 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 12:10:22 -0700 Subject: [PATCH 09/16] fix(dev): pin PyPI as default uv index to bypass Splunk Artifactory in global uv config Co-authored-by: Cursor --- splunk-ao-a2a/pyproject.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/splunk-ao-a2a/pyproject.toml b/splunk-ao-a2a/pyproject.toml index b9fed817..ab94e296 100644 --- a/splunk-ao-a2a/pyproject.toml +++ b/splunk-ao-a2a/pyproject.toml @@ -28,6 +28,12 @@ Repository = "https://github.com/splunk/splunk-ao-python" [tool.uv] sources = { "splunk-ao" = { path = "../", editable = true } } +# Ensure all packages resolve from PyPI, overriding any corporate index in the +# global uv config that only mirrors Splunk-internal packages. +[[tool.uv.index]] +url = "https://pypi.org/simple" +default = true + [dependency-groups] dev = [ "pytest>=8.4.0", From e605a4debf95e4697f3a97cc66c5a865dac530a2 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 12:26:53 -0700 Subject: [PATCH 10/16] fix(ci): fix show installed versions --- .github/workflows/test-splunk-ao-a2a.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/test-splunk-ao-a2a.yaml index 0449bbec..763f0c3e 100644 --- a/.github/workflows/test-splunk-ao-a2a.yaml +++ b/.github/workflows/test-splunk-ao-a2a.yaml @@ -49,7 +49,7 @@ jobs: run: uv sync --dev - name: Show installed versions - run: uv tree --depth 1 + run: uv pip list | grep -E "^(galileo|a2a-sdk|splunk-ao)" - name: Run type check run: uv run mypy src/ From 5485c6f20a015fb4dd8eb1c25cc64f1fbbeb8a30 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 14:09:32 -0700 Subject: [PATCH 11/16] fix(ci): rename gh workflow --- .../{test-splunk-ao-a2a.yaml => ci-tests-splunk-ao-a2a.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{test-splunk-ao-a2a.yaml => ci-tests-splunk-ao-a2a.yaml} (100%) diff --git a/.github/workflows/test-splunk-ao-a2a.yaml b/.github/workflows/ci-tests-splunk-ao-a2a.yaml similarity index 100% rename from .github/workflows/test-splunk-ao-a2a.yaml rename to .github/workflows/ci-tests-splunk-ao-a2a.yaml From 3f98825e60e2d58c2d71b64fe424431df6899b92 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Tue, 23 Jun 2026 14:14:27 -0700 Subject: [PATCH 12/16] fix(dev): add uv.toml to splunk-ao-a2a to replace global Artifactory index Project-level uv.toml with [[index]] replaces (not merges with) the list in ~/.config/uv/uv.toml, so the Splunk Artifactory mirror that does not carry all public PyPI packages is bypassed for this subpackage. Also fix the ci-tests workflow path trigger to reference the correct filename, and revert the ineffective [[tool.uv.index]] approach from pyproject.toml. Co-authored-by: Cursor --- .github/workflows/ci-tests-splunk-ao-a2a.yaml | 4 ++-- splunk-ao-a2a/pyproject.toml | 6 ------ splunk-ao-a2a/uv.toml | 6 ++++++ 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 splunk-ao-a2a/uv.toml diff --git a/.github/workflows/ci-tests-splunk-ao-a2a.yaml b/.github/workflows/ci-tests-splunk-ao-a2a.yaml index 763f0c3e..f1f786c3 100644 --- a/.github/workflows/ci-tests-splunk-ao-a2a.yaml +++ b/.github/workflows/ci-tests-splunk-ao-a2a.yaml @@ -5,11 +5,11 @@ on: branches: [main] paths: - 'splunk-ao-a2a/**' - - '.github/workflows/test-splunk-ao-a2a.yaml' + - '.github/workflows/ci-tests-splunk-ao-a2a.yaml' pull_request: paths: - 'splunk-ao-a2a/**' - - '.github/workflows/test-splunk-ao-a2a.yaml' + - '.github/workflows/ci-tests-splunk-ao-a2a.yaml' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/splunk-ao-a2a/pyproject.toml b/splunk-ao-a2a/pyproject.toml index ab94e296..b9fed817 100644 --- a/splunk-ao-a2a/pyproject.toml +++ b/splunk-ao-a2a/pyproject.toml @@ -28,12 +28,6 @@ Repository = "https://github.com/splunk/splunk-ao-python" [tool.uv] sources = { "splunk-ao" = { path = "../", editable = true } } -# Ensure all packages resolve from PyPI, overriding any corporate index in the -# global uv config that only mirrors Splunk-internal packages. -[[tool.uv.index]] -url = "https://pypi.org/simple" -default = true - [dependency-groups] dev = [ "pytest>=8.4.0", diff --git a/splunk-ao-a2a/uv.toml b/splunk-ao-a2a/uv.toml new file mode 100644 index 00000000..2f93c2fe --- /dev/null +++ b/splunk-ao-a2a/uv.toml @@ -0,0 +1,6 @@ +# Project-level uv config. List settings here REPLACE (not extend) the +# global ~/.config/uv/uv.toml, so [[index]] below overrides any corporate +# Artifactory mirror configured globally that does not mirror all PyPI packages. +[[index]] +url = "https://pypi.org/simple" +default = true From a8ceb172f668783fd15def13f957ce7dfbfb530c Mon Sep 17 00:00:00 2001 From: adityamehra Date: Fri, 26 Jun 2026 12:07:28 -0700 Subject: [PATCH 13/16] fix(splunk-ao-a2a): replace SPLUNK_AO_API_URL with SPLUNK_AO_CONSOLE_URL in docs and example SPLUNK_AO_API_URL is not read anywhere in the SDK - it is not in _CONFIGURATION_KEYS and not bridged in _bridge_env_vars(). The effective override for self-hosted deployments is SPLUNK_AO_CONSOLE_URL, which is bridged to GALILEO_CONSOLE_URL. Update README env var table and .env.example to use the correct variable. Co-authored-by: Cursor --- splunk-ao-a2a/README.md | 2 +- splunk-ao-a2a/examples/.env.example | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/splunk-ao-a2a/README.md b/splunk-ao-a2a/README.md index a2ce1dc0..f42c1e88 100644 --- a/splunk-ao-a2a/README.md +++ b/splunk-ao-a2a/README.md @@ -68,7 +68,7 @@ Environment variables for the Splunk AO exporter: | Environment Variable | Description | |---------------------|-------------| | `SPLUNK_AO_API_KEY` | Splunk AO API key (required) | -| `SPLUNK_AO_API_URL` | Splunk AO API host URL (required for self-hosted deployments, e.g. `https://agent-observability-api.rc0.signalfx.com`) | +| `SPLUNK_AO_CONSOLE_URL` | Splunk AO console URL (required for self-hosted deployments, e.g. `http://localhost:8088`) | | `SPLUNK_AO_PROJECT` | Project name (alternative to `SplunkAOSpanProcessor(project=...)`) | | `SPLUNK_AO_LOG_STREAM` | Log stream name (alternative to `SplunkAOSpanProcessor(logstream=...)`) | diff --git a/splunk-ao-a2a/examples/.env.example b/splunk-ao-a2a/examples/.env.example index 9b256d21..c3eaf9fb 100644 --- a/splunk-ao-a2a/examples/.env.example +++ b/splunk-ao-a2a/examples/.env.example @@ -1,5 +1,5 @@ SPLUNK_AO_API_KEY=your-splunk-ao-key -SPLUNK_AO_API_URL=https:// +SPLUNK_AO_CONSOLE_URL=https:// SPLUNK_AO_PROJECT=a2a-distributed-tracing-demo SPLUNK_AO_LOG_STREAM=dev OPENAI_API_KEY=your-openai-key From c5393eded8381481ad2138c1b1471313b44a9270 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Fri, 26 Jun 2026 13:18:50 -0700 Subject: [PATCH 14/16] fix(ci): Update install uv update python version revert to galileo docs link --- .github/workflows/ci-tests-splunk-ao-a2a.yaml | 5 ++++- splunk-ao-a2a/README.md | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-tests-splunk-ao-a2a.yaml b/.github/workflows/ci-tests-splunk-ao-a2a.yaml index f1f786c3..88498159 100644 --- a/.github/workflows/ci-tests-splunk-ao-a2a.yaml +++ b/.github/workflows/ci-tests-splunk-ao-a2a.yaml @@ -41,7 +41,10 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6 + with: + enable-cache: true + cache-dependency-glob: "**/splunk-ao-a2a/pyproject.toml" # uv sources in pyproject.toml pins splunk-ao to the local monorepo root # as an editable install, so this always tests against the latest local code. diff --git a/splunk-ao-a2a/README.md b/splunk-ao-a2a/README.md index f42c1e88..60453fb9 100644 --- a/splunk-ao-a2a/README.md +++ b/splunk-ao-a2a/README.md @@ -39,7 +39,7 @@ Splunk AO observability for [A2A (Agent-to-Agent)](https://github.com/google/A2A pip install splunk-ao-a2a ``` -**Requirements:** Python 3.10+, a [Splunk AO API key](https://www.splunk.com/), and [a2a-sdk](https://pypi.org/project/a2a-sdk/) 0.3+ +**Requirements:** Python 3.11+, a [Splunk AO API key](https://www.splunk.com/), and [a2a-sdk](https://pypi.org/project/a2a-sdk/) 0.3+ ## Quick Start @@ -262,7 +262,7 @@ if __name__ == "__main__": ## Resources -- [Splunk AO Documentation](https://docs.splunk.com/) +- [Splunk AO Documentation](https://docs.galileo.ai) - [A2A Protocol Specification](https://a2a-protocol.org) - [a2a-sdk Documentation](https://pypi.org/project/a2a-sdk) From 99724098ec06b62874817b2463eb6a2b6a148513 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Fri, 26 Jun 2026 13:20:17 -0700 Subject: [PATCH 15/16] fix(ci): remove uv toml which points to pypi index --- splunk-ao-a2a/uv.toml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 splunk-ao-a2a/uv.toml diff --git a/splunk-ao-a2a/uv.toml b/splunk-ao-a2a/uv.toml deleted file mode 100644 index 2f93c2fe..00000000 --- a/splunk-ao-a2a/uv.toml +++ /dev/null @@ -1,6 +0,0 @@ -# Project-level uv config. List settings here REPLACE (not extend) the -# global ~/.config/uv/uv.toml, so [[index]] below overrides any corporate -# Artifactory mirror configured globally that does not mirror all PyPI packages. -[[index]] -url = "https://pypi.org/simple" -default = true From 99697dd10e410615fc7034864020095cb7f5a610 Mon Sep 17 00:00:00 2001 From: adityamehra Date: Fri, 26 Jun 2026 15:36:40 -0700 Subject: [PATCH 16/16] fix(docs): remove Galileo reference --- splunk-ao-a2a/examples/two_agent_demo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/splunk-ao-a2a/examples/two_agent_demo.py b/splunk-ao-a2a/examples/two_agent_demo.py index dbbd5491..3d5c5e2f 100644 --- a/splunk-ao-a2a/examples/two_agent_demo.py +++ b/splunk-ao-a2a/examples/two_agent_demo.py @@ -1,9 +1,9 @@ -"""Two-agent A2A demo with LangGraph orchestrator and Galileo distributed tracing. +"""Two-agent A2A demo with LangGraph orchestrator and Splunk AO distributed tracing. Architecture: Orchestrator (LangGraph) ──A2A──> Researcher (LangChain agent + search tool) -Both agents appear in a single distributed trace in Galileo. +Both agents appear in a single distributed trace in Splunk AO. Usage: # Copy and fill in the .env file: @@ -57,7 +57,7 @@ load_dotenv(Path(__file__).parent / ".env") # --------------------------------------------------------------------------- -# Galileo tracing setup +# Splunk AO tracing setup # --------------------------------------------------------------------------- provider = TracerProvider()