import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc"; import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base"; import * as Layer from "effect/Layer"; import { EXECUTOR_TRACE_ENABLED_ENV, EXECUTOR_TRACE_OTLP_ENDPOINT_ENV, EXECUTOR_TRACE_OTLP_HTTP_ENDPOINT_ENV, EXECUTOR_TRACE_QUERY_BASE_URL_ENV, EXECUTOR_TRACE_SERVICE_NAME_ENV, } from "./config"; const DEFAULT_TRACE_OTLP_ENDPOINT = "http://127.0.0.1:4317"; const DEFAULT_TRACE_QUERY_BASE_URL = "http://127.0.0.1:16686"; const DEFAULT_TRACE_SERVICE_NAME = "executor-local"; export type LocalTracingRuntime = { readonly layer: Layer.Layer; readonly otlpEndpoint: string; readonly queryBaseUrl: string; readonly serviceName: string; }; const trim = (value: string | undefined): string | undefined => { const candidate = value?.trim(); return candidate && candidate.length > 0 ? candidate : undefined; }; const envFlag = (value: string | undefined): boolean => { const normalized = value?.trim().toLowerCase(); return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on"; }; export const createLocalTracingRuntimeFromEnv = (): LocalTracingRuntime | null => { if (!envFlag(process.env[EXECUTOR_TRACE_ENABLED_ENV])) { return null; } const otlpEndpoint = trim(process.env[EXECUTOR_TRACE_OTLP_ENDPOINT_ENV]) ?? trim(process.env[EXECUTOR_TRACE_OTLP_HTTP_ENDPOINT_ENV]) ?? DEFAULT_TRACE_OTLP_ENDPOINT; const serviceName = trim(process.env[EXECUTOR_TRACE_SERVICE_NAME_ENV]) ?? DEFAULT_TRACE_SERVICE_NAME; const queryBaseUrl = trim(process.env[EXECUTOR_TRACE_QUERY_BASE_URL_ENV]) ?? DEFAULT_TRACE_QUERY_BASE_URL; return { layer: NodeSdk.layer(() => ({ resource: { serviceName, attributes: { "service.namespace": "executor", }, }, spanProcessor: [new SimpleSpanProcessor(new OTLPTraceExporter({ url: otlpEndpoint }))], })), otlpEndpoint, queryBaseUrl, serviceName, }; }; export const tracingSearchUrl = (input: { queryBaseUrl: string; serviceName: string; }): string => `${input.queryBaseUrl.replace(/\/$/, "")}/search?service=${encodeURIComponent(input.serviceName)}`;