summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry/file-exporters.ts
diff options
context:
space:
mode:
authorsmhendrickson <[email protected]>2025-07-23 17:48:24 -0400
committerGitHub <[email protected]>2025-07-23 21:48:24 +0000
commit9d3164621a8bb0e2bbf8d2309fba1d8678c0abe2 (patch)
tree0a70a72e6735380b327ee883711c27b5345de65b /packages/core/src/telemetry/file-exporters.ts
parent209c8783b4f2cdc39e4ce1ac05b3416d32c373c5 (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.ts89
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();
+ }
+}