Traces export is available on paid plans. Destinations are configured per environment and per signal, so traces
can go to Honeycomb while logs go elsewhere, and staging and production can point at different backends.
Set up a destination
1
Open the Telemetry settings
In your project Settings, open the Telemetry section, pick the environment to configure, and add a destination under Traces.
2
Enter the destination endpoint
Paste the full traces URL from your vendor, signal path included, for example
https://otlp.example.com/v1/traces.We push to this URL exactly as you enter it and never append a path. /v1/traces is only the OTLP default: some vendors serve a different path, or a different host per signal, so always copy the URL your vendor documents for traces.You can add more than one destination with Add destination, and the same spans go to all of them. Each destination is configured, tested and stopped on its own.3
Pick the protocol
HTTP/protobuf is the OTLP default. Switch to HTTP/JSON only if your backend asks for it.4
Add the authentication header
Authentication is a header you copy from your vendor, such as
Authorization or DD-API-KEY, with your API key as
the value. Mark it secret so it is stored write-only and never shown again.5
Save and send a test trace
Save the destination, then click Send a test trace. Alpic serializes and delivers a synthetic trace through the same protocol, headers and format as your real spans. A passing test proves your endpoint, credentials and protocol choice; real request spans appear once traffic flows. The verification outcomes are the same as for logs export.
The span hierarchy
Each MCP request becomes one trace:mcp.<method>: the root span covers the whole request as the client experienced it, from the moment it reached Alpic to the response. Its name is the stable dot-form of the MCP method (mcp.tools.call,mcp.initialize,mcp.ping). Its status carries the request outcome; failed requests are marked as errors witherror.typeand, for JSON-RPC errors,rpc.jsonrpc.error_code.alpic.server.startup: present only on the request that paid for your server process to start: process spawn, port readiness and the initial MCP handshake.alpic.server.execution: the round-trip through your handler. Everything your own code did nests here. It appears when your server reports its execution span for the request; apinganswered by Alpic, or a request whose reported spans did not arrive, exports the root span alone.- Your own instrumentation: events captured with the insights SDK become children of the execution span: an event with a
durationbecomes a child span named after your event, one without becomes a span event. Your error flag maps to the span status. - Outbound HTTP calls: completed calls your handler made become
CLIENTchildren of the execution span (see coverage below).
mcp.tools.call and carries mcp.method.name = "tools/call" and gen_ai.tool.name = "weather_forecast". Root spans also carry the session (mcp.session.id), conversation (gen_ai.conversation.id), resolved user (enduser.id), client name (alpic.mcp.client.name) and output token estimate (gen_ai.usage.output_tokens) when known. The resource’s service.name is the environment id, as for logs and metrics.
The gaps are meaningful: Lambda cold start and Alpic’s own proxying overhead remain uncovered stretches inside the root rather than appearing as customer-owned spans. Time not covered by alpic.server.startup or alpic.server.execution is time your code did not spend.
Outbound HTTP call coverage
Outbound auto-instrumentation covers Node servers using Streamable HTTP first; other runtimes and transports export the same request waterfall without outbound children. Capture observes Node’sdiagnostics_channel, so it never patches your HTTP clients, and covers fetch, Undici, node:http/node:https and clients built on them such as Axios. A call becomes a child span only once its full response body has completed or the call failed; calls still open when your handler returns produce no child.
Each child carries the method, a sanitized URL (scheme, host and path only) and the status code or a low-cardinality error type. Query strings, fragments, credentials, headers, bodies and error messages are never captured. Instrumentation failures only ever drop these child spans; they never affect your server or the MCP request.