Skip to content

OpenTelemetry ​

Our ingest speaks OTLP, OpenTelemetry's native protocol. Any OpenTelemetry SDK, agent or Collector can send traces, metrics and logs directly. No proprietary library, no extra container.

Prerequisites ​

Create an OpenTelemetry Stream and issue a key for the Stream. One Stream and one key take traces, metrics and logs. New to Streams? The Quick Start walks through Stream creation.

One Stream per app or environment

Keep everything from one app (or one environment) in one Stream, like Checkout or Production, with a separate key for each. A Stream has one retention for all three signals, so data with longer retention needs a separate Stream.

Endpoint ​

https://ws.latency.app/v1/ingest

The same endpoint the HTTP API uses: SDKs and Collectors pointed here add /v1/traces, /v1/metrics and /v1/logs automatically. The key decides which Stream receives the data. Our ingest accepts OTLP over HTTP, as protobuf or JSON, optionally compressed (gzip, deflate, br or zstd). gRPC isn't supported, so always set the protocol to http/protobuf.

Configuration ​

Every SDK reads the same environment variables. This is the whole setup for most languages:

bash
OTEL_SERVICE_NAME=checkout-api
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT=https://ws.latency.app/v1/ingest
OTEL_EXPORTER_OTLP_HEADERS=authorization=Bearer%20lit_XXXXXXXXXXX
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta
  • OTEL_SERVICE_NAME is the app's name across the console. Give every service a distinct name.
  • %20 is a space. The header value is Bearer lit_XXXXXXXXXXX, encoded.
  • The endpoint is the base. Don't append /v1/traces: the SDK does.

Sending only some signals ​

Turn off unused signals, so the SDK doesn't try to reach a default endpoint that doesn't exist:

bash
OTEL_METRICS_EXPORTER=none
OTEL_LOGS_EXPORTER=none

Languages ​

Node.jsExpress, Fastify, NestJS, Next.js and more, with zero code
DenoBuilt into the runtime: one environment variable
PythonDjango, Flask, FastAPI and more, with zero code
Gonet/http, gRPC and database drivers
PHPLaravel, Symfony, Slim and more
RubyRails, Sinatra and more
CollectorExisting Collector? Add our endpoint as an exporter

Metrics settings ​

Two optional settings get the most out of metrics:

  • OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta (included above) sends "how much since last time" instead of a running total. Totals from many servers then add up. Without the setting, our pipeline still derives deltas from the running totals, including restarts.
  • OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION=base2_exponential_bucket_histogram sends histograms in our storage format, for the sharpest percentiles. Regular bucketed histograms work too.

Not every SDK reads both. Where an SDK doesn't, the defaults work fine.

Metrics arrive once a minute

SDKs export metrics every 60 seconds by default. Set OTEL_METRIC_EXPORT_INTERVAL=10000 to send every 10 seconds instead.

Something not showing up? ​

See Troubleshooting.

© 2026 Latency Labs LLC