|
1 | 1 | import { LEVELS, type Level } from "./types.ts" |
2 | 2 |
|
| 3 | +/** Configuration values resolved from `OPENCODE_*` environment variables. */ |
3 | 4 | export type PluginConfig = { |
4 | 5 | enabled: boolean |
5 | 6 | endpoint: string |
6 | 7 | metricsInterval: number |
7 | 8 | logsInterval: number |
8 | 9 | metricPrefix: string |
| 10 | + otlpHeaders: string | undefined |
| 11 | + resourceAttributes: string | undefined |
9 | 12 | } |
10 | 13 |
|
| 14 | +/** Parses a positive integer from an environment variable, returning `fallback` if absent or invalid. */ |
11 | 15 | export function parseEnvInt(key: string, fallback: number): number { |
12 | 16 | const raw = process.env[key] |
13 | 17 | if (!raw) return fallback |
14 | | - const n = parseInt(raw, 10) |
15 | | - return Number.isFinite(n) && n > 0 ? n : fallback |
| 18 | + if (!/^[1-9]\d*$/.test(raw)) return fallback |
| 19 | + const n = Number(raw) |
| 20 | + return Number.isSafeInteger(n) ? n : fallback |
16 | 21 | } |
17 | 22 |
|
| 23 | +/** |
| 24 | + * Reads all `OPENCODE_*` environment variables and returns the resolved plugin config. |
| 25 | + * Copies `OPENCODE_OTLP_HEADERS` → `OTEL_EXPORTER_OTLP_HEADERS` and |
| 26 | + * `OPENCODE_RESOURCE_ATTRIBUTES` → `OTEL_RESOURCE_ATTRIBUTES` so the OTel SDK |
| 27 | + * picks them up automatically when initialised. |
| 28 | + */ |
18 | 29 | export function loadConfig(): PluginConfig { |
| 30 | + const otlpHeaders = process.env["OPENCODE_OTLP_HEADERS"] |
| 31 | + const resourceAttributes = process.env["OPENCODE_RESOURCE_ATTRIBUTES"] |
| 32 | + |
| 33 | + if (otlpHeaders) process.env["OTEL_EXPORTER_OTLP_HEADERS"] = otlpHeaders |
| 34 | + if (resourceAttributes) process.env["OTEL_RESOURCE_ATTRIBUTES"] = resourceAttributes |
| 35 | + |
19 | 36 | return { |
20 | 37 | enabled: !!process.env["OPENCODE_ENABLE_TELEMETRY"], |
21 | 38 | endpoint: process.env["OPENCODE_OTLP_ENDPOINT"] ?? "http://localhost:4317", |
22 | 39 | metricsInterval: parseEnvInt("OPENCODE_OTLP_METRICS_INTERVAL", 60000), |
23 | 40 | logsInterval: parseEnvInt("OPENCODE_OTLP_LOGS_INTERVAL", 5000), |
24 | 41 | metricPrefix: process.env["OPENCODE_METRIC_PREFIX"] ?? "opencode.", |
| 42 | + otlpHeaders, |
| 43 | + resourceAttributes, |
25 | 44 | } |
26 | 45 | } |
27 | 46 |
|
| 47 | +/** |
| 48 | + * Resolves an opencode log level string to a `Level`. |
| 49 | + * Returns `current` unchanged when the input does not match a known level. |
| 50 | + */ |
28 | 51 | export function resolveLogLevel(logLevel: string, current: Level): Level { |
29 | 52 | const candidate = logLevel.toLowerCase() |
30 | 53 | if (candidate in LEVELS) return candidate as Level |
|
0 commit comments