Grafana Tempo is a high volume, minimal dependency distributed tracing backend.
This report summarizes scanner evidence for grafana/tempo, a Go project with 5,550 GitHub stars. SynthScan examined 475,742 lines of code across 1791 source files, recording 230 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 0.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 217 finding(s).
Are imports declared and package/API names verified? 5 finding(s).
Are wrappers, guards, and repeated structures necessary? 8 finding(s).
Which changes need focused human review? 230 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 230 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cmd/tempo-cli/cmd-view-heatmap.go | 81 | } | COMMENT |
| LOW | cmd/tempo-vulture/validation_test.go | 161 | } | COMMENT |
| LOW | cmd/tempo-vulture/validation_test.go | 181 | // }, | COMMENT |
| LOW | cmd/tempo-vulture/validation_test.go | 201 | // } | COMMENT |
| LOW | tools/chloggen/main.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/new_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/update.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/cmd_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/validate_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/root_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/new.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/update_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/validate.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/cmd/root.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/config/config.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/config/config.yaml | 1 | # The directory that stores individual changelog entries. | COMMENT |
| LOW | tools/chloggen/internal/config/config.yaml | 21 | # If 'change_logs' is specified in this file, and no value is specified for 'default_change_logs', | COMMENT |
| LOW | tools/chloggen/internal/config/config_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/chlog/entry_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/chlog/entry.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/chlog/summary.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | tools/chloggen/internal/chlog/summary_test.go | 1 | // Copyright The OpenTelemetry Authors | COMMENT |
| LOW | example/docker-compose/migrate-to-3/docker-compose.yaml | 1 | # Docker Compose example for the Tempo 2.x -> 3.0 microservices migration. | COMMENT |
| LOW | example/docker-compose/migrate-to-3/tempo-v3.yaml | 1 | # Tempo 3.0 microservices configuration. | COMMENT |
| LOW | integration/util/harness.go | 281 | COMMENT | |
| LOW | integration/limits/limits_test.go | 141 | payload func() []byte | COMMENT |
| LOW | integration/storage/backend_scheduler_test.go | 141 | // from jobs which have not been processed, we expect our outstanding blocks | COMMENT |
| LOW | integration/api/misc/management_test.go | 81 | // TODO: research this behavior | COMMENT |
| LOW | tempodb/tempodb.go | 761 | // window bounds which traces inside the block are candidates; the zero value scans the block in full. | COMMENT |
| LOW | tempodb/redaction.go | 1 | package tempodb | COMMENT |
| LOW | tempodb/tempodb_test.go | 521 | name: "exclude - duh", | COMMENT |
| LOW | tempodb/tempodb_metrics_test.go | 2701 | // 1. Sets up a test environment | COMMENT |
| LOW | tempodb/tempodb_search_test.go | 1881 | COMMENT | |
| LOW | tempodb/encoding/versioned.go | 21 | COMMENT | |
| LOW | tempodb/encoding/versioned.go | 41 | CreateBlock(ctx context.Context, cfg *common.BlockConfig, meta *backend.BlockMeta, i common.Iterator, r backend.Reader, | COMMENT |
| LOW | tempodb/encoding/common/interfaces.go | 121 | COMMENT | |
| LOW | tempodb/encoding/vparquet5/compactor.go | 21 | COMMENT | |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1561 | } | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1581 | // Event attribute iterator: key -------------------------------------------- ------------- | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1601 | // | | | | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1621 | // V V V | | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1641 | // valueN ----------------------------------- | | | | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1661 | // | List of Spansets | COMMENT |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 1761 | COMMENT | |
| LOW | tempodb/encoding/vparquet5/block_traceql.go | 2881 | } | COMMENT |
| LOW | tempodb/encoding/vparquet5/wal_block.go | 41 | // path + filename = folder to create | COMMENT |
| LOW | tempodb/encoding/vparquet4/create_test.go | 101 | // require.NoError(t, err) | COMMENT |
| LOW | tempodb/encoding/vparquet4/create_test.go | 121 | // } | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 1521 | // ------------- | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 1541 | // | ------------- | | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 1561 | // V V V V V V | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 1581 | // Scope column iterator N --------------------------------- | | | | | | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 1601 | // | | | COMMENT |
| LOW | tempodb/encoding/vparquet4/block_traceql.go | 2781 | } | COMMENT |
| LOW | tempodb/encoding/vparquet4/wal_block.go | 41 | // path + filename = folder to create | COMMENT |
| LOW | tempodb/backend/azure/azure_test.go | 101 | assert.Equal(t, tc.expectedHedgedRequests*2, atomic.LoadInt32(&count)) // *2 b/c reads execute a HEAD and GET | COMMENT |
| LOW | tempodb/backend/azure/azure_test.go | 121 | COMMENT | |
| LOW | tempodb/blocklist/poller_test.go | 861 | // TestPollerDoSpanParenting verifies that the per-tenant spans started inside | COMMENT |
| LOW | docs/sources/tempo/configuration/_index.md | 181 | COMMENT | |
| LOW | docs/sources/tempo/configuration/_index.md | 301 | kafka: | COMMENT |
| 129 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 21 | # ========================================================================= | COMMENT |
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 23 | # ========================================================================= | COMMENT |
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 88 | # ========================================================================= | COMMENT |
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 90 | # ========================================================================= | COMMENT |
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 158 | # ========================================================================= | COMMENT |
| MEDIUM | example/docker-compose/migrate-to-3/docker-compose.yaml | 160 | # ========================================================================= | COMMENT |
| MEDIUM | modules/generator/registry/cardinality.go | 15 | // ┌─────────────┐ | COMMENT |
| MEDIUM | modules/generator/registry/cardinality.go | 17 | // ┌─────┬─────┬─────┬─────┐ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .claude/skills/shared/release-notes-workflow.md | 38 | #### Step 1: Collect pending changelog entries | COMMENT |
| LOW | .claude/skills/shared/release-notes-workflow.md | 57 | #### Step 2: Identify known headline features | COMMENT |
| LOW | .claude/skills/shared/release-notes-workflow.md | 72 | #### Step 3: AI-assisted sorting | COMMENT |
| LOW⚡ | .claude/skills/shared/release-notes-workflow.md | 119 | #### Step 4: Human review | COMMENT |
| LOW⚡ | .claude/skills/shared/release-notes-workflow.md | 129 | #### Step 5: Coordinate with the engineering team | COMMENT |
| LOW⚡ | .claude/skills/shared/release-notes-workflow.md | 138 | #### Step 6: Produce the curated input, then stop | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 279 | // Step 1 - Setup manager with two forwarders for tenant and verify that both forwarders receive the trace. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 325 | // Step 2 - Add additional forwarder, simulate "tick" and verify that all three forwarders receive the trace. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 341 | // Step 1 - Setup manager with three forwarders for tenant and verify that all three forwarders receive the trace. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 387 | // Step 2 - Remove one forwarder, simulate "tick" and verify that remaining forwarders receive the trace. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 450 | // Step 1 - Setup manager with no tenants and verify that no batches are being forwarded | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 487 | // Step 2 - Add tenant to overrides config, simulate "tick", and verify that both forwarders receive the traces. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 506 | // Step 1 - Setup manager with two forwarders for tenant and verify that both forwarders receive the trace. | COMMENT |
| LOW | modules/distributor/forwarder/manager_test.go | 545 | // Step 2 - Remove forwarder from overrides config and verify that the traces are no longer forwarded. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | cmd/tempo/app/config.go | 202 | dcWarnings, dcErr := c.StorageConfig.Trace.Block.DedicatedColumns.Validate() | CODE |
| CRITICAL | pkg/ingest/config_sasl_test.go | 557 | require.Equal(t, map[string]string{"a": "b"}, cfg.SASL.Oauthbearer.Secret.Extensions.Read()) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | example/docker-compose/debug/docker-compose.yaml | 13 | - "2345:2345" # delve debug server | CODE |
| MEDIUM | integration/operations/config-tempo-query.yaml | 2 | backend: tempo:3200 # magically matches the name and port setup in the harness for a single binary deployment | CODE |
| MEDIUM | tempodb/encoding/vparquet5/block_traceql.go | 1334 | // no reason to try anything more nuanced than this. it will handle nearly all cases | COMMENT |
| MEDIUM | tempodb/encoding/vparquet4/block_traceql.go | 1253 | // no reason to try anything more nuanced than this. it will handle nearly all cases | COMMENT |
| MEDIUM | modules/generator/registry/histogram_test.go | 539 | // the registry must be robust to unsorted input. | COMMENT |
| MEDIUM | pkg/benchmark/compare/render/markdown/markdown_test.go | 26 | require.Contains(t, md, "#### harness.wallNs · p50 per execution\n\nChange from base.\n\n") | CODE |
| MEDIUM | pkg/api/http.go | 789 | qb.addParam("encoding", "none") // todo: remove. encoding was removed b/c its unused but we still add it here to make r | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .claude/skills/shared/handling-pr-content.md | 21 | **Placeholder catalog:** `<API_KEY>`, `<YOUR_TOKEN>`, `<PASSWORD>`, `user@example.com`, `https://<GRAFANA_INSTANCE>`, `< | CODE |
| HIGH | .claude/skills/docs-pr-write/evals/evals.json | 103 | "Credentials and internal URLs are replaced with descriptive placeholders (for example, <API_KEY>, <YOUR_TOKEN>, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/packaging/tempo-postinstall.sh | 14 | # Create the user | COMMENT |
| MEDIUM | tools/chloggen/internal/config/config.yaml | 10 | # This file is used as the input for individual changelog entries. | COMMENT |
| MEDIUM | .github/zizmor.yml | 4 | # This file is copied from: https://github.com/grafana/shared-workflows/blob/main/.github/zizmor.yml | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | integration/util/harness.go | 169 | // RunIntegrationTests sets up Tempo for integration tests as requested through the config and then calls the provided t | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tempodb/encoding/vparquet5/block_traceql_test.go | 80 | // It's worth noting that float64 can have a fractional part | COMMENT |
| MEDIUM | tempodb/encoding/vparquet4/block_traceql_test.go | 80 | // It's worth noting that float64 can have a fractional part | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | integration/util/harness.go | 290 | // Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …setup-tempo/deploy/kubernetes/operator/multitenancy.md | 86 | name: 'admin@example.com' | CODE |