Skip to main content

Tracing & Logging

For full usage examples see Observability guide. This page covers the API signatures.

setup_tracing()

from agentix.tracing import setup_tracing

setup_tracing(provider: Any = None) -> None

Configures the global OpenTelemetry tracer provider.

ArgumentDescription
provider=NoneWhen None, auto-configures a ConsoleSpanExporter. Pass your own TracerProvider for production.

Zero overhead when opentelemetry-api is not installed — the call is a no-op.

# Auto-configure (local debugging)
setup_tracing()

# Production — supply your own provider
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

provider = TracerProvider()
provider.add_span_processor(
BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-collector:4317"))
)
setup_tracing(provider=provider)

get_current_trace_context()

from agentix.tracing import get_current_trace_context

context: dict[str, str] = get_current_trace_context()
# {"traceparent": "00-abc123...-def456...-01", "tracestate": ""}

Returns W3C TraceContext headers (traceparent, tracestate) for propagating distributed trace context to downstream services. Returns an empty dict when there is no active span or tracing is disabled.

Span names

SpanTriggerKey attributes
agentix.runEach query() callagentix.session_id, agentix.agent_name, agentix.model, agentix.provider
agentix.llm_callEach LLM API requestagentix.model, agentix.turn
agentix.tool_callEach tool executionagentix.tool_name, agentix.tool_use_id
agentix.subagentEach sub-agent dispatchagentix.child_name
agentix.gateway_dispatchEach gateway messageagentix.channel_type, agentix.user_id, agentix.session_id

setup_logging()

from agentix.log import setup_logging

setup_logging(
level: str | int = "INFO",
json: bool = False,
stream: Any = None, # defaults to sys.stderr
) -> None

Configures the agentix logger namespace in isolation (propagate=False).

JSONFormatter

from agentix.log import JSONFormatter
import logging

handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger("agentix").addHandler(handler)
logging.getLogger("agentix").setLevel(logging.INFO)

Each JSON log line includes: timestamp (ISO 8601 + ms), level, logger, message, module, function, line, and optionally exception (traceback) and data (structured key-value dict from log_event()).

log_event() / get_logger()

from agentix.log import log_event, get_logger
import logging

log = get_logger("mymodule") # → logging.getLogger("agentix.mymodule")

log_event(log, logging.INFO, "my_event", key="value", count=42)
# Emits: {"message": "my_event", "data": {"key": "value", "count": 42}, ...}