-- SPDX-FileCopyrightText: 2026 Alexandra de Wit -- -- SPDX-License-Identifier: MIT {- | The live OpenTelemetry instruments over the pure @ecluse.*@ catalogue ("Ecluse.Core.Telemetry.Metrics"), and one typed @record*@ per signal. Each helper takes only the bounded label values its metric carries, so the type enforces the cardinality rule at the call site. With telemetry off, 'newMetrics' builds from the SDK's no-op meter provider, so the hot path records unconditionally: no per-call branch, and the 'metricAttributes' a call passes is never forced. @docs\/architecture\/observability.md@ describes the catalogue. -} module Ecluse.Runtime.Telemetry.Instruments ( -- * The instrument handle Metrics, newMetrics, -- * The core recording ports metricsPortOf, workerMetricsPortOf, dredgerMetricsPortOf, advisorySyncMetricsPortOf, advisoryCompileMetricsPortOf, -- * The signals the deferred reporters feed directly recordBreakerState, recordMirrorEnqueueFailure, recordCredentialRefresh, registerCredentialTokenTtl, -- * Advisory ages (observable) registerAdvisoryDatabaseAge, registerAdvisorySourceAge, -- * Memory budget (observable) registerMemoryMeter, ) where import Ecluse.Runtime.Telemetry.Instruments.Internal ( Metrics, advisoryCompileMetricsPortOf, advisorySyncMetricsPortOf, dredgerMetricsPortOf, metricsPortOf, newMetrics, recordBreakerState, recordCredentialRefresh, recordMirrorEnqueueFailure, registerAdvisoryDatabaseAge, registerAdvisorySourceAge, registerCredentialTokenTtl, registerMemoryMeter, workerMetricsPortOf, )