@ogcio/o11y-sdk-node
Version:
Opentelemetry standard instrumentation SDK for NodeJS based project
76 lines (66 loc) • 1.99 kB
text/typescript
import {
Counter,
createNoopMeter,
Gauge,
Histogram,
Meter,
MetricOptions,
metrics,
ObservableCounter,
ObservableGauge,
ObservableUpDownCounter,
UpDownCounter,
Attributes,
} from "@opentelemetry/api";
type MetricTypeMap<TAttributes extends Attributes> = {
counter: Counter<TAttributes>;
histogram: Histogram<TAttributes>;
gauge: Gauge<TAttributes>;
updowncounter: UpDownCounter<TAttributes>;
"async-counter": ObservableCounter<TAttributes>;
"async-updowncounter": ObservableUpDownCounter<TAttributes>;
"async-gauge": ObservableGauge<TAttributes>;
};
export type MetricType = keyof MetricTypeMap<Attributes>;
const MetricsFactoryMap: Record<
MetricType,
(
meter: Meter,
) => (
name: string,
options?: MetricOptions,
) => MetricTypeMap<Attributes>[MetricType]
> = {
gauge: (meter: Meter) => meter.createGauge,
histogram: (meter: Meter) => meter.createHistogram,
counter: (meter: Meter) => meter.createCounter,
updowncounter: (meter: Meter) => meter.createUpDownCounter,
"async-counter": (meter: Meter) => meter.createObservableCounter,
"async-updowncounter": (meter: Meter) => meter.createObservableUpDownCounter,
"async-gauge": (meter: Meter) => meter.createObservableGauge,
} as const;
export interface MetricsParams {
meterName: string;
metricName: string;
options?: MetricOptions;
}
function getMeter({ meterName }: MetricsParams) {
if (!meterName) {
console.error("Invalid metric name!");
return createNoopMeter();
}
return metrics.getMeter(`custom_metric.${meterName}`);
}
export function getMetric<
T extends MetricType,
TAttributes extends Attributes = Attributes,
>(type: T, p: MetricsParams): MetricTypeMap<TAttributes>[T] {
const meter = getMeter(p);
if (!MetricsFactoryMap[type]) {
throw new Error(`Unsupported metric type: ${type}`);
}
return MetricsFactoryMap[type](meter).bind(meter)(
p.metricName,
p.options,
) as MetricTypeMap<TAttributes>[T];
}