otel-ottl

OpenTelemetry Transformation Language (OTTL) expert. Use when writing or debugging OTTL expressions for any OpenTelemetry Collector component that supports OTTL (processors, connectors, receivers, exporters). Triggers on tasks involving telemetry transformation, filtering, attribute manipulation, data redaction, sampling policies, routing, or Collector configuration. Covers syntax, contexts, functions, error handling, and performance.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "otel-ottl" with this command: npx skills add dash0hq/agent-skills/dash0hq-agent-skills-otel-ottl

OpenTelemetry Transformation Language (OTTL)

Use OTTL to transform, filter, and manipulate telemetry data inside the OpenTelemetry Collector — without changing application code.

Components that use OTTL

OTTL is not limited to the transform and filter processors. The following Collector components accept OTTL expressions in their configuration.

Processors

ComponentUse case
transformModify, enrich, or redact telemetry (set attributes, rename fields, truncate values)
filterDrop telemetry entirely (discard metrics by name, drop spans by status, remove noisy logs)
attributesInsert, update, delete, or hash resource and record attributes
spanRename spans and set span status based on attribute values
tailsamplingSample traces based on OTTL conditions (e.g., keep error traces, drop health checks)
cumulativetodeltaConvert cumulative metrics to delta temporality with OTTL-based metric selection
logdedupDeduplicate log records using OTTL conditions
lookupEnrich telemetry by looking up values from external tables using OTTL expressions

Connectors

ComponentUse case
routingRoute telemetry to different pipelines based on OTTL conditions
countCount spans, metrics, or logs matching OTTL conditions and emit as metrics
sumSum numeric values from telemetry matching OTTL conditions and emit as metrics
signaltometricsGenerate metrics from spans or logs using OTTL expressions for attribute extraction

Receivers

ComponentUse case
hostmetricsFilter host metrics at collection time using OTTL conditions

OTTL syntax

Path expressions

Navigate telemetry data using dot notation:

span.name
span.attributes["http.method"]
resource.attributes["service.name"]

Contexts (first path segment) map to OpenTelemetry signal structures:

  • resource - Resource-level attributes
  • scope - Instrumentation scope
  • span - Span data (traces)
  • spanevent - Span events
  • metric - Metric metadata
  • datapoint - Metric data points
  • log - Log records

Enumerations

Several fields accept int64 values exposed as global constants:

span.status.code == STATUS_CODE_ERROR
span.kind == SPAN_KIND_SERVER

Operators

CategoryOperators
Assignment=
Comparison==, !=, >, <, >=, <=
Logicaland, or, not

Functions

Converters (uppercase, pure functions that 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, functions with side-effects that modify data):

set(span.attributes["region"], "us-east-1")
delete_key(resource.attributes, "internal.key")
limit(log.attributes, 10, [])

Conditional statements

The where clause applies transformations conditionally:

span.attributes["db.statement"] = "REDACTED" where resource.attributes["service.name"] == "accounting"

Nil checks

OTTL uses nil for absence checking (not null):

resource.attributes["service.name"] != nil

Common patterns

Set attributes

set(resource.attributes["k8s.cluster.name"], "prod-aws-us-west-2")

Redact sensitive data

set(span.attributes["http.request.header.authorization"], "REDACTED") where span.attributes["http.request.header.authorization"] != nil

Drop telemetry by pattern

In a filter processor, matching expressions cause data to be dropped:

IsMatch(metric.name, "^k8s\\.replicaset\\..*$")

Drop stale data

time_unix_nano < UnixNano(Now()) - 21600000000000

Backfill missing timestamps

processors:
  transform:
    log_statements:
      - context: log
        statements:
          - set(log.observed_time, Now()) where log.observed_time_unix_nano == 0
          - set(log.time, log.observed_time) where log.time_unix_nano == 0

Filter processor example

processors:
  filter:
    metrics:
      datapoint:
        - 'IsMatch(ConvertCase(String(metric.name), "lower"), "^k8s\\.replicaset\\.")'

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [filter, batch]
      exporters: [debug]

Transform processor example

processors:
  transform:
    trace_statements:
      - context: span
        statements:
          - set(span.status.code, STATUS_CODE_ERROR) where span.attributes["http.response.status_code"] >= 500
          - set(span.attributes["env"], "production") where resource.attributes["deployment.environment"] == "prod"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [transform, batch]
      exporters: [debug]

Defensive nil checks

Always check for nil before operating on optional attributes:

resource.attributes["service.namespace"] != nil
and
IsMatch(ConvertCase(String(resource.attributes["service.namespace"]), "lower"), "^platform.*$")

Error handling

Compilation errors

Occur during processor initialization and prevent Collector startup:

  • Invalid syntax (missing quotes)
  • Unknown functions
  • Invalid path expressions
  • Type mismatches

Runtime errors

Occur during telemetry processing:

  • Accessing non-existent attributes
  • Type conversion failures
  • Function execution errors

Error mode configuration

Always set error_mode explicitly. The default (propagate) stops processing the current item on any error, which can silently drop telemetry in production.

ModeBehaviorWhen to use
propagate (default)Stops processing current itemDevelopment and strict environments where you want to catch every error
ignoreLogs error, continues processingProduction — set this unless you have a specific reason not to
silentIgnores errors without loggingHigh-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"]))

Performance

OTTL statements compile once at startup and execute as optimized function chains at runtime. There is no need to optimize for compilation speed — focus on reducing the number of statements that evaluate per telemetry item. Use where clauses to skip items early rather than applying unconditional transforms.

Function reference

Editors

Editors modify telemetry data in-place. They are lowercase.

FunctionSignatureDescription
appendappend(target, Optional[value], Optional[values])Appends single or multiple values to a target field, converting scalars to arrays if needed
delete_keydelete_key(target, key)Removes a key from a map
delete_matching_keysdelete_matching_keys(target, pattern)Removes all keys matching a regex pattern
flattenflatten(target, Optional[prefix], Optional[depth])Flattens nested maps to the root level
keep_keyskeep_keys(target, keys[])Removes all keys NOT in the supplied list
keep_matching_keyskeep_matching_keys(target, pattern)Keeps only keys matching a regex pattern
limitlimit(target, limit, priority_keys[])Reduces map size to not exceed limit, preserving priority keys
merge_mapsmerge_maps(target, source, strategy)Merges source into target (strategy: insert, update, upsert)
replace_all_matchesreplace_all_matches(target, pattern, replacement)Replaces matching string values using glob patterns
replace_all_patternsreplace_all_patterns(target, mode, regex, replacement)Replaces segments matching regex (mode: key or value)
replace_matchreplace_match(target, pattern, replacement)Replaces entire string if it matches a glob pattern
replace_patternreplace_pattern(target, regex, replacement)Replaces string sections matching a regex
setset(target, value)Sets a telemetry field to a value
truncate_alltruncate_all(target, limit)Truncates all string values in a map to a max length

Converters: type checking

FunctionSignatureDescription
IsBoolIsBool(value)Returns true if value is boolean
IsDoubleIsDouble(value)Returns true if value is float64
IsIntIsInt(value)Returns true if value is int64
IsMapIsMap(value)Returns true if value is a map
IsListIsList(value)Returns true if value is a list
IsMatchIsMatch(target, pattern)Returns true if target matches regex pattern
IsRootSpanIsRootSpan()Returns true if span has no parent
IsStringIsString(value)Returns true if value is a string

Converters: type conversion

FunctionSignatureDescription
BoolBool(value)Converts value to boolean
DoubleDouble(value)Converts value to float64
IntInt(value)Converts value to int64
StringString(value)Converts value to string

Converters: string manipulation

FunctionSignatureDescription
ConcatConcat(values[], delimiter)Concatenates values with a delimiter
ConvertCaseConvertCase(target, toCase)Converts to lower, upper, snake, or camel
HasPrefixHasPrefix(value, prefix)Returns true if value starts with prefix
HasSuffixHasSuffix(value, suffix)Returns true if value ends with suffix
IndexIndex(target, value)Returns first index of value in target, or -1
SplitSplit(target, delimiter)Splits string into array by delimiter
SubstringSubstring(target, start, length)Extracts substring from start position
ToCamelCaseToCamelCase(target)Converts to CamelCase
ToLowerCaseToLowerCase(target)Converts to lowercase
ToSnakeCaseToSnakeCase(target)Converts to snake_case
ToUpperCaseToUpperCase(target)Converts to UPPERCASE
TrimTrim(target, Optional[char])Removes leading/trailing characters
TrimPrefixTrimPrefix(value, prefix)Removes leading prefix
TrimSuffixTrimSuffix(value, suffix)Removes trailing suffix

Converters: Hashing

FunctionSignatureDescription
FNVFNV(value)Returns FNV hash as int64
MD5MD5(value)Returns MD5 hash as hex string
Murmur3HashMurmur3Hash(target)Returns 32-bit Murmur3 hash as hex string
Murmur3Hash128Murmur3Hash128(target)Returns 128-bit Murmur3 hash as hex string
SHA1SHA1(value)Returns SHA1 hash as hex string
SHA256SHA256(value)Returns SHA256 hash as hex string
SHA512SHA512(value)Returns SHA512 hash as hex string

Converters: encoding and decoding

FunctionSignatureDescription
DecodeDecode(value, encoding)Decodes string (base64, base64-raw, base64-url, IANA encodings)
HexHex(value)Returns hexadecimal representation

Converters: Parsing

FunctionSignatureDescription
ExtractPatternsExtractPatterns(target, pattern)Extracts named regex capture groups into a map
ExtractGrokPatternsExtractGrokPatterns(target, pattern, Optional[namedOnly], Optional[defs])Parses unstructured data using grok patterns
ParseCSVParseCSV(target, headers, Optional[delimiter], Optional[headerDelimiter], Optional[mode])Parses CSV string to map
ParseIntParseInt(target, base)Parses string as integer in given base (2-36)
ParseJSONParseJSON(target)Parses JSON string to map or slice
ParseKeyValueParseKeyValue(target, Optional[delimiter], Optional[pair_delimiter])Parses key-value string to map
ParseSeverityParseSeverity(target, severityMapping)Maps log level value to severity string
ParseSimplifiedXMLParseSimplifiedXML(target)Parses XML string to map (ignores attributes)
ParseXMLParseXML(target)Parses XML string to map (preserves structure)

Converters: Time and Date

FunctionSignatureDescription
DayDay(value)Returns day component from time
DurationDuration(duration)Parses duration string (e.g. "3s", "333ms")
FormatTimeFormatTime(time, format)Formats time to string using Go layout
HourHour(value)Returns hour component from time
HoursHours(value)Returns duration as floating-point hours
MinuteMinute(value)Returns minute component from time
MinutesMinutes(value)Returns duration as floating-point minutes
MonthMonth(value)Returns month component from time
NanosecondNanosecond(value)Returns nanosecond component from time
NanosecondsNanoseconds(value)Returns duration as nanosecond count
NowNow()Returns current time
SecondSecond(value)Returns second component from time
SecondsSeconds(value)Returns duration as floating-point seconds
TimeTime(target, format, Optional[location], Optional[locale])Parses string to time
TruncateTimeTruncateTime(time, duration)Truncates time to multiple of duration
UnixUnix(seconds, Optional[nanoseconds])Creates time from Unix epoch
UnixMicroUnixMicro(value)Returns time as microseconds since epoch
UnixMilliUnixMilli(value)Returns time as milliseconds since epoch
UnixNanoUnixNano(value)Returns time as nanoseconds since epoch
UnixSecondsUnixSeconds(value)Returns time as seconds since epoch
WeekdayWeekday(value)Returns day of week from time
YearYear(value)Returns year component from time

Converters: Collections

FunctionSignatureDescription
ContainsValueContainsValue(target, item)Returns true if item exists in slice
FormatFormat(formatString, args[])Formats string using fmt.Sprintf syntax
KeysKeys(target)Returns all keys from a map
LenLen(target)Returns length of string, slice, or map
SliceToMapSliceToMap(target, Optional[keyPath], Optional[valuePath])Converts slice of objects to map
SortSort(target, Optional[order])Sorts array (asc or desc)
ToKeyValueStringToKeyValueString(target, Optional[delim], Optional[pairDelim], Optional[sort])Converts map to key-value string
ValuesValues(target)Returns all values from a map

Converters: IDs and Encoding

FunctionSignatureDescription
ProfileIDProfileID(bytes|string)Creates ProfileID from 16 bytes or 32 hex chars
SpanIDSpanID(bytes|string)Creates SpanID from 8 bytes or 16 hex chars
TraceIDTraceID(bytes|string)Creates TraceID from 16 bytes or 32 hex chars
UUIDUUID()Generates a new UUID
UUIDv7UUIDv7()Generates a new UUIDv7

Converters: XML

FunctionSignatureDescription
ConvertAttributesToElementsXMLConvertAttributesToElementsXML(target, Optional[xpath])Converts XML attributes to child elements
ConvertTextToElementsXMLConvertTextToElementsXML(target, Optional[xpath], Optional[name])Wraps XML text content in elements
GetXMLGetXML(target, xpath)Returns XML elements matching XPath
InsertXMLInsertXML(target, xpath, value)Inserts XML at XPath locations
RemoveXMLRemoveXML(target, xpath)Removes XML elements matching XPath

Converters: Miscellaneous

FunctionSignatureDescription
CommunityIDCommunityID(srcIP, srcPort, dstIP, dstPort, Optional[proto], Optional[seed])Generates network flow hash
IsValidLuhnIsValidLuhn(value)Returns true if value passes Luhn check
LogLog(value)Returns natural logarithm as float64
URLURL(url_string)Parses URL into components (scheme, host, path, etc.)
UserAgentUserAgent(value)Parses user-agent string into map (name, version, OS)

References

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Automation

otel-instrumentation

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

otel-semantic-conventions

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

otel-collector

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

vercel-composition-patterns

React composition patterns that scale. Use when refactoring components with boolean prop proliferation, building flexible component libraries, or designing reusable APIs. Triggers on tasks involving compound components, render props, context providers, or component architecture. Includes React 19 API changes.

Repository Source
86.4K23Kvercel