> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://mezmo.ferndocs.com/open-telemetry-traces-source/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/" headers: Authorization: "" ``` > 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.