Skip to content

Otel

LlamaIndexOpenTelemetry #

Bases: BaseModel

LlamaIndexOpenTelemetry is a configuration and integration class for OpenTelemetry tracing within LlamaIndex. This class manages the setup and registration of OpenTelemetry span and event handlers, configures the tracer provider, and exports trace data using the specified span exporter and processor. It supports both simple and batch span processors, and allows customization of the service name or resource, as well as the dispatcher name.

Attributes:

Name Type Description
span_exporter Optional[SpanExporter]

The OpenTelemetry span exporter. Defaults to ConsoleSpanExporter.

span_processor Literal['simple', 'batch']

The span processor type, either 'simple' or 'batch'. Defaults to 'batch'.

service_name_or_resource Union[str, Resource]

The service name or OpenTelemetry Resource. Defaults to a Resource with service name 'llamaindex.opentelemetry'.

Source code in llama-index-integrations/observability/llama-index-observability-otel/llama_index/observability/otel/base.py
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
class LlamaIndexOpenTelemetry(BaseModel):
    """
    LlamaIndexOpenTelemetry is a configuration and integration class for OpenTelemetry tracing within LlamaIndex.
    This class manages the setup and registration of OpenTelemetry span and event handlers, configures the tracer provider,
    and exports trace data using the specified span exporter and processor. It supports both simple and batch span processors,
    and allows customization of the service name or resource, as well as the dispatcher name.

    Attributes:
        span_exporter (Optional[SpanExporter]): The OpenTelemetry span exporter. Defaults to ConsoleSpanExporter.
        span_processor (Literal["simple", "batch"]): The span processor type, either 'simple' or 'batch'. Defaults to 'batch'.
        service_name_or_resource (Union[str, Resource]): The service name or OpenTelemetry Resource. Defaults to a Resource with service name 'llamaindex.opentelemetry'.

    """

    model_config = ConfigDict(arbitrary_types_allowed=True)
    span_exporter: Optional[SpanExporter] = Field(
        default=ConsoleSpanExporter(),
        description="OpenTelemetry span exporter. Supports all SpanExporter-compatible interfaces, defaults to ConsoleSpanExporter.",
    )
    span_processor: Literal["simple", "batch"] = Field(
        default="batch",
        description="OpenTelemetry span processor. Can be either 'batch' (-> BatchSpanProcessor), 'simple' (-> SimpleSpanProcessor). Defaults to 'batch'",
    )
    extra_span_processors: List[SpanProcessor] = Field(
        default_factory=list,
        description="List of OpenTelemetry Span Processors to add to the tracer provider.",
    )
    tracer_provider: Optional[TracerProvider] = Field(
        default=None,
        description="Tracer Provider to inherint from the existing observability context. Defaults to None.",
    )
    service_name_or_resource: Union[str, Resource] = Field(
        default=Resource(attributes={SERVICE_NAME: "llamaindex.opentelemetry"}),
        description="Service name or resource for OpenTelemetry. Defaults to a Resource with 'llamaindex.opentelemetry' as service name.",
    )
    debug: bool = Field(
        default=False,
        description="Debug the start and end of span and the recording of events",
    )
    _tracer: Optional[trace.Tracer] = PrivateAttr(default=None)
    _tracer_provider_instance: Optional[TracerProvider] = PrivateAttr(default=None)

    def _start_otel(
        self,
    ) -> None:
        if isinstance(self.service_name_or_resource, str):
            self.service_name_or_resource = Resource(
                attributes={SERVICE_NAME: self.service_name_or_resource}
            )
        if self.tracer_provider is None:
            tracer_provider = TracerProvider(resource=self.service_name_or_resource)
        else:
            tracer_provider = self.tracer_provider
        assert self.span_exporter is not None, (
            "span_exporter has to be non-null to be used within simple or batch span processors"
        )
        span_processor: SpanProcessor
        if self.span_processor == "simple":
            span_processor = SimpleSpanProcessor(self.span_exporter)
        else:
            span_processor = BatchSpanProcessor(self.span_exporter)
        for extra_span_processor in self.extra_span_processors:
            tracer_provider.add_span_processor(extra_span_processor)
        tracer_provider.add_span_processor(span_processor)
        trace.set_tracer_provider(tracer_provider)
        self._tracer_provider_instance = tracer_provider
        self._tracer = trace.get_tracer("llamaindex.opentelemetry.tracer")

    def start_registering(
        self,
    ) -> None:
        """Starts LlamaIndex instrumentation."""
        self._start_otel()
        dispatcher = instrument.get_dispatcher()
        assert self._tracer is not None, (
            "The tracer has to be non-null to start observabiliy"
        )
        span_handler = OTelCompatibleSpanHandler(
            tracer=self._tracer,
            debug=self.debug,
            tracer_provider=self._tracer_provider_instance,
        )
        dispatcher.add_span_handler(span_handler)
        dispatcher.add_event_handler(
            OTelCompatibleEventHandler(span_handler=span_handler, debug=self.debug)
        )

start_registering #

start_registering() -> None

Starts LlamaIndex instrumentation.

Source code in llama-index-integrations/observability/llama-index-observability-otel/llama_index/observability/otel/base.py
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
def start_registering(
    self,
) -> None:
    """Starts LlamaIndex instrumentation."""
    self._start_otel()
    dispatcher = instrument.get_dispatcher()
    assert self._tracer is not None, (
        "The tracer has to be non-null to start observabiliy"
    )
    span_handler = OTelCompatibleSpanHandler(
        tracer=self._tracer,
        debug=self.debug,
        tracer_provider=self._tracer_provider_instance,
    )
    dispatcher.add_span_handler(span_handler)
    dispatcher.add_event_handler(
        OTelCompatibleEventHandler(span_handler=span_handler, debug=self.debug)
    )

options: members: - LlamaIndexOpenTelemetry