> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://mezmo.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://mezmo.ferndocs.com/_mcp/server.

# OpenTelemetry Traces

## Description

You can send your traces to a Mezmo Pipeline via any OTLP compliant sender.

> Mezmo currently requires that you use the HTTP transport for your payload, not the standard gRPC transport mechanism, to send in data via OTLP.

## Configuration

The OTLP Traces source provides a unique endpoint URL that uses **Bearer Token** authentication. You can obtain the unique endpoint and Bearer Token from the Mezmo pipeline app when you create a new OTLP Traces source.

### Configuration Options

| Option           |   | Description                                       |
| ---------------- | - | ------------------------------------------------- |
| `url / endpoint` |   | unique URL for your OTLP source                   |
| `token`          |   | token used for authorization for your OTLP source |

### OpenTelemetry Collector Configuration

To configure an OTel collector to export to Mezmo, you can add the following to your `exporters` section of your OTel Collector config file:

```yaml
exporters:
  otlphttp/mezmo-traces:
    endpoint: "https://pipeline.mezmo.com/v1/<YOUR ROUTE ID>"
    headers:
      Authorization: "<YOUR_PIPELINE_INGEST_KEY>"
```

> The endpoint in the exporters configuration must exactly match the URL provided by the OpenTelemetry Traces. You don't need to specify the `/v1/traces` path, which will otherwise by ignored by the Source.

## Data Structure

Once trace data ingested into a Mezmo pipeline each span will be converted into a Mezmo event and the data structure will differ from the Otel structure. Look at the example below to know what to expect and how to navigate your data.

```json
{
  "message": { // Moved from resource_spans.[].scope_spans.[].spans.[]
    "name": "string",
    "hostname": "string", // optional, scrapped from spans.[].attributes "host.name"
    "trace_id": "HEX string", // spans.[].trace_id converted from [u8; 16] to HEX string
    "trace_state": "string",
    "span_id": "HEX string", // spans.[].span_id converted from [u8; 8] to HEX string,
    "parent_span_id": "HEX string", // spans.[].span_id converted from [u8; 8] to HEX string,
    "start_timestamp": "unix timestamp", // spans.[].start_time_unix_nano
    "end_timestamp": "unix timestamp", // spans.[].end_time_unix_nano
    "kind": "number",
    "events": [
      {
      	"name": "string",
        "timestamp": "unix timestamp", // events.[].time_unix_nano
        "attributes": {
        	"key": "value"
        },
        "dropped_attributes_count": "number",
      }
    ],
    "dropped_events_count": "number",
    "links": [
      {
      	"trace_id": "HEX string", // links.[].trace_id converted from [u8; 16] to HEX string,
        "span_id": "HEX string", // links.[].span_id converted from [u8; 8] to HEX string,
        "trace_state": "string",
        "attributes": {
        	"key": "value"
        },
        "dropped_attributes_count": "number",
      }
    ],
    "dropped_links_count": "number"
  },
  "metadata": {
    "level": "string", // It always equals "trace"
    "span_uniq_id": "HEX string", // It is a unique id which groups traces event by a span within one otel source request
    "resource": { // Moved from resource_spans.[].resource
    	"attributes": {
    	"key": "value"
    	},
    	"dropped_attributes_count": "number",
    	"schema_url": "string"
    }
    "scope": { // Moved from resource_spans.[].scope_spans.[].scope
    	"name": "string",
			"version": "string",
			"attributes": {
    		"key": "value"
    	},
			"schema_url": "string"
  	}
    "attributes": { // Moved from resource_spans.[].scope_spans.[].spans.[].attributes
    	"key": "value"
    },
		"headers": { // Moved from an otel request headers
    	"key": "value"
    }
  }
}
```

> In order to send Otel traces data into the Otel Destination the structure must remain unchanged, otherwise the Otel Destination will either not recognize the event as a trace or failed to handle an event.> > Arbitrary fields are allowed.