Description
Eleven kinds — cw_infra, ec2, rds, docdb, neptune, elasticache, aoss, mwaa, glue, bedrock, agentcore — share one OTel-native form, so they move as one wave or not at all.
awscloudwatchreceiver states that all metrics follow the CloudWatch Metric Streams OpenTelemetry 1.0.0 format: metric name amazonaws.com/{Namespace}/{MetricName}, resource attributes cloud.provider=aws and cloud.region, and datapoint attributes Namespace, MetricName and a nested Dimensions map omitted when no dimensions are set.
That is a completely different naming law from the aws_* five-stat expansion in signals/cw.md and internal/cw. This task adds a second law beside it; internal/cw must not be made to invent it.
cantfind SK-89 must resolve first. Without knowing how an OTLP gateway normalises amazonaws.com/{Namespace}/{Name} into a queryable Prometheus name, the emitted data is unqueryable and the wave delivers nothing a user can dashboard.
Acceptance Criteria
- #1 SK-89 resolved with evidence before any emission
- #2 One shared naming mechanic implements the metric-stream name and datapoint attributes; no construct spells the name itself
- #3 The five-stat expansion is NOT carried into the OTLP form unless capture evidence shows the metric-stream OTel format does so
- #4 An absent dimension is omitted from the Dimensions map, never empty-string or NA
- #5 All 11 kinds gated by one blueprint switch; promrw lanes unchanged when off
Definition of Done
- #1 make gate (build vet test race rw-proto-check spdx-check forbidden-words)
- #2 make blueprint-schema (only if a blueprint field or construct/workload config struct changed)
- #3 DRY_RUN=true go run ./cmd/synthkit -once -dump — inventory diffed against signals/
Implementation Plan
2026-09-06 execution: resolve SK-89 before emission, then implement one shared CloudWatch metric-stream OTLP naming/attribute mechanic across all eleven kinds, preserving the promrw five-stat path when off.
2026-09-05: SK-89 authenticated read-back proves 13 probe series from Summary wire form. Implement shared doc-verified Lookup and Summary emission across eleven kinds using fixture.Cloud.CloudWatchExportMode; keep unverified bases skipped and counted, never inferred.
Implementation Notes
2026-09-06 evidence: awscloudwatchreceiver documentation confirms the metric-stream OTLP envelope: amazonaws.com/{Namespace}/{MetricName}, cloud.provider and cloud.region resource attributes, and Namespace, MetricName, plus omitted-when-empty Dimensions datapoint attributes. It does not prove the target gateway’s queryable Prometheus normalization or whether the five-stat representation survives. Focused cwinfra/cw tests passed; no source changed and no emission was added. SK-89 remains the exact gap. Resume by sending a CloudWatch metric-stream OTLP resource through the target gateway and retaining exact query name, type, unit, scope, attributes, and stat shape.
2026-09-06 lookup expansion: the five namespace-group tables now hold 284 exact MetricName, Namespace, UCUM-unit, and dimension mappings, leaving 52 bases withheld. Before to after by lane group: cwinfra 0 verified and 104 skipped to 103 and 1; RDS family 1 and 50 to 49 and 2; cache, search, and EC2 1 and 62 to 41 and 22; data pipelines 0 and 68 to 59 and 9; GenAI 0 and 50 to 32 and 18. Every admitted pair is pinned by the repository mangling round trip and an AWS source; unconfirmed entries remain skipped. Local just check, explicit non-agent dump, and just e2e passed; hosted ci runs 33997698592 and 33998689112 passed e2e and ci-success.
Final Summary
2026-09-06: Parked at SK-89. The upstream OTLP envelope is documented, but target-gateway normalization remains unobserved, so implementing it would produce data whose query contract is invented.
2026-09-05: SK-89 resolved before emitter implementation by one gateway receipt and authenticated read-back of 13 retained series. All eleven CloudWatch constructs use one validated cloudwatch_export switch. The shared mechanic emits only the two verified EC2/RDS Summary families, preserves nested Dimensions and its omission, and leaves remote-write defaults unchanged. The explicitly permitted partial lookup skips 334 documented bases: cwinfra104 ec2 22 rds18 docdb19 neptune13 elasticache24 aoss16 mwaa48 glue20 bedrock38 agentcore12. No AWS case or dimension name is reverse-derived. Summary encode/decode and invalid-point validation, scoped build/test/vet, integrated just check, successful schema generation and the explicit 28-blueprint sourced-inventory comparison passed. CodeRabbit BC completed; valid Summary/nested-JSON findings were fixed and validated. Full remaining lookup coverage is SK-113, not a claim of emission.
2026-09-06 coverage correction: exact lookup coverage is now 284 verified and 52 skipped, not the earlier 2 verified and 334 skipped. The skipped inventory remains explicit; no casing, namespace, unit, or dimension was reconstructed from a mangled name.