Description
Every comparable exporter is Prometheus-scraped, so many users have no OTLP metrics pipeline. Serving the same metrics on an opt-in /metrics endpoint lowers the adoption bar without changing the OTLP path.
Acceptance Criteria
- #1 An opt-in listener serves all metrics in Prometheus exposition format alongside OTLP export
- #2 Helm chart and compose example document the option
Definition of Done
- #1 just check (fmt-check, lint, vet, test, tidy-check, build, vuln)
- #2 just ci before a change that touches the Dockerfile, goreleaser or the image (adds snapshot + image)
- #3 Every new signal or attribute name declared in internal/semconv and listed in docs/signals.md
Implementation Plan
Admit after core-chain terminal/publication parks. Use aligned experimental OpenTelemetry Prometheus exporter v0.68.0 from official v1.46.0 release manifest and module metadata (Go minimum 1.25, SDK dependencies 1.46), alongside the existing periodic OTLP reader on one MeterProvider. New internal/promexport package owns private registry, handler and listener lifecycle. Opt-in prometheus.enabled false; listen localhost:9465 by default, separate from health. Explicit all-interface example binds use :9465 with an unauthenticated-metrics exposure warning. One optional PrometheusReader provider option; no new collector execution/emitter or public signal. Explicit underscore/suffix translation, no resource constant labels/target-info/scope-info. Scheduled normal mode only; dry-run, once and print-effective-config do not open a listener. Root owns outward enablement, dependency-version review, exact-SHA review/landing/CI.
Loop16 E51F-R rebases retained reviewed pull-listener candidate onto the green deny-list landing. The previous two implementation attempts remain consumed; rebase charges nothing. Preserve off-by-default loopback listener, one shared instrument pipeline and read-only scrape surface, rerun gate and CodeRabbit, then fresh exact-SHA high review. Root does not enable the listener on the deploy host.
Implementation Notes
Local source candidate 6800fed passed independent exact-candidate review, complete clean gate and real SDK/HTTP/CLI lifecycle checks. Publication parked on intent/authority qualification: after I1 delivery-gate lint failure, the original worker repaired I2 rather than the goal-designated root-commissioned retry role. Source PASS is not retroactive authorization. I1/I2 remain consumed, two implementation attempts remain, no reset or history rewrite. Retained source and review artifacts; no public listener code or deployment, no acceptance criteria closed. Source functionality is not the blocker.
Loop16 fresh high REV PASS d9954984f7c104941ee4d9f9ecbc2ebe33503d56; same-provider dual export, deny filters, zero points, snapshots and cardinality proven locally. Two historical implementation attempts retained, rebases zero-charge, no review-repair or infra charged. Exact patch pushed65089d58a8068ea4fb7f3f22f80512489a617fc1 and required CI workflows succeeded. Default off, loopback9465; live listener never enabled. Reviewed dependency additions and test-only checksums did not bump existing versions.