Expert guidance for configuring and deploying the OpenTelemetry Collector. Use when setting up a Collector pipeline, configuring receivers, exporters, or processors, deploying a Collector to Kubernetes or Docker, or forwarding telemetry to Dash0. Triggers on requests involving collector, pipeline, OTLP receiver, exporter, or Dash0 collector setup.
95
93%
Does it follow best practices?
Impact
96%
1.39xAverage score across 12 eval scenarios
Advisory
Suggest reviewing before use
Reverse-DNS namespace prefix
46%
40%
No bare custom attribute names
90%
100%
http.route in metric dimensions
0%
30%
No url.path in metrics
100%
100%
No user/order IDs in metric dimensions
100%
100%
User identity on spans not resource
100%
100%
service.name on resource
100%
100%
deployment.environment.name used
0%
100%
Registry attributes not reinvented
50%
100%
High-cardinality values on spans
100%
100%
service.name as resource attr
100%
100%
service.version as resource attr
100%
100%
deployment.environment.name
100%
100%
k8s.pod.uid not k8s.pod.ip
100%
100%
service.name NOT on spans
100%
100%
k8s metadata NOT on spans
100%
100%
peer.service or server.address on client spans
100%
100%
Correct span kinds
100%
100%
No manual dash0.* attributes
100%
100%
service.instance.id set
0%
100%
UnixNano(Now()) for stale drop
25%
100%
Stale drop uses filter processor
100%
100%
Timestamp backfill observed_time
40%
100%
Timestamp backfill log.time
40%
100%
Enum constant STATUS_CODE_ERROR
0%
100%
IsMatch() for pattern filtering
100%
100%
filter processor for metric drops
100%
100%
nil for absence checks
0%
75%
error_mode set explicitly
100%
100%
error_mode ignore in production
100%
100%
where clause nil guards on attrs
0%
33%
Manual SERVER root span
100%
100%
CLIENT kind for outbound calls
60%
100%
AlwaysOn sampler preserved
100%
100%
ERROR only after retries exhausted
100%
90%
Retry attempts as span events
25%
100%
ERROR status message
100%
87%
No span.recordException
0%
100%
Batch span instead of per-item spans
100%
100%
Exception log trace context
25%
100%
forceFlush on shutdown
100%
100%
No more than 10 INTERNAL spans
100%
100%
Enrichment on all pipelines
100%
100%
k8s.pod.uid first in pod_association
100%
100%
Workload name and UID extracted
100%
100%
resourcedetection override false
100%
100%
resource processor for cluster attributes
55%
100%
Processor ordering: enrichment after memory_limiter
0%
100%
Processor ordering: resource after enrichment
100%
100%
k8sattributes passthrough: false
100%
100%
memory_limiter first
0%
100%
k8s.cluster.uid kube-system reference
100%
100%
No batch processor
0%
100%
http.request.method used
100%
100%
http.response.status_code used
100%
100%
url.full on client spans
100%
100%
url.path on server spans
100%
100%
url.full NOT on server spans
100%
100%
server.address used
100%
100%
url.scheme used
100%
100%
user_agent.original used
100%
100%
Metric name updated
100%
100%
Duration unit seconds
100%
100%
_OTHER normalization
100%
100%
Histogram for durations
100%
100%
Counter for monotonic counts
100%
100%
UpDownCounter for queue depth
100%
100%
UCUM units specified
100%
100%
No unit in metric name
100%
100%
No semconv namespace clash
100%
100%
No high-cardinality metric attributes
0%
100%
Bounded attribute values only
50%
100%
No duplicate auto-instrumented metric
100%
100%
Metric shape test
100%
100%
Consistent units across instances
100%
100%
Metric name not an attribute key
100%
100%
Correct SDK activation flag
75%
62%
OTEL_TRACES_EXPORTER set
37%
100%
gRPC protocol configured
100%
100%
4xx SERVER span status
0%
100%
5xx SERVER span status
87%
100%
No span.recordException
0%
100%
Exception log trace context
12%
100%
URL query param redaction
100%
100%
No PII or credentials in telemetry
100%
100%
Structured logging only
100%
100%
Trace-log correlation in handlers
25%
100%
forceFlush on crash handlers
100%
100%
memory_limiter first
100%
100%
No batch processor
0%
100%
sending_queue with file_storage
100%
100%
No hardcoded token
100%
100%
gzip compression
0%
100%
No debug exporter
100%
100%
Separate signal pipelines
100%
100%
health_check extension
100%
100%
0.0.0.0 bind address
100%
100%
memory_limiter sizing
100%
100%
file_storage extension declared
100%
100%
All declared components used
100%
100%
nil guard on redacted attrs
0%
100%
nil keyword not null
50%
100%
error_mode set explicitly
100%
100%
error_mode ignore in production
100%
100%
SHA256 hash for emails/IDs
0%
100%
replace_pattern for partial masking
90%
100%
filter processor for full drops
100%
100%
redaction after enrichment
80%
100%
delete_key for never-export attrs
50%
0%
set REDACTED for auth headers
12%
100%
debug exporter for validation
66%
100%
signaltometrics not spanmetrics
0%
100%
exponential_histogram used
0%
100%
Connector before sampling in pipeline
16%
33%
Metrics pipeline uses connector as receiver
30%
100%
Semconv metric names
0%
100%
Semconv conditions used
0%
100%
service.name in resource attributes
0%
100%
AlwaysOn sampler recommendation
100%
100%
Tail sampling policies include errors and latency
100%
100%
memory_limiter first
55%
100%
No batch processor
0%
100%
UUID pattern normalization
100%
100%
Numeric ID normalization
100%
100%
nil guard on url.path
0%
100%
nil guard on http.route
0%
100%
limit() for attribute count
100%
100%
truncate_all() for value length
100%
100%
resource processor for static attrs
0%
100%
transform to copy resource to span
100%
100%
error_mode set explicitly
100%
100%
error_mode ignore production
100%
100%
nil keyword not null
100%
100%
Table of Contents