Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/otel/node/fileExporters.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { type ExportResult, ExportResultCode } from '@opentelemetry/core';
7
import type { LogRecordExporter, ReadableLogRecord } from '@opentelemetry/sdk-logs';
8
import { type PushMetricExporter, type ResourceMetrics, AggregationTemporality } from '@opentelemetry/sdk-metrics';
9
import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-node';
10
import * as fs from 'node:fs';
11
12
function safeStringify(data: unknown): string {
13
try {
14
return JSON.stringify(data);
15
} catch {
16
return '{}';
17
}
18
}
19
20
abstract class BaseFileExporter {
21
protected readonly writeStream: fs.WriteStream;
22
23
constructor(filePath: string) {
24
this.writeStream = fs.createWriteStream(filePath, { flags: 'a' });
25
}
26
27
shutdown(): Promise<void> {
28
return new Promise(resolve => this.writeStream.end(resolve));
29
}
30
31
forceFlush(): Promise<void> {
32
return Promise.resolve();
33
}
34
}
35
36
export class FileSpanExporter extends BaseFileExporter implements SpanExporter {
37
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {
38
const data = spans.map(s => safeStringify(s) + '\n').join('');
39
this.writeStream.write(data, err => {
40
resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });
41
});
42
}
43
}
44
45
export class FileLogExporter extends BaseFileExporter implements LogRecordExporter {
46
export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {
47
const data = logs.map(l => safeStringify(l) + '\n').join('');
48
this.writeStream.write(data, err => {
49
resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });
50
});
51
}
52
}
53
54
export class FileMetricExporter extends BaseFileExporter implements PushMetricExporter {
55
export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void {
56
const data = safeStringify(metrics) + '\n';
57
this.writeStream.write(data, err => {
58
resultCallback({ code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, error: err ?? undefined });
59
});
60
}
61
62
selectAggregationTemporality(): AggregationTemporality {
63
return AggregationTemporality.CUMULATIVE;
64
}
65
}
66
67