diff options
| author | smhendrickson <[email protected]> | 2025-07-23 17:48:24 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-23 21:48:24 +0000 |
| commit | 9d3164621a8bb0e2bbf8d2309fba1d8678c0abe2 (patch) | |
| tree | 0a70a72e6735380b327ee883711c27b5345de65b /packages/core/src/telemetry/file-exporters.ts | |
| parent | 209c8783b4f2cdc39e4ce1ac05b3416d32c373c5 (diff) | |
add `--telemetry-outfile` flag (#4689)
Diffstat (limited to 'packages/core/src/telemetry/file-exporters.ts')
| -rw-r--r-- | packages/core/src/telemetry/file-exporters.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/packages/core/src/telemetry/file-exporters.ts b/packages/core/src/telemetry/file-exporters.ts new file mode 100644 index 00000000..aee3dfd6 --- /dev/null +++ b/packages/core/src/telemetry/file-exporters.ts @@ -0,0 +1,89 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as fs from 'node:fs'; +import { ExportResult, ExportResultCode } from '@opentelemetry/core'; +import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'; +import { ReadableLogRecord, LogRecordExporter } from '@opentelemetry/sdk-logs'; +import { + ResourceMetrics, + PushMetricExporter, + AggregationTemporality, +} from '@opentelemetry/sdk-metrics'; + +class FileExporter { + protected writeStream: fs.WriteStream; + + constructor(filePath: string) { + this.writeStream = fs.createWriteStream(filePath, { flags: 'a' }); + } + + protected serialize(data: unknown): string { + return JSON.stringify(data, null, 2) + '\n'; + } + + shutdown(): Promise<void> { + return new Promise((resolve) => { + this.writeStream.end(resolve); + }); + } +} + +export class FileSpanExporter extends FileExporter implements SpanExporter { + export( + spans: ReadableSpan[], + resultCallback: (result: ExportResult) => void, + ): void { + const data = spans.map((span) => this.serialize(span)).join(''); + this.writeStream.write(data, (err) => { + resultCallback({ + code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, + error: err || undefined, + }); + }); + } +} + +export class FileLogExporter extends FileExporter implements LogRecordExporter { + export( + logs: ReadableLogRecord[], + resultCallback: (result: ExportResult) => void, + ): void { + const data = logs.map((log) => this.serialize(log)).join(''); + this.writeStream.write(data, (err) => { + resultCallback({ + code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, + error: err || undefined, + }); + }); + } +} + +export class FileMetricExporter + extends FileExporter + implements PushMetricExporter +{ + export( + metrics: ResourceMetrics, + resultCallback: (result: ExportResult) => void, + ): void { + const data = this.serialize(metrics); + this.writeStream.write(data, (err) => { + resultCallback({ + code: err ? ExportResultCode.FAILED : ExportResultCode.SUCCESS, + error: err || undefined, + }); + }); + } + + getPreferredAggregationTemporality(): AggregationTemporality { + return AggregationTemporality.CUMULATIVE; + } + + async forceFlush(): Promise<void> { + return Promise.resolve(); + } +} |
