@@ -127,6 +127,50 @@ export class OTLPExporter {
127127 typeof event . payload . timestamp === "number" ? event . payload . timestamp : Date . now ( ) ;
128128 const durationMs = event . metricName === "memory-leak" ? 0 : event . value ;
129129
130+ const baseAttributes = [
131+ { key : "diagnostic.value" , value : { doubleValue : event . value } } ,
132+ { key : "diagnostic.payload" , value : { stringValue : JSON . stringify ( event . payload ) } } ,
133+ ] ;
134+
135+ const toStr = ( v : unknown , fallback = "" ) : string => ( typeof v === "string" ? v : fallback ) ;
136+ const toNum = ( v : unknown ) : number => ( typeof v === "number" ? v : 0 ) ;
137+ const toBool = ( v : unknown ) : boolean => v === true ;
138+
139+ // GenAI semantic conventions for LLM spans
140+ const llmAttributes =
141+ event . metricName === "llm"
142+ ? [
143+ {
144+ key : "gen_ai.system" ,
145+ value : { stringValue : toStr ( event . payload [ "gen_ai.system" ] ) } ,
146+ } ,
147+ {
148+ key : "gen_ai.request.model" ,
149+ value : { stringValue : toStr ( event . payload [ "gen_ai.request.model" ] ) } ,
150+ } ,
151+ {
152+ key : "gen_ai.usage.input_tokens" ,
153+ value : { intValue : toNum ( event . payload [ "gen_ai.usage.input_tokens" ] ) } ,
154+ } ,
155+ {
156+ key : "gen_ai.usage.output_tokens" ,
157+ value : { intValue : toNum ( event . payload [ "gen_ai.usage.output_tokens" ] ) } ,
158+ } ,
159+ {
160+ key : "argus.llm.cost_usd" ,
161+ value : { doubleValue : toNum ( event . payload [ "argus.llm.cost_usd" ] ) } ,
162+ } ,
163+ {
164+ key : "argus.llm.pii_detected" ,
165+ value : { stringValue : toStr ( event . payload [ "argus.llm.pii_detected" ] , "[]" ) } ,
166+ } ,
167+ {
168+ key : "argus.llm.injection_attempt" ,
169+ value : { boolValue : toBool ( event . payload [ "argus.llm.injection_attempt" ] ) } ,
170+ } ,
171+ ]
172+ : [ ] ;
173+
130174 return {
131175 traceId :
132176 ( event . payload . traceId as string | undefined ) ?? crypto . randomBytes ( 16 ) . toString ( "hex" ) ,
@@ -135,16 +179,7 @@ export class OTLPExporter {
135179 kind : 1 , // SPAN_KIND_INTERNAL
136180 startTimeUnixNano : timestamp * 1000000 ,
137181 endTimeUnixNano : ( timestamp + durationMs ) * 1000000 ,
138- attributes : [
139- {
140- key : "diagnostic.value" ,
141- value : { doubleValue : event . value } ,
142- } ,
143- {
144- key : "diagnostic.payload" ,
145- value : { stringValue : JSON . stringify ( event . payload ) } ,
146- } ,
147- ] ,
182+ attributes : [ ...baseAttributes , ...llmAttributes ] ,
148183 } ;
149184 } ) ;
150185
0 commit comments