django 如何在python应用程序中为每种类型的Opentelemetry自动插装定义单独的服务名称?

vdzxcuhz  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(139)

我们目前在应用程序中使用Datadog进行监控和可观察性,并且我们已经集成了OpenTelemetry进行分布式跟踪。
我们遇到了一个主要问题
跨度间隔:目前,我们应用程序中的所有span都在一个服务下导出到Datadog。但是,我们希望根据使用的工具类型(例如Django,Elasticsearch,requests等)将它们分为不同的服务。
Manage.py

configure_opentelemetry()
    #Auto Instrumentation of Django, Psycopg2, Pymemcache, Elasticsearch, URLLib3, Requests
    DjangoInstrumentor().instrument(request_hook=fix_django_req)
    PymemcacheInstrumentor().instrument()
    RequestsInstrumentor().instrument()
    ElasticsearchInstrumentor().instrument()
    Psycopg2Instrumentor().instrument(enable_commenter=True, commenter_options={})
    URLLib3Instrumentor().instrument()

configure_opentelemetry方法

def configure_opentelemetry():
    
    otlp_exporter = OTLPSpanExporter(endpoint=os.getenv("OTEL_COLLECTOR_URL"), insecure=True)

    # Set the global TracerProvider with the OTLP exporter
    trace.set_tracer_provider(TracerProvider(resource=Resource.create({SERVICE_NAME: os.getenv("OTEL_SERVICE_NAME"), "env": os.getenv('OTEL_ENV')})))

    # Create a BatchSpanProcessor and add the exporter to it
    span_processor = BatchSpanProcessor(otlp_exporter)
    
    trace.get_tracer_provider().add_span_processor(span_processor)

    tracer = trace.get_tracer(__name__)

收集器配置:

receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  batch:
    # batch metrics before sending to reduce API usage
    send_batch_max_size: 100
    send_batch_size: 10
    timeout: 10s

  memory_limiter:
    # drop metrics if memory usage gets too high
    check_interval: 1s
    limit_percentage: 65
    spike_limit_percentage: 20

  resourcedetection:
    detectors: [env, gcp]
    timeout: 2s
    override: false

  transform:
    error_mode: ignore
    trace_statements:
      - context: span
        statements:
          - set(attributes["resource.name"], name)

exporters:
  datadog:
    api:
      site: ${DD_SITE}
      key: ${DD_API_KEY}

extensions:
  health_check:

service:

  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, batch, transform]
      exporters: [datadog]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, batch]
      exporters: [datadog]
      
  telemetry:
    logs:
      level: "debug"

救命啊!

nnsrf1az

nnsrf1az1#

OpenTelemetry SDK库被设计为在一个服务下使用,因此资源中存在一个service.name,它是不可变的,并且在您使用的所有仪器库中共享。通常,后端使用这个service.name来识别来自单个源的遥测,并且遥测可以在一个保护伞下关联在一起。
如果您的目标是唯一地识别哪些遥测来自哪些仪器,则service.name不适合执行此操作。理想情况下,您应该使用span属性指定哪个仪器创建了特定的span/遥测片段。Datadog应该有一种显示和过滤span属性的方法。您可以通过InstrumentationScope属性访问生成span的仪器的名称,并使用自定义span处理器将此字段作为span属性添加到您作为遥测数据段发送的每个span。

class CustomSpanProcessor(BatchSpanProcessor):
    def on_end(self, span: ReadableSpan) -> None:
         span.set_attribute("instrumentation_name", span.instrumentation_scope.name)
         super().on_end(span)

...
span_processor = CustomSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)

相关问题