../enable-disable-otlp-meterprovider

How to manually enable or disable the OTLP MeterProvider

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);

Reference