packages/fxa-shared/tracing/exporters/fxa-otlp.ts (55 lines of code) (raw):

/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { ExportResult } from '@opentelemetry/core'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; import { ReadableSpan } from '@opentelemetry/sdk-trace-node'; import { TracingOpts } from '../config'; import { TracingPiiFilter } from '../pii-filters'; import { checkDuration } from './util'; import { ILogger } from '../../log'; export type FxaOtlpTracingHeaders = { flowid?: string; traceparent?: string; tracestate?: string; }; /** OTLP exporter customized for FxA */ export class FxaOtlpWebExporter extends OTLPTraceExporter { constructor( protected readonly filter?: TracingPiiFilter, config?: OTLPExporterConfigBase, protected readonly logger?: ILogger ) { super(config); } override export( spans: ReadableSpan[], resultCallback: (result: ExportResult) => void ) { spans.forEach((x) => { checkDuration(x); this.filter?.filter(x); }); super.export(spans, (result) => { if (result.error) { this.logger?.error(result.error); } resultCallback(result); }); } } export function getOtlpTraceExporter( opts: TracingOpts, headers?: FxaOtlpTracingHeaders, filter?: TracingPiiFilter, logger?: ILogger ) { if (!opts.otel?.enabled) { return; } logger?.debug('Adding Otlp Trace Exporter ', opts.otel?.url); const config = { url: opts.otel?.url, headers, concurrencyLimit: opts.otel?.concurrencyLimit, }; const exporter = new FxaOtlpWebExporter(filter, config, logger); return exporter; }