Distribuição do OpenTelemetry

Para tornar o uso do OpenTelemetry e da auto-instrumentação o mais rápido possível sem sacrificar flexibilidade, as distribuições do OpenTelemetry fornecem um mecanismo para configurar automaticamente algumas das opções mais comuns para os usuários. Através disso, os usuários do OpenTelemetry podem configurar os componentes conforme suas necessidades. O pacote opentelemetry-distro fornece alguns padrões para usuários que desejam começar, configurando:

  • o SDK TracerProvider
  • um BatchSpanProcessor
  • o SpanExporter OTLP para enviar dados a um OpenTelemetry Collector

O pacote também fornece um ponto de partida para qualquer pessoa interessada em produzir uma distribuição alternativa. As interfaces implementadas pelo pacote são carregadas pela auto-instrumentação por meio dos pontos de entrada opentelemetry_distro e opentelemetry_configurator, para configurar a aplicação antes que qualquer outro código seja executado.

Para exportar automaticamente dados do OpenTelemetry para o OpenTelemetry Collector, a instalação do pacote irá configurar todos os pontos de entrada necessários.

pip install opentelemetry-distro[otlp] opentelemetry-instrumentation

Inicie o Collector localmente para ver os dados sendo exportados. Crie o seguinte arquivo:

# /tmp/otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  # NOTA: Antes da v0.86.0 use `logging` ao invés de `debug`.
  debug:
    verbosity: detailed
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug]

Em seguida, inicie o contêiner Docker:

docker run -p 4317:4317 \
    -v /tmp/otel-collector-config.yaml:/etc/otel-collector-config.yaml \
    otel/opentelemetry-collector:latest \
    --config=/etc/otel-collector-config.yaml

O código a seguir criará um trecho sem configuração.

# no_configuration.py
from opentelemetry import trace

with trace.get_tracer("meu.rastro").start_as_current_span("foo"):
    with trace.get_tracer("meu.rastro").start_as_current_span("bar"):
        print("baz")

Por fim, execute o no_configuration.py com a auto-instrumentação:

opentelemetry-instrument python no_configuration.py

O trecho resultante aparecerá na saída do Collector e será semelhante a este:

Resource labels:
     -> telemetry.sdk.language: STRING(python)
     -> telemetry.sdk.name: STRING(opentelemetry)
     -> telemetry.sdk.version: STRING(1.1.0)
     -> service.name: STRING(unknown_service)
InstrumentationLibrarySpans #0
InstrumentationLibrary __main__
Span #0
    Trace ID       : db3c99e5bfc50ef8be1773c3765e8845
    Parent ID      : 0677126a4d110cb8
    ID             : 3163b3022808ed1b
    Name           : bar
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2021-05-06 22:54:51.23063 +0000 UTC
    End time       : 2021-05-06 22:54:51.230684 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Span #1
    Trace ID       : db3c99e5bfc50ef8be1773c3765e8845
    Parent ID      :
    ID             : 0677126a4d110cb8
    Name           : foo
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2021-05-06 22:54:51.230549 +0000 UTC
    End time       : 2021-05-06 22:54:51.230706 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :