Wire AxonPushSpanExporter into a Python project's OpenTelemetry TracerProvider
Forward OpenTelemetry spans from a Python service into AxonPush via AxonPushSpanExporter.
AxonPushSpanExporter attached to the project's TracerProvider through a BatchSpanProcessorapp.span event with full trace_id, span_id, attributes, events, and links preservedRequires the otel extra:
pip install "axonpush[otel]"
# or: uv add "axonpush[otel]"
# or: poetry add "axonpush[otel]"
Use this path when the project does already have a .
TracerProviderimport os
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from axonpush import AxonPush
from axonpush.integrations.otel import AxonPushSpanExporter
axonpush_client = AxonPush(
api_key=os.environ["AXONPUSH_API_KEY"],
tenant_id=os.environ["AXONPUSH_TENANT_ID"],
base_url=os.environ.get("AXONPUSH_BASE_URL", "https://api.axonpush.xyz"),
)
provider = TracerProvider(resource=Resource.create({"service.name": "my-service"}))
provider.add_span_processor(
BatchSpanProcessor(
AxonPushSpanExporter(
client=axonpush_client,
channel_id=int(os.environ["AXONPUSH_CHANNEL_ID"]),
service_name="my-service",
)
)
)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
Use this path when the project already calls trace.set_tracer_provider(...) or uses an auto-instrumentation entrypoint. Never register a second global provider — attach to the existing one.
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from axonpush import AxonPush
from axonpush.integrations.otel import AxonPushSpanExporter
provider = trace.get_tracer_provider()
if isinstance(provider, TracerProvider):
provider.add_span_processor(
BatchSpanProcessor(
AxonPushSpanExporter(
client=AxonPush(api_key=os.environ["AXONPUSH_API_KEY"], tenant_id=os.environ["AXONPUSH_TENANT_ID"]),
channel_id=int(os.environ["AXONPUSH_CHANNEL_ID"]),
service_name="my-service",
)
)
)
axonpush[otel] using the project's package managerAXONPUSH_API_KEY, AXONPUSH_TENANT_ID, AXONPUSH_BASE_URL, AXONPUSH_CHANNEL_ID to .envTracerProvider already exists in the project (search for set_tracer_provider, TracerProvider(, or auto-instrumentation setup in the main module)AxonPushSpanExporter to it via BatchSpanProcessorservice.nameBatchSpanProcessor, never SimpleSpanProcessor, in productionAxonPush(fail_open=True) is the default. If AxonPush is unreachable the exporter silently drops spans — no application impact.
使用 Arthas 的 watch/trace 获取 EagleEye traceId / 获取请求的 traceId