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