Appearance
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/ingestThe 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=deltaOTEL_SERVICE_NAMEis the app's name across the console. Give every service a distinct name.%20is a space. The header value isBearer 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=noneLanguages
| Node.js | Express, Fastify, NestJS, Next.js and more, with zero code |
| Deno | Built into the runtime: one environment variable |
| Python | Django, Flask, FastAPI and more, with zero code |
| Go | net/http, gRPC and database drivers |
| PHP | Laravel, Symfony, Slim and more |
| Ruby | Rails, Sinatra and more |
| Collector | Existing 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_histogramsends 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.