summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry/sdk.ts
diff options
context:
space:
mode:
authorBilly Biggs <[email protected]>2025-08-15 18:10:21 -0700
committerGitHub <[email protected]>2025-08-16 01:10:21 +0000
commitd57cc0b9306f0359482ef6e243308bcda2989007 (patch)
tree3ec6a716d0a5b8d9c6cacc8a1231d05df6ba43fd /packages/core/src/telemetry/sdk.ts
parent4896c7739f57b4e475754854c217cdd1dbf7deaa (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.ts101
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,