OpenTelemetry Collector deployment, instrumentation (Java/Python/Node.js/.NET/Go), and OTTL pipeline transforms for Coralogix — coralogix exporter config, Helm chart selection, Kubernetes topology, ECS/EKS/GKE deployments, SDK setup, APM transactions, and OTTL cardinality/PII/routing.
92
96%
Does it follow best practices?
Impact
92%
1.10xAverage score across 127 eval scenarios
Advisory
Suggest reviewing before use
Coralogix APM's Service Catalog lists every service that emits traces and the operations each service performs. The catalog is built from Span Metrics (span-metrics.md) — every metric series corresponds to a unique combination of the labels listed below, and an operation only appears if the underlying span carries the right attributes.
| Field / attribute | Scope | Required for | Notes |
|---|---|---|---|
service.name | resource | service identity | Without it, telemetry arrives as unknown_service. |
Span kind (span.kind in UI / derived labels) | top-level span field | edge type | SERVER for inbound, CLIENT for outbound dependencies, PRODUCER/CONSUMER for messaging. Spans defaulting to INTERNAL do not contribute to the catalog. Do not set a span attribute named span.kind; set the SDK span kind (SpanKind.SERVER, SpanKind.CLIENT, etc.) or adjust the collector span kind field. |
http.route | span | HTTP server operation name | Without http.route, every URL path is a unique operation and the catalog explodes or collapses. |
db.operation | span | database operation name | See database-monitoring.md. |
rpc.method | span | RPC operation name | Used for gRPC and other RPC frameworks. |
messaging.operation | span | messaging operation name | E.g. publish, receive. |
peer.service (preferred) / server.address (fallback) | span | downstream service identity on Service Map edges | Use peer.service when the downstream is uninstrumented. |
service.name is a resource attribute — set it once at the SDK or via
the resource / resourcedetection processor at the collector. Setting it
on every span duplicates data and prevents the Coralogix exporter's
application_name_attributes chain (which reads resource scope only) from
seeing it.
span.kind is shorthand for the span's top-level kind field, not an
OpenTelemetry attribute in attributes[...]. If manual instrumentation or
an OTTL transform writes attributes["span.kind"] = "SERVER" while the real
span kind remains INTERNAL, Span Metrics and dependency views still use the
original kind and the operation can remain absent.
For HTTP spans, be explicit about direction:
url.full is for outbound HTTP client spans.url.path, url.scheme, and
templated http.route for low-cardinality operation grouping.url.full a Span
Metrics dimension; that turns raw paths and query strings into
high-cardinality metric labels.For stable/current/new OpenTelemetry HTTP server metric data points, use
http.request.method. Coralogix Span Metrics is a generated-metric surface
that may still need a pre-connector bridge to legacy http.method because
the connector dimension reads that source internally.
These are not strictly required, but several APM features depend on them:
| Attribute | Powers |
|---|---|
service.version | grouping APM metrics by version; deployment markers |
service.namespace | optional service grouping |
service.instance.id | single-writer identity (one row per process). Required when multiple OTel collectors / replicas emit the same service.name, otherwise their metric series collide. |
deployment.environment.name | environment filter in APM and Infrastructure Explorer ownership |
host.name | maps spans to hosts in Infrastructure Explorer |
k8s.pod.name, k8s.namespace.name, k8s.cluster.name, and the matching workload identity (k8s.deployment.name, k8s.statefulset.name, k8s.daemonset.name, k8s.job.name, k8s.cronjob.name, or k8s.replicaset.name) | maps spans to Kubernetes resources in Infrastructure Explorer (see infrastructure-explorer.md); use the owner-specific workload attribute, do not invent k8s.deployment.name for non-Deployment workloads |
cgx.transaction)APM Transactions group spans into business-meaningful units using two Coralogix-proprietary attributes:
cgx.transaction — transaction identifiercgx.transaction.root — root-of-transaction markerThese are populated automatically by CoralogixTransactionSampler in the
SDK sampler chain — do not set them by hand. Sampler wiring is owned by
the opentelemetry-instrumentation skill.
When Transactions are enabled, route-aware span identity needs to exist
before Coralogix transaction derivation. Some frameworks expose the final
route only after routing middleware runs, while the sampler or transaction
logic may have already derived cgx.transaction.
If APM operations or transaction names are wrong:
http.route is present on the server span.cgx.transaction; transaction fields may already have been derived in
the application.opentelemetry-instrumentation.APM Error Tracking and API Error Tracking need the same span identity as Service Catalog plus status dimensions that classify failures.
| Field | Scope / source | Why |
|---|---|---|
http.response.status_code | span attribute, then generated metric label | HTTP error grouping and API Error Tracking status filters |
rpc.grpc.status_code | span attribute, then generated metric label | gRPC error grouping |
status.code / span status | top-level span status / generated status label | generic span error state |
exception.type | span event | only a fallback signal when no response status was produced |
Some client/server frameworks fail before a response exists, so
http.response.status_code may be absent even though span status is ERROR
and exception events are present. A collector transform that maps selected
exception types to synthetic HTTP status codes is a product workaround, not
standard OpenTelemetry behavior. Use it only when the customer/product owner
accepts that mapping.
Old HTTP semantic-convention bridges such as http.status_code to
http.response.status_code should run before Span Metrics or Error
Tracking consumes spans. Generated RED metric status-code compatibility
belongs after spanmetrics; see spanmetrics.md.
If traces arrive but APM overview panels are empty, do not stop at
service.name.
Check:
service.name exists at resource scope.SERVER or CONSUMER span kind
when overview panels filter to inbound/consumer traffic.cgx.transaction labels.Processor placement, group-by-trace, and collector topology belong to
opentelemetry-collector. SDK auto-injection and OTEL_SERVICE_NAME
belong to opentelemetry-instrumentation.
Kubernetes auto-injection can produce traces without setting
service.name. Those traces may be searchable while APM service grouping is
empty or collapsed into unknown_service.
For auto-injected workloads, verify:
OTEL_SERVICE_NAME or OTEL_RESOURCE_ATTRIBUTES=service.name=... is set.cx.application.name / cx.subsystem.nameThe Coralogix exporter routes traces (and their derived Span Metrics) to a
Coralogix application + subsystem using a prioritised list of resource
attributes (application_name_attributes, subsystem_name_attributes).
The list is checked in order; the first attribute present on the resource
is used.
These are resource-scope only — record / span / data-point attributes
are invisible to the exporter. Common-mode failure: a customer sets
subsystem on the log record and is surprised when the exporter falls
back to the static name. Fix it by setting the value at resource scope
in the SDK / resource processor, or copy it up with OTTL.
Full mechanics — chart-preset defaults per distribution, the
aws.ecs.task.family ECS gotcha, and the NO_APP_NAME / NO_SUB_NAME
fallback — live in the core skill.
core skill — application_name_attributes mechanicsopentelemetry-instrumentation skill — CoralogixTransactionSampler.claude-plugin
.codex-plugin
.cursor-plugin
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
scenario-36
scenario-37
scenario-38
scenario-39
scenario-40
scenario-41
scenario-42
scenario-43
scenario-44
scenario-45
scenario-46
scenario-47
scenario-48
scenario-49
scenario-50
scenario-51
scenario-52
scenario-53
scenario-54
scenario-55
scenario-56
scenario-57
scenario-58
scenario-59
scenario-60
scenario-61
scenario-62
scenario-63
scenario-64
scenario-65
scenario-66
scenario-67
scenario-68
scenario-69
scenario-70
scenario-71
scenario-72
scenario-73
scenario-74
scenario-75
scenario-76
scenario-77
scenario-78
scenario-79
scenario-80
scenario-81
scenario-82
scenario-83
scenario-84
scenario-85
scenario-86
scenario-87
scenario-88
scenario-89
scenario-90
scenario-91
scenario-92
scenario-93
scenario-94
scenario-95
scenario-96
scenario-97
scenario-98
scenario-99
scenario-100
scenario-101
scenario-102
scenario-103
scenario-104
scenario-105
scenario-106
scenario-107
scenario-108
scenario-109
scenario-110
scenario-111
scenario-112
scenario-113
scenario-114
scenario-115
scenario-116
scenario-117
scenario-118
scenario-119
scenario-120
scenario-121
scenario-122
scenario-123
scenario-124
scenario-125
scenario-126
scenario-127
skills
opentelemetry
opentelemetry-collector
references
opentelemetry-instrumentation
opentelemetry-ottl