A. Executive Summary
| Field |
Value |
| Overall Status |
✅ PASS (mid-run snapshot) |
| Validation Time |
2026-06-05T05:44:37Z – 05:45:36Z |
| Run ID |
26997807167 |
| Workflow |
otlp-data-quality-validator |
| JSONL Mirror |
/tmp/gh-aw/otel.jsonl (3,315 bytes, 1 span) |
| Export Errors |
0 |
| Main Risk |
Conclusion and agent spans not yet written (workflow in-progress — expected) |
| Most Likely Root Cause |
None — no anomalies found in available data |
The local JSONL mirror is healthy. The setup span passes all format, attribute, and hierarchy checks. Conclusion and agent spans are absent because the workflow is still executing — this is spec-conformant per §7.1 (mirrors are written lazily as spans complete). No export errors were recorded.
B. Trace Completeness
| Check |
Result |
| JSONL mirror path (spec §7.1) |
✅ /tmp/gh-aw/otel.jsonl |
| Spans in mirror |
1 (gh-aw.agent.setup) |
| Unique trace IDs |
1 — 5cf4b086993d63ea6cbb401f3a705c22 |
Unique span identities (traceId+spanId) |
1 |
| Duplicate spans |
0 |
| Conclusion span |
⏳ Not yet written (run in-progress) |
| Agent span |
⏳ Not yet written (run in-progress) |
| Backend visibility |
⚠️ Unconfirmable — no MCP backend tools available |
| Confidence |
High for emitted data; N/A for backend |
Only the setup span is expected in the mirror at agent execution time. No data loss is indicated.
C. Span Hierarchy Validation
| Check |
Spec Ref |
Result |
Setup span has parentSpanId |
§9.3 |
✅ bdfb79458e813aab |
| Setup spans share global parent |
§9.3 |
✅ (single job in this run) |
| Conclusion spans parent under setup |
§9.3 |
⏳ Not yet emitted |
| Agent span parents under conclusion |
§9.3 |
⏳ Not yet emitted |
Span name matches gh-aw.<job>.<op> |
§9.2 |
✅ gh-aw.agent.setup |
Setup span kind = INTERNAL (1) |
§9.4 |
✅ kind=1 |
| Span status OK (code=1) |
§9.5 |
✅ status.code=1 |
startTimeUnixNano < endTimeUnixNano |
§9 |
✅ |
| Timestamps in expected window |
§9 |
✅ 2026-06-05T05:44:37–39Z (duration: 1613ms) |
| Far-future or far-past timestamps |
§9 |
✅ None |
D. Attribute Contract Validation
Setup Span (§10.1) — gh-aw.agent.setup
| Required Attribute |
Status |
Value |
gh-aw.job.name |
✅ Present |
agent |
gh-aw.workflow.name |
✅ Present |
OTLP Data Quality Validator |
gh-aw.run.id |
✅ Present |
26997807167 |
gh-aw.run.attempt |
✅ Present |
1 |
gh-aw.run.actor |
✅ Present |
mnkiefer |
gh-aw.repository |
✅ Present |
github/gh-aw |
gh-aw.staged |
✅ Present |
false |
Conditional attributes also present: gen_ai.system, gh-aw.engine.id, gh-aw.event_name, gh-aw.episode.id, gh-aw.episode.kind, gh-aw.hop.id, gh-aw.workflow_call.id.
Conclusion Span (§10.2) — not yet emitted
Cannot validate. Expected attributes: gh-aw.run.status, gh-aw.error_count, gh-aw.warning_count, gh-aw.action_minutes, gh-aw.output.item_count, gh-aw.otlp.export_errors.
Agent Span (§10.3) — not yet emitted
Cannot validate GenAI semantic convention attributes.
Resource Attributes (§11.1)
| Required Attribute |
Status |
Value |
service.name |
✅ Present |
gh-aw.otlp-data-quality-validator |
service.version |
✅ Present |
1.0.57 |
github.repository |
✅ Present |
github/gh-aw |
github.run_id |
✅ Present |
26997807167 |
github.run_attempt |
✅ Present |
1 |
github.actions.run_url |
✅ Present |
https://github.com/github/gh-aw/actions/runs/26997807167 |
Conditional attributes also present: github.event_name, github.ref, github.ref_name, github.sha, github.job, github.workflow_ref, github.actor_id, runner.os, runner.arch, runner.name, runner.environment, gh-aw.awf.version, deployment.environment.
Minor note: gh-aw.awmg.version is empty in aw_info.json (optional per §11.2 — "when available").
Instrumentation Scope (§11.3)
| Field |
Status |
Value |
scope.name |
✅ Correct |
gh-aw |
scope.version |
✅ Correct |
1.0.57 |
| scope.version == service.version |
✅ Match |
both 1.0.57 |
E. Export and Fan-Out Health
| Check |
Status |
Detail |
| JSONL mirror write (§7.1) |
✅ Success |
/tmp/gh-aw/otel.jsonl, 3315 bytes, 1 line |
| Export error count |
✅ 0 |
No otlp-export-errors.jsonl or .count file |
OTEL_EXPORTER_OTLP_ENDPOINT |
✅ Set |
(value redacted) |
GH_AW_OTLP_ENDPOINTS |
✅ Set |
Multi-endpoint confirmed |
GH_AW_OTLP_ALL_HEADERS |
✅ Set |
Implies ≥2 endpoints with headers |
GITHUB_AW_OTEL_TRACE_ID |
✅ Set |
Trace context propagated |
GITHUB_AW_OTEL_PARENT_SPAN_ID |
✅ Set |
Parent span propagated |
| Configured backends |
i️ Inferred |
*.grafana.net, *.sentry.io (from network allowlist) |
| Backend export success |
⚠️ Unconfirmable |
No MCP backend tools available |
| Fan-out independence (§6.1, §6.6) |
✅ Structurally configured |
No per-endpoint failures recorded |
F. Root-Cause Hypothesis
No confirmed issues. Possible follow-on gaps to monitor:
-
Backend visibility unconfirmed — MCP OTLP backend tools are not available in this execution context. Grafana Tempo and Sentry endpoint success is inferred from absence of export errors but not directly verified.
- Evidence: No
otlp-export-errors.jsonl, all env vars set correctly.
- Alternative: Export could have silently failed after the mirror write if
send_otlp_span.cjs encountered a network error after writing JSONL.
-
Conclusion/agent span attribute completeness — Cannot be validated until the workflow completes. If gh-aw.otlp.export_errors or gh-aw.run.status are missing on the conclusion span, that would be a §10.2 violation.
-
gh-aw.awmg.version absent — The awmg_version field in aw_info.json is empty. This is a conditional attribute (§11.2), so no violation, but may indicate AWMG is not deployed in this environment.
G. Recommended Fixes (Prioritized)
No current fixes required. The following are monitoring recommendations:
-
(P2) Verify backend visibility post-run — After the workflow completes, query Grafana Tempo and Sentry for trace 5cf4b086993d63ea6cbb401f3a705c22 to confirm both endpoints received spans. Command:
jq -r '.resourceSpans[].scopeSpans[].spans[].traceId' /tmp/gh-aw/otel.jsonl | head -1
# Then search that ID in Grafana Tempo and Sentry UI
-
(P3) Validate conclusion span post-run — Re-run this validation after the conclusion step writes to confirm §10.2 attribute contract compliance:
jq -c '.resourceSpans[].scopeSpans[].spans[] | select(.name | endswith(".conclusion")) | {name, attrs: [.attributes[]? | {(.key): .value}] | add}' /tmp/gh-aw/otel.jsonl
-
(P3) Validate agent span GenAI attributes post-run — Check §10.3 compliance:
jq -c '.resourceSpans[].scopeSpans[].spans[] | select(.name | endswith(".agent")) | .attributes | map({(.key): .value}) | add | {gen_ai_system: .["gen_ai.system"], model: .["gen_ai.request.model"], op: .["gen_ai.operation.name"], input_tokens: .["gen_ai.usage.input_tokens"], output_tokens: .["gen_ai.usage.output_tokens"]}' /tmp/gh-aw/otel.jsonl
-
(P4) Enable export error monitoring — The absence of otlp-export-errors.count means either no errors occurred or the file is not written. Confirm send_otlp_span.cjs writes this file on any OTLP HTTP failure (per §7, §6.6).
H. Validation Queries Used
# Span count and summary
jq '[.resourceSpans[].scopeSpans[].spans[]] | length' /tmp/gh-aw/otel.jsonl
jq -c '.resourceSpans[].scopeSpans[].spans[] | {name, traceId, spanId, parentSpanId, kind, status}' /tmp/gh-aw/otel.jsonl
# Trace ID uniqueness
jq -r '.resourceSpans[].scopeSpans[].spans[].traceId' /tmp/gh-aw/otel.jsonl | sort -u | wc -l
# Timestamp validation
jq -c '.resourceSpans[].scopeSpans[].spans[] | {name, start: .startTimeUnixNano, end: .endTimeUnixNano, valid: (.startTimeUnixNano < .endTimeUnixNano)}' /tmp/gh-aw/otel.jsonl
# Required resource attributes
jq -r '.resourceSpans[].resource.attributes[] | "\(.key): \(.value | to_entries[0].value)"' /tmp/gh-aw/otel.jsonl | sort
# Setup span required attributes (§10.1)
jq -c '.resourceSpans[].scopeSpans[].spans[] | select(.name | endswith(".setup")) | .attributes | map({(.key): .value}) | add' /tmp/gh-aw/otel.jsonl
# Instrumentation scope
jq -c '.resourceSpans[].scopeSpans[].scope' /tmp/gh-aw/otel.jsonl
# Duplicate detection
jq -r '.resourceSpans[].scopeSpans[].spans[] | "\(.traceId)-\(.spanId)"' /tmp/gh-aw/otel.jsonl | sort | uniq -d | wc -l
# Export errors
cat /tmp/gh-aw/agent/otlp-export-errors.jsonl 2>/dev/null || echo "No export errors"
cat /tmp/gh-aw/agent/otlp-export-errors.count 2>/dev/null || echo "0"
Spec reference: specs/otel-observability-spec.md v0.3.0 (2026-05-22). Telemetry source: local JSONL mirror only (cheapest trustworthy source per otel-queries SKILL). Backend queries skipped — no MCP OTLP backend tools available in this execution context.
Generated by 🧭 OTLP Data Quality Validator · 154.1 AIC · ◷
A. Executive Summary
26997807167otlp-data-quality-validator/tmp/gh-aw/otel.jsonl(3,315 bytes, 1 span)The local JSONL mirror is healthy. The setup span passes all format, attribute, and hierarchy checks. Conclusion and agent spans are absent because the workflow is still executing — this is spec-conformant per §7.1 (mirrors are written lazily as spans complete). No export errors were recorded.
B. Trace Completeness
/tmp/gh-aw/otel.jsonlgh-aw.agent.setup)5cf4b086993d63ea6cbb401f3a705c22traceId+spanId)Only the setup span is expected in the mirror at agent execution time. No data loss is indicated.
C. Span Hierarchy Validation
parentSpanIdbdfb79458e813aabgh-aw.<job>.<op>gh-aw.agent.setupkind= INTERNAL (1)kind=1status.code=1startTimeUnixNano<endTimeUnixNanoD. Attribute Contract Validation
Setup Span (§10.1) —
gh-aw.agent.setupgh-aw.job.nameagentgh-aw.workflow.nameOTLP Data Quality Validatorgh-aw.run.id26997807167gh-aw.run.attempt1gh-aw.run.actormnkiefergh-aw.repositorygithub/gh-awgh-aw.stagedfalseConditional attributes also present:
gen_ai.system,gh-aw.engine.id,gh-aw.event_name,gh-aw.episode.id,gh-aw.episode.kind,gh-aw.hop.id,gh-aw.workflow_call.id.Conclusion Span (§10.2) — not yet emitted
Cannot validate. Expected attributes:
gh-aw.run.status,gh-aw.error_count,gh-aw.warning_count,gh-aw.action_minutes,gh-aw.output.item_count,gh-aw.otlp.export_errors.Agent Span (§10.3) — not yet emitted
Cannot validate GenAI semantic convention attributes.
Resource Attributes (§11.1)
service.namegh-aw.otlp-data-quality-validatorservice.version1.0.57github.repositorygithub/gh-awgithub.run_id26997807167github.run_attempt1github.actions.run_urlhttps://github.com/github/gh-aw/actions/runs/26997807167Conditional attributes also present:
github.event_name,github.ref,github.ref_name,github.sha,github.job,github.workflow_ref,github.actor_id,runner.os,runner.arch,runner.name,runner.environment,gh-aw.awf.version,deployment.environment.Minor note:
gh-aw.awmg.versionis empty inaw_info.json(optional per §11.2 — "when available").Instrumentation Scope (§11.3)
scope.namegh-awscope.version1.0.571.0.57E. Export and Fan-Out Health
/tmp/gh-aw/otel.jsonl, 3315 bytes, 1 lineotlp-export-errors.jsonlor.countfileOTEL_EXPORTER_OTLP_ENDPOINTGH_AW_OTLP_ENDPOINTSGH_AW_OTLP_ALL_HEADERSGITHUB_AW_OTEL_TRACE_IDGITHUB_AW_OTEL_PARENT_SPAN_ID*.grafana.net,*.sentry.io(from network allowlist)F. Root-Cause Hypothesis
No confirmed issues. Possible follow-on gaps to monitor:
Backend visibility unconfirmed — MCP OTLP backend tools are not available in this execution context. Grafana Tempo and Sentry endpoint success is inferred from absence of export errors but not directly verified.
otlp-export-errors.jsonl, all env vars set correctly.send_otlp_span.cjsencountered a network error after writing JSONL.Conclusion/agent span attribute completeness — Cannot be validated until the workflow completes. If
gh-aw.otlp.export_errorsorgh-aw.run.statusare missing on the conclusion span, that would be a §10.2 violation.gh-aw.awmg.versionabsent — Theawmg_versionfield inaw_info.jsonis empty. This is a conditional attribute (§11.2), so no violation, but may indicate AWMG is not deployed in this environment.G. Recommended Fixes (Prioritized)
No current fixes required. The following are monitoring recommendations:
(P2) Verify backend visibility post-run — After the workflow completes, query Grafana Tempo and Sentry for trace
5cf4b086993d63ea6cbb401f3a705c22to confirm both endpoints received spans. Command:(P3) Validate conclusion span post-run — Re-run this validation after the conclusion step writes to confirm §10.2 attribute contract compliance:
jq -c '.resourceSpans[].scopeSpans[].spans[] | select(.name | endswith(".conclusion")) | {name, attrs: [.attributes[]? | {(.key): .value}] | add}' /tmp/gh-aw/otel.jsonl(P3) Validate agent span GenAI attributes post-run — Check §10.3 compliance:
jq -c '.resourceSpans[].scopeSpans[].spans[] | select(.name | endswith(".agent")) | .attributes | map({(.key): .value}) | add | {gen_ai_system: .["gen_ai.system"], model: .["gen_ai.request.model"], op: .["gen_ai.operation.name"], input_tokens: .["gen_ai.usage.input_tokens"], output_tokens: .["gen_ai.usage.output_tokens"]}' /tmp/gh-aw/otel.jsonl(P4) Enable export error monitoring — The absence of
otlp-export-errors.countmeans either no errors occurred or the file is not written. Confirmsend_otlp_span.cjswrites this file on any OTLP HTTP failure (per §7, §6.6).H. Validation Queries Used
Spec reference:
specs/otel-observability-spec.mdv0.3.0 (2026-05-22). Telemetry source: local JSONL mirror only (cheapest trustworthy source per otel-queries SKILL). Backend queries skipped — no MCP OTLP backend tools available in this execution context.