From dash0-agent-skills
Helps write and debug OpenTelemetry Transformation Language (OTTL) expressions for Collector components like processors, connectors, receivers, and exporters. Covers syntax, contexts, functions, error handling, and validation workflows.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dash0-agent-skills:otel-ottlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
OTTL is not limited to the transform and filter processors.
OTTL is not limited to the transform and filter processors. Processors (transform, filter, attributes, span, tailsampling, cumulativetodelta, logdedup, lookup), connectors (routing, count, sum, signaltometrics), and the hostmetrics receiver all accept OTTL expressions. See components for the full list with use cases.
Navigate telemetry data using dot notation:
span.name
span.attributes["http.method"]
resource.attributes["service.name"]
Contexts (first path segment): resource, scope, span, spanevent, metric, datapoint, log.
Use int64 constants for enumeration fields:
span.status.code == STATUS_CODE_ERROR
span.kind == SPAN_KIND_SERVER
Assignment: = — Comparison: ==, !=, >, <, >=, <= — Logical: and, or, not
Converters (uppercase, return values):
ToUpperCase(span.attributes["http.request.method"])
Substring(log.body.string, 0, 1024)
Concat(["prefix", span.attributes["request.id"]], "-")
IsMatch(metric.name, "^k8s\\..*$")
Editors (lowercase, modify data in-place):
set(span.attributes["region"], "us-east-1")
delete_key(resource.attributes, "internal.key")
limit(log.attributes, 10, [])
See function-reference for the full list of editors and converters.
Use where to apply transformations conditionally:
span.attributes["db.statement"] = "REDACTED" where resource.attributes["service.name"] == "accounting"
Use nil for absence checking (not null):
resource.attributes["service.name"] != nil
otelcol validate --config=config.yaml to catch compilation errors before starting the Collector.debug exporter and inspect the output:exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
processors: [transform, batch]
exporters: [debug] # swap in production exporter once validated
error_mode: ignore in production — see Error handling.debug with the production exporter.Occur during processor initialization and prevent Collector startup:
Occur during telemetry processing:
Always set error_mode explicitly.
| Mode | Behavior | When to use |
|---|---|---|
propagate (default) | Stops processing current item | Development and strict environments where you want to catch every error |
ignore | Logs error, continues processing | Production — set this unless you have a specific reason not to |
silent | Ignores errors without logging | High-volume pipelines with known-safe transforms where error logs are noise |
processors:
transform:
error_mode: ignore
trace_statements:
- context: span
statements:
- set(span.attributes["parsed"], ParseJSON(span.attributes["json_body"]))
Use where clauses to skip items early.
# BAD — runs replace_pattern on every span
replace_pattern(span.attributes["url.path"], "/\\d+", "/{id}")
# GOOD — skips spans that lack the attribute
replace_pattern(span.attributes["url.path"], "/\\d+", "/{id}") where span.attributes["url.path"] != nil
npx claudepluginhub dash0hq/claude-marketplace --plugin dash0-agent-skillsExpert for writing and debugging OpenTelemetry Transformation Language (OTTL) in Collector configs. Use with transform, filter, routing, tail_sampling processors.
Guides OpenTelemetry SDK setup, custom instrumentation (spans, attributes, events, links), sampling, OTel Collector config, and OTLP export to Honeycomb for Go, Python, Node.js, Java, Ruby, .NET, Rust.
Instrument apps with OpenTelemetry and send telemetry to Grafana Cloud via OTLP. Covers SDK setup, Alloy collector, sampling, and migration from other observability tools.