Telemetry
The telemetry profile runs the grafana/otel-lgtm image: an OpenTelemetry Collector, Prometheus, Tempo, Loki and Grafana in one container. OpenTelemetry is an open standard for metrics, traces and logs, and OTLP is its protocol for sending them. Tempo stores traces, Loki stores logs, and Grafana draws dashboards from all three stores.
This guide builds on Getting Started. Start the profile next to the profiles you want to watch:
| docs/snippets/telemetry/commands.sh:up | |
|---|---|
Prometheus reads metrics from the services, and the collector receives OTLP and passes each kind of data to its store:

| Endpoint | Address |
|---|---|
Grafana (user user, password password) |
http://127.0.0.1:3004 |
| Prometheus | http://127.0.0.1:19090 |
| OTLP through the collector | 127.0.0.1:4317 (gRPC), http://127.0.0.1:4318 (HTTP) |
Where the Metrics Come From
Prometheus scrapes the services that publish a metrics endpoint, by container name on the odctl network. Airflow pushes its metrics over OTLP to the collector, and the collector reads PostgreSQL and Valkey directly. A service that is not running is a target that is down.
Dashboards
Grafana has a dashboard per service in a folder named odctl. A dashboard fills in once its service's profile is up. The dashboards are JSON files in .odctl/grafana/dashboards/. Edit a file and run odctl restart telemetry to load it. Changes made in the Grafana UI are not kept.
For example, the PostgreSQL dashboard:

Send Your Own Metrics
Point an OpenTelemetry SDK at http://127.0.0.1:4318, its default HTTP port. The end-to-end tests post one metric with curl, which shows the path:
The collector answers {"partialSuccess":{}}. The collector passes metrics on in batches, so the query can come back empty for a few seconds. Then its result holds demo_total with the value "42". Prometheus also accepts OTLP metrics directly at http://127.0.0.1:19090/api/v1/otlp/v1/metrics.
From Another Container
Inside the odctl network, send OTLP to the collector at otel-lgtm:4317 (gRPC) or http://otel-lgtm:4318 (HTTP), as Airflow does. Prometheus is http://otel-lgtm:9090 and Grafana is http://otel-lgtm:3000.
Runnable Example
Save this file as example.sh and run it with bash example.sh in the folder that holds your .odctl workspace. It waits until Prometheus returns the metric:
It prints the collector's answer and then the query result, with demo_total and the value "42".