Path: blob/main/extensions/copilot/src/platform/otel/node/fileExporters.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { type ExportResult, ExportResultCode } from '@opentelemetry/core';6import type { LogRecordExporter, ReadableLogRecord } from '@opentelemetry/sdk-logs';7import { type PushMetricExporter, type ResourceMetrics, AggregationTemporality } from '@opentelemetry/sdk-metrics';8import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-node';9import * as fs from 'node:fs';1011function safeStringify(data: unknown): string {12try {13return JSON.stringify(data);14} catch {15return '{}';16}17}1819abstract class BaseFileExporter {20protected readonly writeStream: fs.WriteStream;2122constructor(filePath: string) {23this.writeStream = fs.createWriteStream(filePath, { flags: 'a' });24}2526shutdown(): Promise<void> {27return new Promise(resolve => this.writeStream.end(resolve));28}2930forceFlush(): Promise<void> {31return Promise.resolve();32}33}3435export class FileSpanExporter extends BaseFileExporter implements SpanExporter {36export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {37const data = spans.map(s => safeStringify(s) + '\n').join('');38this.writeStream.write(data, err => {39resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });40});41}42}4344export class FileLogExporter extends BaseFileExporter implements LogRecordExporter {45export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {46const data = logs.map(l => safeStringify(l) + '\n').join('');47this.writeStream.write(data, err => {48resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });49});50}51}5253export class FileMetricExporter extends BaseFileExporter implements PushMetricExporter {54export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void {55const data = safeStringify(metrics) + '\n';56this.writeStream.write(data, err => {57resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });58});59}6061selectAggregationTemporality(): AggregationTemporality {62return AggregationTemporality.CUMULATIVE;63}64}656667