@@ -4,9 +4,11 @@ import { OtlpLogger, OtlpSerialization } from "effect/unstable/observability"
44import * as EffectLogger from "./logger"
55import { Flag } from "@/flag/flag"
66import { InstallationChannel , InstallationVersion } from "@/installation/version"
7+ import { ensureProcessMetadata } from "@/util/opencode-process"
78
89const base = Flag . OTEL_EXPORTER_OTLP_ENDPOINT
910export const enabled = ! ! base
11+ const processID = crypto . randomUUID ( )
1012
1113const headers = Flag . OTEL_EXPORTER_OTLP_HEADERS
1214 ? Flag . OTEL_EXPORTER_OTLP_HEADERS . split ( "," ) . reduce (
@@ -19,26 +21,34 @@ const headers = Flag.OTEL_EXPORTER_OTLP_HEADERS
1921 )
2022 : undefined
2123
22- const resource = {
23- serviceName : "opencode" ,
24- serviceVersion : InstallationVersion ,
25- attributes : {
26- "deployment.environment.name" : InstallationChannel ,
27- "opencode.client" : Flag . OPENCODE_CLIENT ,
28- } ,
24+ function resource ( ) {
25+ const processMetadata = ensureProcessMetadata ( "main" )
26+ return {
27+ serviceName : "opencode" ,
28+ serviceVersion : InstallationVersion ,
29+ attributes : {
30+ "deployment.environment.name" : InstallationChannel ,
31+ "opencode.client" : Flag . OPENCODE_CLIENT ,
32+ "opencode.process_role" : processMetadata . processRole ,
33+ "opencode.run_id" : processMetadata . runID ,
34+ "service.instance.id" : processID ,
35+ } ,
36+ }
2937}
3038
31- const logs = Logger . layer (
32- [
33- EffectLogger . logger ,
34- OtlpLogger . make ( {
35- url : `${ base } /v1/logs` ,
36- resource,
37- headers,
38- } ) ,
39- ] ,
40- { mergeWithExisting : false } ,
41- ) . pipe ( Layer . provide ( OtlpSerialization . layerJson ) , Layer . provide ( FetchHttpClient . layer ) )
39+ function logs ( ) {
40+ return Logger . layer (
41+ [
42+ EffectLogger . logger ,
43+ OtlpLogger . make ( {
44+ url : `${ base } /v1/logs` ,
45+ resource : resource ( ) ,
46+ headers,
47+ } ) ,
48+ ] ,
49+ { mergeWithExisting : false } ,
50+ ) . pipe ( Layer . provide ( OtlpSerialization . layerJson ) , Layer . provide ( FetchHttpClient . layer ) )
51+ }
4252
4353const traces = async ( ) => {
4454 const NodeSdk = await import ( "@effect/opentelemetry/NodeSdk" )
@@ -58,7 +68,7 @@ const traces = async () => {
5868 context . setGlobalContextManager ( mgr )
5969
6070 return NodeSdk . layer ( ( ) => ( {
61- resource,
71+ resource : resource ( ) ,
6272 spanProcessor : new SdkBase . BatchSpanProcessor (
6373 new OTLP . OTLPTraceExporter ( {
6474 url : `${ base } /v1/traces` ,
@@ -73,7 +83,7 @@ export const layer = !base
7383 : Layer . unwrap (
7484 Effect . gen ( function * ( ) {
7585 const trace = yield * Effect . promise ( traces )
76- return Layer . mergeAll ( trace , logs )
86+ return Layer . mergeAll ( trace , logs ( ) )
7787 } ) ,
7888 )
7989
0 commit comments