OTLP 的 metric 主要是測量系統的各項指標隨著時間的變化,取樣(sampling)的間隔可以自己設定,一但開始,通常就不會停下來。
這邊會有手動開關的需求是為了監測 WebRTC MediaStream 在特定時間內的數值變化。
另外 OTLP javascript SDK 的 packages 有一大堆,example 也不夠多,需要自己去讀 interface,才會知道還有哪些額外的 methods 可以用。
import { metrics } from "@opentelemetry/api";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
import { resourceFromAttributes } from "@opentelemetry/resources";
import {
MeterProvider,
PeriodicExportingMetricReader,
} from "@opentelemetry/sdk-metrics";
import {
ATTR_SERVICE_NAME,
ATTR_SERVICE_VERSION,
} from "@opentelemetry/semantic-conventions";
const OTLP_SERVICE_NAME = 'service-name';
const OTLP_SERVICE_VERSION = 'service-version';
const resource = resourceFromAttributes({
[ATTR_SERVICE_NAME]: 'your-service-name',
[ATTR_SERVICE_VERSION]: 'service-version',
"service.namespace": process.env.NODE_ENV || "development",
});
type OtlpMeticInstruments = ReturnType<typeof createOtlpInstruments>;
let meterProvider: MeterProvider | null = null;
let instruments: OtlpMeticInstruments | null = null;
export function createOtlpMeterProvider() {
const metricReader = new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: 'domain/otel/v1/metrics',
}),
exportIntervalMillis: 30 * 1000,
});
meterProvider = new MeterProvider({
resource,
readers: [metricReader],
});
metrics.setGlobalMeterProvider(meterProvider);
}
export function removeOtlpMeterProvider() {
if (meterProvider) {
meterProvider.shutdown();
}
metrics.disable();
instruments = null;
}
export function createOtlpInstruments() {
const meter = metrics
.getMeterProvider()
.getMeter(OTLP_SERVICE_NAME, OTLP_SERVICE_VERSION);
const gauge = meter.createGauge('your-metric');
const gauge2 = meter.createGauge('your-metric2');
return {
gauge,
gauge2,
};
}
/** Before getting instruments, you should create MeterProvider first. */
export function getOtlpInstruments() {
if (!instruments) {
instruments = createOtlpInstruments();
}
return instruments;
}
// Start measuring
createOtlpMeterProvider();
const { gauge } = getOtlpInstruments();
gauge.record(123)
// Stop
removeOtlpMeterProvider();
// Start again
createOtlpMeterProvider();
const { gauge } = getOtlpInstruments();
gauge.record(456);