/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see .
*/
export interface OtlpConfig {
endpoints: {
traces: string;
metrics: string;
logs: string;
};
headers?: Record;
}
export interface CounterMetric {
name: string;
value?: number;
dimensions?: Record;
}
export interface HistogramMetric {
name: string;
valueMs: number;
dimensions?: Record;
}
export interface GaugeMetric {
name: string;
value: number;
dimensions?: Record;
}
export interface TelemetryService {
isTelemetryActive(): boolean;
isTelemetryEnabled(): boolean;
shouldInitializeTelemetry(): boolean;
recordCounter(metric: CounterMetric): void;
recordHistogram(metric: HistogramMetric): void;
recordGauge(metric: GaugeMetric): void;
getOtlpConfig(): OtlpConfig | null;
initializeTelemetry(options: {serviceName: string; serviceVersion?: string; environment?: string}): void;
shutdownTelemetry(): Promise;
}
let _telemetryService: TelemetryService | null = null;
export function initializeTelemetryService(service: TelemetryService): void {
if (_telemetryService !== null) {
throw new Error('Telemetry service has already been initialized');
}
_telemetryService = service;
}
export function resetTelemetryService(): void {
_telemetryService = null;
}
const noopTelemetryService: TelemetryService = {
isTelemetryActive: () => false,
isTelemetryEnabled: () => false,
shouldInitializeTelemetry: () => false,
recordCounter: () => {},
recordHistogram: () => {},
recordGauge: () => {},
getOtlpConfig: () => null,
initializeTelemetry: () => {},
shutdownTelemetry: async () => {},
};
function getTelemetryService(): TelemetryService {
return _telemetryService ?? noopTelemetryService;
}
export function isTelemetryActive(): boolean {
return getTelemetryService().isTelemetryActive();
}
export function isTelemetryEnabled(): boolean {
return getTelemetryService().isTelemetryEnabled();
}
export function shouldInitializeTelemetry(): boolean {
return getTelemetryService().shouldInitializeTelemetry();
}
export function recordCounter(metric: CounterMetric): void {
getTelemetryService().recordCounter(metric);
}
export function recordHistogram(metric: HistogramMetric): void {
getTelemetryService().recordHistogram(metric);
}
export function recordGauge(metric: GaugeMetric): void {
getTelemetryService().recordGauge(metric);
}
export function getOtlpConfig(): OtlpConfig | null {
return getTelemetryService().getOtlpConfig();
}
export function initializeTelemetry(options: {
serviceName: string;
serviceVersion?: string;
environment?: string;
}): void {
getTelemetryService().initializeTelemetry(options);
}
export async function shutdownTelemetry(): Promise {
return getTelemetryService().shutdownTelemetry();
}