From af0d6ed7995bd3515e8ae90c253349556ebd1c88 Mon Sep 17 00:00:00 2001 From: Harrison Weinstock Date: Thu, 14 May 2026 00:01:25 +0000 Subject: [PATCH] feat: expose ability to publish otel metrics to remote endpoint --- src/cli/telemetry/client-accessor.ts | 6 ++++++ src/cli/telemetry/sinks/otel-metric-sink.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/src/cli/telemetry/client-accessor.ts b/src/cli/telemetry/client-accessor.ts index 04172dae5..18aa05fa4 100644 --- a/src/cli/telemetry/client-accessor.ts +++ b/src/cli/telemetry/client-accessor.ts @@ -3,6 +3,7 @@ import { TelemetryClient } from './client.js'; import { resolveAuditFilePath, resolveResourceAttributes } from './config.js'; import { FileSystemSink } from './sinks/filesystem-sink.js'; import { CompositeSink } from './sinks/metric-sink.js'; +import { OtelMetricSink } from './sinks/otel-metric-sink.js'; import { join } from 'path'; /** @@ -35,6 +36,7 @@ async function createClient(entrypoint: string, mode: 'cli' | 'tui' = 'cli'): Pr const sinks = []; const audit = process.env.AGENTCORE_TELEMETRY_AUDIT === '1' || config.telemetry?.audit === true; + const endpoint = process.env.AGENTCORE_TELEMETRY_ENDPOINT ?? config.telemetry?.endpoint; if (audit) { const filePath = resolveAuditFilePath( @@ -45,5 +47,9 @@ async function createClient(entrypoint: string, mode: 'cli' | 'tui' = 'cli'): Pr sinks.push(new FileSystemSink({ filePath, resource })); } + if (endpoint) { + sinks.push(new OtelMetricSink({ endpoint, resource })); + } + return new TelemetryClient(new CompositeSink(sinks)); } diff --git a/src/cli/telemetry/sinks/otel-metric-sink.ts b/src/cli/telemetry/sinks/otel-metric-sink.ts index 0bc6721f5..92370ade5 100644 --- a/src/cli/telemetry/sinks/otel-metric-sink.ts +++ b/src/cli/telemetry/sinks/otel-metric-sink.ts @@ -22,6 +22,7 @@ export class OtelMetricSink implements MetricSink { headers: { 'X-Installation-Id': config.resource['agentcore-cli.installation_id'] }, temporalityPreference: AggregationTemporality.DELTA, }); + this.meterProvider = new MeterProvider({ resource, readers: [