This is documentation for the next version of Grafana Tempo documentation. For the latest stable release, go to the latest version.

Open source

Tempo Vulture

Tempo Vulture is a testing tool that validates the end-to-end functionality of Tempo by continuously writing traces and verifying they can be read back correctly. It is useful for monitoring data integrity in production environments and for post-deployment validation testing.

Overview

Tempo Vulture performs the following operations:

  • Write traces: Pushes test traces to Tempo using OTLP over gRPC
  • Read traces by ID: Queries Tempo to retrieve traces by their trace ID
  • Search traces: Uses TraceQL to search for traces by attributes
  • Metrics queries: Validates TraceQL metrics queries (enabled by default)

Tempo Vulture can run in two modes:

  • Continuous mode (default): Runs indefinitely, continuously writing and reading traces while exposing Prometheus metrics
  • Validation mode: Executes a fixed number of write/read cycles and exits with a status code indicating success or failure

Run Tempo Vulture

Tempo Vulture is available as a Docker image:

Bash
docker run grafana/tempo-vulture:latest [arguments...]

You can also build it from source:

Bash
make tempo-vulture
./tempo-vulture [arguments...]

Configuration flags

Configure Tempo Vulture using command-line flags.

Required flags

FlagDescriptionExample
--tempo-query-urlThe URL (scheme://hostname) at which to query Tempohttp://tempo:3200
--tempo-push-urlThe URL (scheme://hostname:port) at which to push traces to Tempohttp://tempo:4317

Optional flags

FlagDefaultDescription
--tempo-org-id""The org ID to use when querying Tempo (for multi-tenant deployments)
--tempo-push-tlsfalseWhether to use TLS when pushing spans to Tempo
--tempo-write-backoff-duration15sTime to pause between write operations
--tempo-long-write-backoff-duration1mTime to pause between long write operations
--tempo-read-backoff-duration30sTime to pause between read operations
--tempo-search-backoff-duration1mTime to pause between search operations. Set to 0s to disable search validation
--tempo-metrics-backoff-duration0sTime to pause between TraceQL metrics operations. Set to 0s to disable
--tempo-retention-duration336hThe block retention that Tempo is using
--tempo-recent-traces-backoff-duration14mCutoff between recent and old traces query checks
--tempo-query-livestorefalseWhether to query live stores
--prometheus-listen-address:80Address to listen on for Prometheus scrapes
--prometheus-path/metricsPath to publish Prometheus metrics

Validation mode flags

FlagDefaultDescription
--validation-modefalseRun in validation mode: execute a fixed number of cycles and exit
--validation-cycles3Number of write/read cycles to perform in validation mode
--validation-timeout5mMaximum time to run validation mode before timing out

Continuous mode

In continuous mode, Tempo Vulture runs indefinitely and exposes Prometheus metrics that can be used for monitoring and alerting.

Example

Bash
docker run grafana/tempo-vulture:latest \
  --tempo-query-url=http://tempo:3200 \
  --tempo-push-url=http://tempo:4317 \
  --tempo-org-id=my-tenant \
  --tempo-write-backoff-duration=15s \
  --tempo-read-backoff-duration=30s \
  --tempo-search-backoff-duration=60s

Prometheus metrics

Tempo Vulture exposes the following key metrics:

MetricTypeDescription
tempo_vulture_trace_totalCounterTotal number of trace operations performed
tempo_vulture_trace_error_totalCounterTotal number of trace errors by error type

Error types include:

  • incorrectresult: Retrieved trace doesn’t match the expected trace
  • incorrect_metrics_result: Metrics query returned unexpected results
  • missingspans: Trace has missing spans
  • notfound_byid: Trace not found by ID
  • notfound_search: Trace not found via search
  • notfound_traceql: Trace not found via TraceQL
  • notfound_metrics: Trace not found via metrics query
  • notfound_search_attribute: No searchable attribute found in trace
  • inaccurate_metrics: Metrics count doesn’t match actual span count
  • requestfailed: Request to Tempo failed

Alerting

You can configure alerts based on Tempo Vulture metrics. For example, the Tempo mixin includes a TempoVultureHighErrorRate alert that fires when the error rate exceeds a configurable threshold.

Validation mode

Note

Validation mode was added in Tempo 2.10.

Validation mode runs Tempo Vulture as a one-shot test that can be integrated into CI/CD pipelines for post-deployment validation. Instead of running continuously, it executes a fixed number of write/read cycles and exits with a status code indicating success or failure.

Warning

Running Vulture as a Deployment while in validation mode causes problems in Kubernetes. Because Deployments expect long-running processes, a container that finishes its task and exits triggers a CrashLoopBackOff (even with exit code 0). Run validation mode as a Job instead.

Exit codes

Exit codeMeaning
0All validations passed
1One or more validations failed, or configuration error

Environment variables

Validation mode requires authentication:

VariableDescription
TEMPO_ACCESS_POLICY_TOKENAccess policy token for authenticating with Tempo (required in validation mode)

Example

Bash
docker run \
  -e TEMPO_ACCESS_POLICY_TOKEN=your-token \
  grafana/tempo-vulture:latest \
  --tempo-query-url=https://tempo.example.com \
  --tempo-push-url=https://tempo.example.com:4317 \
  --tempo-org-id=my-tenant \
  --validation-mode \
  --validation-cycles=5 \
  --validation-timeout=10m

CI/CD pipeline integration

Validation mode is useful for:

  • Post-deployment testing: Verify Tempo is functioning correctly after a deployment
  • Smoke testing: Quick validation that write and read paths are working
  • Integration testing: Ensure end-to-end trace pipeline is operational

Example CI/CD usage in a GitHub Actions workflow:

YAML
- name: Validate Tempo deployment
  run: |
    docker run \
      -e TEMPO_ACCESS_POLICY_TOKEN=${{ secrets.TEMPO_TOKEN }} \
      grafana/tempo-vulture:latest \
      --tempo-query-url=${{ vars.TEMPO_URL }} \
      --tempo-push-url=${{ vars.TEMPO_PUSH_URL }} \
      --tempo-org-id=${{ vars.TEMPO_ORG_ID }} \
      --validation-mode \
      --validation-cycles=3 \
      --validation-timeout=5m

Validation process

In validation mode, Tempo Vulture performs these steps:

  1. For each cycle (default: 3):

    • Write a test trace to Tempo
    • Wait briefly for ingestion
    • Read the trace back by ID and verify it matches
  2. After all cycles complete:

    • Wait for traces to be searchable (if search is enabled)
    • Search for each trace using a random attribute
    • Verify all traces are found
  3. Exit with code 0 if all validations pass, or 1 if any fail

Docker Compose example

The Tempo repository includes Docker Compose examples that demonstrate how to run Tempo Vulture. Refer to the example configurations for complete setups.

Example from a Docker Compose file:

YAML
vulture:
  image: grafana/tempo-vulture:latest
  command:
    - "-tempo-push-url=http://distributor:4317"
    - "-tempo-query-url=http://query-frontend:3200"
    - "-tempo-org-id="