diff options
| author | Billy Biggs <[email protected]> | 2025-08-15 18:10:21 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-16 01:10:21 +0000 |
| commit | d57cc0b9306f0359482ef6e243308bcda2989007 (patch) | |
| tree | 3ec6a716d0a5b8d9c6cacc8a1231d05df6ba43fd /packages/core/src/telemetry/sdk.ts | |
| parent | 4896c7739f57b4e475754854c217cdd1dbf7deaa (diff) | |
Add support for HTTP OpenTelemetry exporters (#6357)
Diffstat (limited to 'packages/core/src/telemetry/sdk.ts')
| -rw-r--r-- | packages/core/src/telemetry/sdk.ts | 101 |
1 files changed, 68 insertions, 33 deletions
diff --git a/packages/core/src/telemetry/sdk.ts b/packages/core/src/telemetry/sdk.ts index c6630236..3fbecaa9 100644 --- a/packages/core/src/telemetry/sdk.ts +++ b/packages/core/src/telemetry/sdk.ts @@ -8,6 +8,9 @@ import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api'; 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 { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'; import { NodeSDK } from '@opentelemetry/sdk-node'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; @@ -45,8 +48,9 @@ export function isTelemetrySdkInitialized(): boolean { return telemetryInitialized; } -function parseGrpcEndpoint( +function parseOtlpEndpoint( otlpEndpointSetting: string | undefined, + protocol: 'grpc' | 'http', ): string | undefined { if (!otlpEndpointSetting) { return undefined; @@ -56,9 +60,13 @@ function parseGrpcEndpoint( try { const url = new URL(trimmedEndpoint); - // OTLP gRPC exporters expect an endpoint in the format scheme://host:port - // The `origin` property provides this, stripping any path, query, or hash. - return url.origin; + if (protocol === 'grpc') { + // OTLP gRPC exporters expect an endpoint in the format scheme://host:port + // The `origin` property provides this, stripping any path, query, or hash. + return url.origin; + } + // For http, use the full href. + return url.href; } catch (error) { diag.error('Invalid OTLP endpoint URL provided:', trimmedEndpoint, error); return undefined; @@ -77,43 +85,70 @@ export function initializeTelemetry(config: Config): void { }); const otlpEndpoint = config.getTelemetryOtlpEndpoint(); - const grpcParsedEndpoint = parseGrpcEndpoint(otlpEndpoint); - const useOtlp = !!grpcParsedEndpoint; + const otlpProtocol = config.getTelemetryOtlpProtocol(); + const parsedEndpoint = parseOtlpEndpoint(otlpEndpoint, otlpProtocol); + const useOtlp = !!parsedEndpoint; const telemetryOutfile = config.getTelemetryOutfile(); - const spanExporter = useOtlp - ? new OTLPTraceExporter({ - url: grpcParsedEndpoint, + let spanExporter: + | OTLPTraceExporter + | OTLPTraceExporterHttp + | FileSpanExporter + | ConsoleSpanExporter; + let logExporter: + | OTLPLogExporter + | OTLPLogExporterHttp + | FileLogExporter + | ConsoleLogRecordExporter; + let metricReader: PeriodicExportingMetricReader; + + if (useOtlp) { + if (otlpProtocol === 'http') { + spanExporter = new OTLPTraceExporterHttp({ + url: parsedEndpoint, + }); + logExporter = new OTLPLogExporterHttp({ + url: parsedEndpoint, + }); + metricReader = new PeriodicExportingMetricReader({ + exporter: new OTLPMetricExporterHttp({ + url: parsedEndpoint, + }), + exportIntervalMillis: 10000, + }); + } else { + // grpc + spanExporter = new OTLPTraceExporter({ + url: parsedEndpoint, compression: CompressionAlgorithm.GZIP, - }) - : telemetryOutfile - ? new FileSpanExporter(telemetryOutfile) - : new ConsoleSpanExporter(); - const logExporter = useOtlp - ? new OTLPLogExporter({ - url: grpcParsedEndpoint, + }); + logExporter = new OTLPLogExporter({ + url: parsedEndpoint, compression: CompressionAlgorithm.GZIP, - }) - : telemetryOutfile - ? new FileLogExporter(telemetryOutfile) - : new ConsoleLogRecordExporter(); - const metricReader = useOtlp - ? new PeriodicExportingMetricReader({ + }); + metricReader = new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ - url: grpcParsedEndpoint, + url: parsedEndpoint, compression: CompressionAlgorithm.GZIP, }), exportIntervalMillis: 10000, - }) - : telemetryOutfile - ? new PeriodicExportingMetricReader({ - exporter: new FileMetricExporter(telemetryOutfile), - exportIntervalMillis: 10000, - }) - : new PeriodicExportingMetricReader({ - exporter: new ConsoleMetricExporter(), - exportIntervalMillis: 10000, - }); + }); + } + } else if (telemetryOutfile) { + spanExporter = new FileSpanExporter(telemetryOutfile); + logExporter = new FileLogExporter(telemetryOutfile); + metricReader = new PeriodicExportingMetricReader({ + exporter: new FileMetricExporter(telemetryOutfile), + exportIntervalMillis: 10000, + }); + } else { + spanExporter = new ConsoleSpanExporter(); + logExporter = new ConsoleLogRecordExporter(); + metricReader = new PeriodicExportingMetricReader({ + exporter: new ConsoleMetricExporter(), + exportIntervalMillis: 10000, + }); + } sdk = new NodeSDK({ resource, |
