/** * Core telemetry module — sets up OTEL MeterProvider + LoggerProvider * and exposes metric instruments + event emitter. */ import { MeterProvider } from "@opentelemetry/sdk-metrics"; import { LoggerProvider } from "@opentelemetry/sdk-logs"; import type { OtelConfig, TelemetryProfile } from "./config.js"; import type { Counter, Attributes, Meter } from "@opentelemetry/api"; import type { PushMetricExporter } from "@opentelemetry/sdk-metrics"; import type { LogRecordExporter } from "@opentelemetry/sdk-logs"; import type { Logger } from "./log.js"; export interface OtelMetrics { sessionCount: Counter; linesOfCode: Counter; pullRequestCount: Counter; commitCount: Counter; costUsage: Counter; tokenUsage: Counter; toolDecision: Counter; activeTime: Counter; } export interface TelemetryContext { meter: Meter; metrics: OtelMetrics; loggerProvider: LoggerProvider; meterProvider: MeterProvider; /** Metric/event name prefix — "opencode" or "claude_code" */ prefix: string; /** The telemetry profile in use. */ profile: TelemetryProfile; emitEvent: (prefixedName: string, unprefixedName: string, attrs: Attributes) => void; /** Force-flush all pending metrics and logs. */ flush: () => Promise; shutdown: () => Promise; } /** * Optional overrides for dependency injection (used by tests). * When provided, these exporters replace the ones that would normally * be created from the config. */ export interface TelemetryOptions { /** Override the metric exporter (e.g. InMemoryMetricExporter for tests). */ metricExporter?: PushMetricExporter; /** Override the log record exporter (e.g. InMemoryLogRecordExporter for tests). */ logExporter?: LogRecordExporter; } export declare function initTelemetry(config: OtelConfig, log: Logger, options?: TelemetryOptions): TelemetryContext;