summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry/sdk.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/telemetry/sdk.test.ts')
-rw-r--r--packages/core/src/telemetry/sdk.test.ts104
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/core/src/telemetry/sdk.test.ts b/packages/core/src/telemetry/sdk.test.ts
new file mode 100644
index 00000000..a583bc38
--- /dev/null
+++ b/packages/core/src/telemetry/sdk.test.ts
@@ -0,0 +1,104 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
+import { Config } from '../config/config.js';
+import { initializeTelemetry, shutdownTelemetry } from './sdk.js';
+import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
+import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-grpc';
+import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';
+import { OTLPTraceExporter as OTLPTraceExporterHttp } from '@opentelemetry/exporter-trace-otlp-http';
+import { OTLPLogExporter as OTLPLogExporterHttp } from '@opentelemetry/exporter-logs-otlp-http';
+import { OTLPMetricExporter as OTLPMetricExporterHttp } from '@opentelemetry/exporter-metrics-otlp-http';
+import { NodeSDK } from '@opentelemetry/sdk-node';
+
+vi.mock('@opentelemetry/exporter-trace-otlp-grpc');
+vi.mock('@opentelemetry/exporter-logs-otlp-grpc');
+vi.mock('@opentelemetry/exporter-metrics-otlp-grpc');
+vi.mock('@opentelemetry/exporter-trace-otlp-http');
+vi.mock('@opentelemetry/exporter-logs-otlp-http');
+vi.mock('@opentelemetry/exporter-metrics-otlp-http');
+vi.mock('@opentelemetry/sdk-node');
+
+describe('Telemetry SDK', () => {
+ let mockConfig: Config;
+
+ beforeEach(() => {
+ vi.clearAllMocks();
+ mockConfig = {
+ getTelemetryEnabled: () => true,
+ getTelemetryOtlpEndpoint: () => 'http://localhost:4317',
+ getTelemetryOtlpProtocol: () => 'grpc',
+ getTelemetryOutfile: () => undefined,
+ getDebugMode: () => false,
+ getSessionId: () => 'test-session',
+ } as unknown as Config;
+ });
+
+ afterEach(async () => {
+ await shutdownTelemetry(mockConfig);
+ });
+
+ it('should use gRPC exporters when protocol is grpc', () => {
+ initializeTelemetry(mockConfig);
+
+ expect(OTLPTraceExporter).toHaveBeenCalledWith({
+ url: 'http://localhost:4317',
+ compression: 'gzip',
+ });
+ expect(OTLPLogExporter).toHaveBeenCalledWith({
+ url: 'http://localhost:4317',
+ compression: 'gzip',
+ });
+ expect(OTLPMetricExporter).toHaveBeenCalledWith({
+ url: 'http://localhost:4317',
+ compression: 'gzip',
+ });
+ expect(NodeSDK.prototype.start).toHaveBeenCalled();
+ });
+
+ it('should use HTTP exporters when protocol is http', () => {
+ vi.spyOn(mockConfig, 'getTelemetryEnabled').mockReturnValue(true);
+ vi.spyOn(mockConfig, 'getTelemetryOtlpProtocol').mockReturnValue('http');
+ vi.spyOn(mockConfig, 'getTelemetryOtlpEndpoint').mockReturnValue(
+ 'http://localhost:4318',
+ );
+
+ initializeTelemetry(mockConfig);
+
+ expect(OTLPTraceExporterHttp).toHaveBeenCalledWith({
+ url: 'http://localhost:4318/',
+ });
+ expect(OTLPLogExporterHttp).toHaveBeenCalledWith({
+ url: 'http://localhost:4318/',
+ });
+ expect(OTLPMetricExporterHttp).toHaveBeenCalledWith({
+ url: 'http://localhost:4318/',
+ });
+ expect(NodeSDK.prototype.start).toHaveBeenCalled();
+ });
+
+ it('should parse gRPC endpoint correctly', () => {
+ vi.spyOn(mockConfig, 'getTelemetryOtlpEndpoint').mockReturnValue(
+ 'https://my-collector.com',
+ );
+ initializeTelemetry(mockConfig);
+ expect(OTLPTraceExporter).toHaveBeenCalledWith(
+ expect.objectContaining({ url: 'https://my-collector.com' }),
+ );
+ });
+
+ it('should parse HTTP endpoint correctly', () => {
+ vi.spyOn(mockConfig, 'getTelemetryOtlpProtocol').mockReturnValue('http');
+ vi.spyOn(mockConfig, 'getTelemetryOtlpEndpoint').mockReturnValue(
+ 'https://my-collector.com',
+ );
+ initializeTelemetry(mockConfig);
+ expect(OTLPTraceExporterHttp).toHaveBeenCalledWith(
+ expect.objectContaining({ url: 'https://my-collector.com/' }),
+ );
+ });
+});