--- title: "Grafana Tempo" description: "Connect Grafana Tempo so OpenSRE can query distributed traces during investigations" --- OpenSRE uses Grafana Tempo to investigate trace-related alerts — searching spans by service, fetching full traces by ID, listing instrumented services, and filtering by error status or latency. This integration talks to Tempo **directly** via its HTTP API. It does not require a Grafana instance or datasource proxy. If you run the full Grafana stack, the [Grafana](/grafana) integration already surfaces Tempo through the datasource proxy — use this integration when you run Tempo standalone. ## Prerequisites - Grafana Tempo 1.4+ - Network access from the OpenSRE environment to your Tempo instance - Auth credentials only if your deployment requires them (many run without auth behind a gateway) ## Setup ### Option 1: Interactive CLI ```bash opensre integrations setup tempo ``` You will be prompted for the Tempo URL and optional auth. Leave auth fields blank if your Tempo runs without authentication. ### Option 2: Environment variables Add to your `.env`: ```bash TEMPO_URL=http://localhost:3200 TEMPO_API_KEY= # optional TEMPO_USERNAME= # optional (basic auth) TEMPO_PASSWORD= # optional (basic auth) TEMPO_ORG_ID= # optional (X-Scope-OrgID for multi-tenant) ``` | Variable | Default | Description | | --- | --- | --- | | `TEMPO_URL` | — | **Required.** Tempo HTTP API base URL | | `TEMPO_API_KEY` | _(empty)_ | Bearer token for auth | | `TEMPO_USERNAME` | _(empty)_ | Username for basic auth | | `TEMPO_PASSWORD` | _(empty)_ | Password for basic auth | | `TEMPO_ORG_ID` | _(empty)_ | Tenant ID sent as `X-Scope-OrgID` for multi-tenant deployments | ### Option 3: Persistent store Integrations are automatically persisted to `~/.opensre/integrations.json`: ```json { "version": 1, "integrations": [ { "id": "tempo-prod", "service": "tempo", "status": "active", "credentials": { "url": "http://localhost:3200", "api_key": "" } } ] } ``` ## Investigation tools OpenSRE exposes a single `query_tempo` tool with an `action` parameter: ### search Searches traces by service, span name, duration, and tags using TraceQL. Returns one summary row per trace. ```text query_tempo(action="search", service="checkout-service", min_duration_ms=500) query_tempo(action="search", tags={"http.status_code": "500"}) ``` | Parameter | Description | | --- | --- | | `service` | Filter by `resource.service.name` | | `span_name` | Filter by span name | | `min_duration_ms` | Minimum trace duration | | `max_duration_ms` | Maximum trace duration | | `tags` | Key/value span attributes | | `time_range_minutes` | Lookback window (default 60) | | `limit` | Max traces to return (default 20) | ### get_trace Fetches a full trace by ID and flattens its spans. ```text query_tempo(action="get_trace", trace_id="4f8c...e21") ``` ### list_services Lists all services registered in Tempo. ```text query_tempo(action="list_services") ``` ### list_span_names Lists all span names registered in Tempo. ```text query_tempo(action="list_span_names") ``` ## Verify ```bash opensre integrations verify tempo ``` Expected output: ``` Service: tempo Status: passed Detail: Connected to Grafana Tempo HTTP API (/api/search, /api/traces). ``` ## Troubleshooting | Symptom | Fix | | --- | --- | | **Connection refused** | Verify the URL and port. Default Tempo HTTP port is `3200`. | | **HTTP 401** | Set `TEMPO_API_KEY` or `TEMPO_USERNAME`/`TEMPO_PASSWORD` if your deployment requires auth. | | **HTTP 404 on verify** | Check your Tempo version — the `/api/search/tags` endpoint requires Tempo 1.4+. | | **No traces returned** | Confirm your services are sending traces to Tempo and the time range covers the period of interest. | | **Multi-tenant 400** | Set `TEMPO_ORG_ID` to the correct tenant ID. | ## Security best practices - Use a **read-only** token or service account if your Tempo deployment supports auth. - Store credentials in `.env`, never in code. - Restrict network access to Tempo — OpenSRE only needs the HTTP API port (`3200` by default).