Set up your telemetry target

Every episode ships telemetry over plain OTLP, so it works with whichever target you pick here. Set yours up once and the episodes adapt.

Ship telemetry toUse an OTLP endpoint you already have, from another vendor or your platform team. This one needs a one-time setup step: save your endpoint and the episodes fill it in.Set your endpointRun an OpenTelemetry Collector on your machine and watch telemetry arrive in its terminal. No account needed.More detailsShip straight to Bronto. You need an account and an API key with ingest permission.More details

Ship to Bronto

You need an account at bronto.io and an API key with ingest permission, created in the Bronto app under your organisation’s API keys. Export it in the shell you work from:

export BRONTO_API_KEY=<your key>

The episodes never put the key itself into a config file or command line. It always travels as the environment variable.

Ingest endpoints, by region:

Region Endpoint
EU https://ingestion.eu.bronto.io
US https://ingestion.us.bronto.io

Pick your region with the EU/US toggle next to the Bronto button; every Bronto code block follows it. Requests authenticate with the x-bronto-api-key header, and each episode shows the tool-native way to set it.

Two routing facts are worth knowing up front. Bronto turns service.name into the dataset name, which is why the episodes name services deliberately. And traces always land in the .traces collection while logs land in default, so one tool can legitimately show up in two places.

To confirm data arrived, run an episode and check for the new dataset in the Bronto app. Instrumentation fails silently in almost every tool we have covered, so treat a clean start as no evidence. Data in the dataset is the only confirmation.

Ship to a local Collector

The OpenTelemetry Collector is a small process that receives OTLP and forwards it wherever you tell it. Here it forwards to its own log output, so you can watch what a tool actually emits. Docker is the only requirement.

Save this as otelcol.yaml:

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
exporters:
  debug:
    verbosity: normal
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug]
    logs:
      receivers: [otlp]
      exporters: [debug]

Run it:

docker run --rm -p 4318:4318 \
  -v "$PWD/otelcol.yaml:/etc/otelcol-contrib/config.yaml" \
  otel/opentelemetry-collector-contrib:latest

Confirm it works with a hand-made span:

curl -X POST http://localhost:4318/v1/traces \
  -H 'Content-Type: application/json' \
  -d '{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"hello"}}]},"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"eee19b7ec3c1b174","name":"hello-span","kind":1,"startTimeUnixNano":"1756290000000000000","endTimeUnixNano":"1756290000120000000"}]}]}]}'

The Collector’s terminal prints the span summary a moment later. From here, every episode points its tool at http://localhost:4318, or at http://host.docker.internal:4318 when the tool itself runs in Docker on macOS or Windows.

Keep the data in a file instead of the terminal

Swap the debug exporter for the file exporter and everything lands on disk as OTLP JSON, one document per line:

exporters:
  file:
    path: /data/telemetry.jsonl

Replace debug with file in the pipelines, create a telemetry directory, and add -v "$PWD/telemetry:/data" to the docker run command. Two jq starting points for reading the result:

# every span name
jq -r '.resourceSpans[].scopeSpans[].spans[].name' telemetry/telemetry.jsonl

# span names with durations in ms
jq -r '.resourceSpans[].scopeSpans[].spans[]
  | "\((((.endTimeUnixNano|tonumber) - (.startTimeUnixNano|tonumber)) / 1000000))ms \(.name)"' \
  telemetry/telemetry.jsonl

For browsing traces in a UI without signing up for anything, otel-desktop-viewer is an open-source local viewer that accepts the same OTLP.

Bring your own endpoint

You may already have somewhere for telemetry to go: another vendor, a Collector your platform team runs, a gateway in your cluster. Enter its OTLP details here and every episode on this site rewrites its code blocks to use them.

Stored only in this browser's local storage. Nothing is sent anywhere.

Three things to check against your vendor’s OTLP documentation:

  • The endpoint must speak OTLP over HTTP with protobuf, the flavour every episode here uses. An endpoint documented only for gRPC (often port 4317) will not work as-is.
  • Enter the base URL without /v1/traces. Each episode adds or omits the path the way its tool expects.
  • The header name and value are whatever your vendor uses for authentication. Leave both empty if your endpoint is unauthenticated; the episodes then drop the header line, or use a dummy value where the tool requires one.

Until you save values here, the episodes show YOUR_OTLP_ENDPOINT, YOUR_AUTH_HEADER and YOUR_AUTH_VALUE as placeholders you can replace by hand.