@superblocksteam/telemetry 2.0.83-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +155 -0
  3. package/dist/browser/index.d.ts +8 -0
  4. package/dist/browser/index.d.ts.map +1 -0
  5. package/dist/browser/index.js +19 -0
  6. package/dist/browser/index.js.map +1 -0
  7. package/dist/browser/init.d.ts +75 -0
  8. package/dist/browser/init.d.ts.map +1 -0
  9. package/dist/browser/init.js +169 -0
  10. package/dist/browser/init.js.map +1 -0
  11. package/dist/browser/resilient-exporter.d.ts +43 -0
  12. package/dist/browser/resilient-exporter.d.ts.map +1 -0
  13. package/dist/browser/resilient-exporter.js +88 -0
  14. package/dist/browser/resilient-exporter.js.map +1 -0
  15. package/dist/common/contracts/tier2-traces.d.ts +75 -0
  16. package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
  17. package/dist/common/contracts/tier2-traces.js +186 -0
  18. package/dist/common/contracts/tier2-traces.js.map +1 -0
  19. package/dist/common/deployment-type.d.ts +18 -0
  20. package/dist/common/deployment-type.d.ts.map +1 -0
  21. package/dist/common/deployment-type.js +30 -0
  22. package/dist/common/deployment-type.js.map +1 -0
  23. package/dist/common/guardrails.d.ts +116 -0
  24. package/dist/common/guardrails.d.ts.map +1 -0
  25. package/dist/common/guardrails.js +189 -0
  26. package/dist/common/guardrails.js.map +1 -0
  27. package/dist/common/index.d.ts +16 -0
  28. package/dist/common/index.d.ts.map +1 -0
  29. package/dist/common/index.js +32 -0
  30. package/dist/common/index.js.map +1 -0
  31. package/dist/common/log-sanitizer.d.ts +78 -0
  32. package/dist/common/log-sanitizer.d.ts.map +1 -0
  33. package/dist/common/log-sanitizer.js +340 -0
  34. package/dist/common/log-sanitizer.js.map +1 -0
  35. package/dist/common/policy-evaluator.d.ts +103 -0
  36. package/dist/common/policy-evaluator.d.ts.map +1 -0
  37. package/dist/common/policy-evaluator.js +200 -0
  38. package/dist/common/policy-evaluator.js.map +1 -0
  39. package/dist/common/resource.d.ts +62 -0
  40. package/dist/common/resource.d.ts.map +1 -0
  41. package/dist/common/resource.js +106 -0
  42. package/dist/common/resource.js.map +1 -0
  43. package/dist/common/tier-hints.d.ts +182 -0
  44. package/dist/common/tier-hints.d.ts.map +1 -0
  45. package/dist/common/tier-hints.js +209 -0
  46. package/dist/common/tier-hints.js.map +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +76 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lint/forbidden-attributes.d.ts +149 -0
  52. package/dist/lint/forbidden-attributes.d.ts.map +1 -0
  53. package/dist/lint/forbidden-attributes.js +214 -0
  54. package/dist/lint/forbidden-attributes.js.map +1 -0
  55. package/dist/lint/index.d.ts +9 -0
  56. package/dist/lint/index.d.ts.map +1 -0
  57. package/dist/lint/index.js +16 -0
  58. package/dist/lint/index.js.map +1 -0
  59. package/dist/llmobs/index.d.ts +22 -0
  60. package/dist/llmobs/index.d.ts.map +1 -0
  61. package/dist/llmobs/index.js +29 -0
  62. package/dist/llmobs/index.js.map +1 -0
  63. package/dist/llmobs/tier1-exporter.d.ts +146 -0
  64. package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
  65. package/dist/llmobs/tier1-exporter.js +196 -0
  66. package/dist/llmobs/tier1-exporter.js.map +1 -0
  67. package/dist/llmobs/tier2-summarizer.d.ts +268 -0
  68. package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
  69. package/dist/llmobs/tier2-summarizer.js +650 -0
  70. package/dist/llmobs/tier2-summarizer.js.map +1 -0
  71. package/dist/node/exporters/resilient-exporter.d.ts +77 -0
  72. package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
  73. package/dist/node/exporters/resilient-exporter.js +129 -0
  74. package/dist/node/exporters/resilient-exporter.js.map +1 -0
  75. package/dist/node/index.d.ts +11 -0
  76. package/dist/node/index.d.ts.map +1 -0
  77. package/dist/node/index.js +24 -0
  78. package/dist/node/index.js.map +1 -0
  79. package/dist/node/init.d.ts +75 -0
  80. package/dist/node/init.d.ts.map +1 -0
  81. package/dist/node/init.js +245 -0
  82. package/dist/node/init.js.map +1 -0
  83. package/dist/node/log-processor.d.ts +83 -0
  84. package/dist/node/log-processor.d.ts.map +1 -0
  85. package/dist/node/log-processor.js +266 -0
  86. package/dist/node/log-processor.js.map +1 -0
  87. package/dist/node/metrics-client.d.ts +66 -0
  88. package/dist/node/metrics-client.d.ts.map +1 -0
  89. package/dist/node/metrics-client.js +193 -0
  90. package/dist/node/metrics-client.js.map +1 -0
  91. package/dist/node/traced-socket.d.ts +76 -0
  92. package/dist/node/traced-socket.d.ts.map +1 -0
  93. package/dist/node/traced-socket.js +261 -0
  94. package/dist/node/traced-socket.js.map +1 -0
  95. package/dist/testing/in-memory-exporter.d.ts +179 -0
  96. package/dist/testing/in-memory-exporter.d.ts.map +1 -0
  97. package/dist/testing/in-memory-exporter.js +254 -0
  98. package/dist/testing/in-memory-exporter.js.map +1 -0
  99. package/dist/testing/index.d.ts +8 -0
  100. package/dist/testing/index.d.ts.map +1 -0
  101. package/dist/testing/index.js +19 -0
  102. package/dist/testing/index.js.map +1 -0
  103. package/dist/testing/test-init.d.ts +80 -0
  104. package/dist/testing/test-init.d.ts.map +1 -0
  105. package/dist/testing/test-init.js +144 -0
  106. package/dist/testing/test-init.js.map +1 -0
  107. package/dist/types/index.d.ts +40 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +23 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/policy.d.ts +92 -0
  112. package/dist/types/policy.d.ts.map +1 -0
  113. package/dist/types/policy.js +125 -0
  114. package/dist/types/policy.js.map +1 -0
  115. package/dist-esm/browser/index.d.ts +8 -0
  116. package/dist-esm/browser/index.d.ts.map +1 -0
  117. package/dist-esm/browser/index.js +9 -0
  118. package/dist-esm/browser/index.js.map +1 -0
  119. package/dist-esm/browser/init.d.ts +75 -0
  120. package/dist-esm/browser/init.d.ts.map +1 -0
  121. package/dist-esm/browser/init.js +162 -0
  122. package/dist-esm/browser/init.js.map +1 -0
  123. package/dist-esm/browser/resilient-exporter.d.ts +43 -0
  124. package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
  125. package/dist-esm/browser/resilient-exporter.js +84 -0
  126. package/dist-esm/browser/resilient-exporter.js.map +1 -0
  127. package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
  128. package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
  129. package/dist-esm/common/contracts/tier2-traces.js +178 -0
  130. package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
  131. package/dist-esm/common/deployment-type.d.ts +18 -0
  132. package/dist-esm/common/deployment-type.d.ts.map +1 -0
  133. package/dist-esm/common/deployment-type.js +27 -0
  134. package/dist-esm/common/deployment-type.js.map +1 -0
  135. package/dist-esm/common/guardrails.d.ts +116 -0
  136. package/dist-esm/common/guardrails.d.ts.map +1 -0
  137. package/dist-esm/common/guardrails.js +179 -0
  138. package/dist-esm/common/guardrails.js.map +1 -0
  139. package/dist-esm/common/index.d.ts +16 -0
  140. package/dist-esm/common/index.d.ts.map +1 -0
  141. package/dist-esm/common/index.js +16 -0
  142. package/dist-esm/common/index.js.map +1 -0
  143. package/dist-esm/common/log-sanitizer.d.ts +78 -0
  144. package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
  145. package/dist-esm/common/log-sanitizer.js +331 -0
  146. package/dist-esm/common/log-sanitizer.js.map +1 -0
  147. package/dist-esm/common/policy-evaluator.d.ts +103 -0
  148. package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
  149. package/dist-esm/common/policy-evaluator.js +196 -0
  150. package/dist-esm/common/policy-evaluator.js.map +1 -0
  151. package/dist-esm/common/resource.d.ts +62 -0
  152. package/dist-esm/common/resource.d.ts.map +1 -0
  153. package/dist-esm/common/resource.js +100 -0
  154. package/dist-esm/common/resource.js.map +1 -0
  155. package/dist-esm/common/tier-hints.d.ts +182 -0
  156. package/dist-esm/common/tier-hints.d.ts.map +1 -0
  157. package/dist-esm/common/tier-hints.js +199 -0
  158. package/dist-esm/common/tier-hints.js.map +1 -0
  159. package/dist-esm/index.d.ts +43 -0
  160. package/dist-esm/index.d.ts.map +1 -0
  161. package/dist-esm/index.js +53 -0
  162. package/dist-esm/index.js.map +1 -0
  163. package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
  164. package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
  165. package/dist-esm/lint/forbidden-attributes.js +209 -0
  166. package/dist-esm/lint/forbidden-attributes.js.map +1 -0
  167. package/dist-esm/lint/index.d.ts +9 -0
  168. package/dist-esm/lint/index.d.ts.map +1 -0
  169. package/dist-esm/lint/index.js +9 -0
  170. package/dist-esm/lint/index.js.map +1 -0
  171. package/dist-esm/llmobs/index.d.ts +22 -0
  172. package/dist-esm/llmobs/index.d.ts.map +1 -0
  173. package/dist-esm/llmobs/index.js +22 -0
  174. package/dist-esm/llmobs/index.js.map +1 -0
  175. package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
  176. package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
  177. package/dist-esm/llmobs/tier1-exporter.js +190 -0
  178. package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
  179. package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
  180. package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
  181. package/dist-esm/llmobs/tier2-summarizer.js +646 -0
  182. package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
  183. package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
  184. package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
  185. package/dist-esm/node/exporters/resilient-exporter.js +125 -0
  186. package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
  187. package/dist-esm/node/index.d.ts +11 -0
  188. package/dist-esm/node/index.d.ts.map +1 -0
  189. package/dist-esm/node/index.js +11 -0
  190. package/dist-esm/node/index.js.map +1 -0
  191. package/dist-esm/node/init.d.ts +75 -0
  192. package/dist-esm/node/init.d.ts.map +1 -0
  193. package/dist-esm/node/init.js +239 -0
  194. package/dist-esm/node/init.js.map +1 -0
  195. package/dist-esm/node/log-processor.d.ts +83 -0
  196. package/dist-esm/node/log-processor.d.ts.map +1 -0
  197. package/dist-esm/node/log-processor.js +261 -0
  198. package/dist-esm/node/log-processor.js.map +1 -0
  199. package/dist-esm/node/metrics-client.d.ts +66 -0
  200. package/dist-esm/node/metrics-client.d.ts.map +1 -0
  201. package/dist-esm/node/metrics-client.js +189 -0
  202. package/dist-esm/node/metrics-client.js.map +1 -0
  203. package/dist-esm/node/traced-socket.d.ts +76 -0
  204. package/dist-esm/node/traced-socket.d.ts.map +1 -0
  205. package/dist-esm/node/traced-socket.js +257 -0
  206. package/dist-esm/node/traced-socket.js.map +1 -0
  207. package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
  208. package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
  209. package/dist-esm/testing/in-memory-exporter.js +248 -0
  210. package/dist-esm/testing/in-memory-exporter.js.map +1 -0
  211. package/dist-esm/testing/index.d.ts +8 -0
  212. package/dist-esm/testing/index.d.ts.map +1 -0
  213. package/dist-esm/testing/index.js +8 -0
  214. package/dist-esm/testing/index.js.map +1 -0
  215. package/dist-esm/testing/test-init.d.ts +80 -0
  216. package/dist-esm/testing/test-init.d.ts.map +1 -0
  217. package/dist-esm/testing/test-init.js +137 -0
  218. package/dist-esm/testing/test-init.js.map +1 -0
  219. package/dist-esm/types/index.d.ts +40 -0
  220. package/dist-esm/types/index.d.ts.map +1 -0
  221. package/dist-esm/types/index.js +7 -0
  222. package/dist-esm/types/index.js.map +1 -0
  223. package/dist-esm/types/policy.d.ts +92 -0
  224. package/dist-esm/types/policy.d.ts.map +1 -0
  225. package/dist-esm/types/policy.js +122 -0
  226. package/dist-esm/types/policy.js.map +1 -0
  227. package/package.json +101 -0
@@ -0,0 +1,646 @@
1
+ /**
2
+ * Tier 2 LLMObs Summarizer
3
+ *
4
+ * Extracts operational metrics from LLMObs spans for Tier 2 export.
5
+ * CRITICAL: This emits metrics WITHOUT any sensitive content.
6
+ *
7
+ * Tier 2 metrics include:
8
+ * - LLM latency by provider/model
9
+ * - Token usage (input, output, cached, reasoning)
10
+ * - Success/failure rates by error category
11
+ * - Cost aggregates
12
+ *
13
+ * EXPLICITLY EXCLUDED:
14
+ * - Prompts, code, tool IO
15
+ * - File paths, stack traces
16
+ * - User identifiers
17
+ */
18
+ /**
19
+ * LLMObs Tier 2 Summarizer.
20
+ *
21
+ * Processes Tier 1 LLMObs spans and emits Tier 2 metrics.
22
+ * CRITICAL: Ensures NO prompts, code, tool IO appear in metrics.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const summarizer = new LLMObsTier2Summarizer(metricsClient);
27
+ *
28
+ * // Process each LLMObs span
29
+ * for (const span of llmobsSpans) {
30
+ * summarizer.summarize(span);
31
+ * }
32
+ * ```
33
+ */
34
+ export class LLMObsTier2Summarizer {
35
+ metricsClient;
36
+ pricing;
37
+ /**
38
+ * Create a Tier 2 summarizer.
39
+ *
40
+ * @param metricsClient - Client for emitting metrics
41
+ * @param customPricing - Optional custom pricing per model
42
+ */
43
+ constructor(metricsClient, customPricing) {
44
+ this.metricsClient = metricsClient;
45
+ this.pricing = customPricing ?? this.getDefaultPricing();
46
+ }
47
+ /**
48
+ * Process a Tier 1 LLMObs span and emit Tier 2 metrics.
49
+ *
50
+ * @param span - The span to summarize
51
+ */
52
+ summarize(span) {
53
+ const spanKind = span.attributes["llmobs.span_kind"];
54
+ switch (spanKind) {
55
+ case "llm":
56
+ this.summarizeLLMSpan(span);
57
+ break;
58
+ case "tool":
59
+ this.summarizeToolSpan(span);
60
+ break;
61
+ case "workflow":
62
+ case "task":
63
+ // Workflow/task summaries are derived from child spans
64
+ // No additional metrics needed at this level
65
+ break;
66
+ default:
67
+ // Check by span name patterns
68
+ if (this.isLLMSpan(span)) {
69
+ this.summarizeLLMSpan(span);
70
+ }
71
+ else if (this.isToolSpan(span)) {
72
+ this.summarizeToolSpan(span);
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Extract a summary from an LLM span (for testing/debugging).
78
+ * Contains NO sensitive data.
79
+ *
80
+ * @param span - The span to extract from
81
+ * @returns Summary with safe metrics only
82
+ */
83
+ extractLLMSummary(span) {
84
+ const attrs = span.attributes;
85
+ // Extract provider and model from various attribute names with defensive coercion
86
+ const providerRaw = attrs["llmobs.model_provider"] ??
87
+ attrs["llm.provider"] ??
88
+ attrs["gen_ai.system"] ??
89
+ attrs["gen_ai.provider.name"];
90
+ const provider = this.normalizeProvider(providerRaw);
91
+ const providerOtel = this.normalizeProviderOtel(providerRaw);
92
+ const modelRaw = attrs["llmobs.model_name"] ??
93
+ attrs["llm.model"] ??
94
+ attrs["gen_ai.request.model"] ??
95
+ attrs["gen_ai.response.model"];
96
+ const model = this.normalizeModel(modelRaw);
97
+ // Extract response model if different from request model
98
+ const responseModelRaw = attrs["gen_ai.response.model"];
99
+ const responseModel = responseModelRaw
100
+ ? this.normalizeModel(responseModelRaw)
101
+ : undefined;
102
+ // Extract operation name (OTEL semantic convention)
103
+ const operationName = this.extractOperationName(span);
104
+ // Extract time to first token (streaming)
105
+ const timeToFirstTokenMs = this.extractTimeToFirstToken(attrs);
106
+ // Extract token counts from various attribute names, clamped to non-negative
107
+ const inputTokens = Math.max(0, attrs["llmobs.metrics.input_tokens"] ??
108
+ attrs["llmobs.metrics.inputTokens"] ??
109
+ attrs["llm.input_tokens"] ??
110
+ attrs["gen_ai.usage.input_tokens"] ??
111
+ 0);
112
+ const outputTokens = Math.max(0, attrs["llmobs.metrics.output_tokens"] ??
113
+ attrs["llmobs.metrics.outputTokens"] ??
114
+ attrs["llm.output_tokens"] ??
115
+ attrs["gen_ai.usage.output_tokens"] ??
116
+ 0);
117
+ const totalTokens = Math.max(0, attrs["llmobs.metrics.total_tokens"] ??
118
+ attrs["llmobs.metrics.totalTokens"] ??
119
+ attrs["llm.total_tokens"] ??
120
+ inputTokens + outputTokens);
121
+ const reasoningTokens = Math.max(0, attrs["llmobs.metrics.reasoning_tokens"] ??
122
+ attrs["llmobs.metrics.reasoningTokens"] ??
123
+ attrs["llm.reasoning_tokens"] ??
124
+ 0);
125
+ const cachedTokens = Math.max(0, attrs["llmobs.metrics.cache_read_tokens"] ??
126
+ attrs["llmobs.metrics.cacheReadTokens"] ??
127
+ attrs["llm.cached_tokens"] ??
128
+ 0);
129
+ // Extract status
130
+ const status = this.extractStatus(span);
131
+ const errorCategory = this.categorizeError(span);
132
+ const finishReason = this.extractFinishReason(span);
133
+ // Calculate duration
134
+ const durationMs = this.getDurationMs(span);
135
+ // Estimate cost
136
+ const estimatedCost = this.estimateCost(model, inputTokens, outputTokens);
137
+ return {
138
+ provider,
139
+ providerOtel,
140
+ model,
141
+ responseModel,
142
+ status,
143
+ durationMs,
144
+ inputTokens,
145
+ outputTokens,
146
+ totalTokens,
147
+ reasoningTokens,
148
+ cachedTokens,
149
+ errorCategory,
150
+ finishReason,
151
+ estimatedCost,
152
+ operationName,
153
+ timeToFirstTokenMs,
154
+ };
155
+ }
156
+ /**
157
+ * Extract a summary from a tool span.
158
+ *
159
+ * @param span - The span to extract from
160
+ * @returns Tool summary with safe metrics only
161
+ */
162
+ extractToolSummary(span) {
163
+ const attrs = span.attributes;
164
+ const toolName = this.normalizeToolName(attrs["tool.name"] ||
165
+ span.name.replace("tool.", "") ||
166
+ "unknown");
167
+ const status = attrs["llmobs.status"] === "error" ||
168
+ attrs["otel.status_code"] === 2 ||
169
+ attrs["error"] === true
170
+ ? "error"
171
+ : "success";
172
+ // Extract error category for tool failures (added in v0.2.0)
173
+ const errorCategory = status === "error"
174
+ ? this.categorizeToolError(span)
175
+ : "none";
176
+ return {
177
+ toolName,
178
+ status,
179
+ durationMs: this.getDurationMs(span),
180
+ errorCategory,
181
+ };
182
+ }
183
+ /**
184
+ * Emit LLM span metrics.
185
+ * Emits BOTH legacy (llm_*) and OTEL-aligned (gen_ai.*) metrics for migration.
186
+ */
187
+ summarizeLLMSpan(span) {
188
+ const summary = this.extractLLMSummary(span);
189
+ // === OTEL-ALIGNED METRICS (gen_ai.*) ===
190
+ // gen_ai.client.operation.duration (histogram with OTEL bucket boundaries)
191
+ const otelDurationLabels = {
192
+ "gen_ai.operation.name": summary.operationName,
193
+ "gen_ai.provider.name": summary.providerOtel,
194
+ "gen_ai.request.model": summary.model,
195
+ };
196
+ if (summary.responseModel) {
197
+ otelDurationLabels["gen_ai.response.model"] = summary.responseModel;
198
+ }
199
+ if (summary.status === "error" && summary.errorCategory !== "none") {
200
+ otelDurationLabels["error.type"] = summary.errorCategory;
201
+ }
202
+ this.metricsClient.recordHistogram("gen_ai.client.operation.duration", summary.durationMs / 1000, otelDurationLabels);
203
+ // gen_ai.client.token.usage (histogram for distribution insights)
204
+ const tokenBaseLabels = {
205
+ "gen_ai.operation.name": summary.operationName,
206
+ "gen_ai.provider.name": summary.providerOtel,
207
+ "gen_ai.request.model": summary.model,
208
+ };
209
+ if (summary.responseModel) {
210
+ tokenBaseLabels["gen_ai.response.model"] = summary.responseModel;
211
+ }
212
+ if (summary.inputTokens > 0) {
213
+ this.metricsClient.recordHistogram("gen_ai.client.token.usage", summary.inputTokens, { ...tokenBaseLabels, "gen_ai.token.type": "input" });
214
+ }
215
+ if (summary.outputTokens > 0) {
216
+ this.metricsClient.recordHistogram("gen_ai.client.token.usage", summary.outputTokens, { ...tokenBaseLabels, "gen_ai.token.type": "output" });
217
+ }
218
+ // gen_ai.client.time_to_first_token (streaming TTFT)
219
+ // Contract only allows operation names: chat, text_completion, generate_content
220
+ const ttftAllowedOperations = ["chat", "text_completion", "generate_content"];
221
+ if (summary.timeToFirstTokenMs !== undefined &&
222
+ summary.timeToFirstTokenMs > 0 &&
223
+ ttftAllowedOperations.includes(summary.operationName)) {
224
+ this.metricsClient.recordHistogram("gen_ai.client.time_to_first_token", summary.timeToFirstTokenMs / 1000, {
225
+ "gen_ai.operation.name": summary.operationName,
226
+ "gen_ai.provider.name": summary.providerOtel,
227
+ "gen_ai.request.model": summary.model,
228
+ });
229
+ }
230
+ // NOTE: Legacy llm_* metrics have been removed.
231
+ // Billing data flows through CloudEvents → Snowflake, not metrics.
232
+ // See: engineering/projects/o11y-refactor/billing-proposal.md
233
+ }
234
+ /**
235
+ * Emit tool span metrics.
236
+ * Uses OTEL-aligned naming with gen_ai.operation.name = "execute_tool".
237
+ */
238
+ summarizeToolSpan(span) {
239
+ const summary = this.extractToolSummary(span);
240
+ // gen_ai.client.operation.duration for tool executions
241
+ const durationLabels = {
242
+ "gen_ai.operation.name": "execute_tool",
243
+ "gen_ai.tool.name": summary.toolName,
244
+ };
245
+ if (summary.status === "error" && summary.errorCategory !== "none") {
246
+ durationLabels["error.type"] = summary.errorCategory;
247
+ }
248
+ this.metricsClient.recordHistogram("gen_ai.client.operation.duration", summary.durationMs / 1000, durationLabels);
249
+ }
250
+ /**
251
+ * Check if span is an LLM span by name pattern.
252
+ */
253
+ isLLMSpan(span) {
254
+ return (span.name.startsWith("llm.") ||
255
+ span.name.startsWith("ai.streamText") ||
256
+ span.name.includes(".llm") ||
257
+ !!span.attributes["llm.model"] ||
258
+ !!span.attributes["gen_ai.request.model"]);
259
+ }
260
+ /**
261
+ * Check if span is a tool span by name pattern.
262
+ */
263
+ isToolSpan(span) {
264
+ return (span.name.startsWith("tool.") ||
265
+ span.attributes["llmobs.span_kind"] === "tool");
266
+ }
267
+ /**
268
+ * Extract span status.
269
+ */
270
+ extractStatus(span) {
271
+ const attrs = span.attributes;
272
+ if (attrs["llmobs.status"] === "error" ||
273
+ attrs["otel.status_code"] === 2 ||
274
+ attrs["error"] === true) {
275
+ return "error";
276
+ }
277
+ return "success";
278
+ }
279
+ /**
280
+ * Categorize error from span attributes.
281
+ * CRITICAL: Does NOT expose error messages or stack traces.
282
+ */
283
+ categorizeError(span) {
284
+ if (this.extractStatus(span) !== "error") {
285
+ return "none";
286
+ }
287
+ const attrs = span.attributes;
288
+ // Check for explicit error category
289
+ const explicitCategory = attrs["llm.error_category"];
290
+ if (explicitCategory && this.isValidErrorCategory(explicitCategory)) {
291
+ return explicitCategory;
292
+ }
293
+ // Check metadata for error category (from llmobs observer)
294
+ const metadata = attrs["llmobs.metadata"];
295
+ if (metadata) {
296
+ try {
297
+ const parsed = JSON.parse(metadata);
298
+ if (parsed.errorCategory &&
299
+ this.isValidErrorCategory(parsed.errorCategory)) {
300
+ return parsed.errorCategory;
301
+ }
302
+ }
303
+ catch {
304
+ // Ignore parse errors
305
+ }
306
+ }
307
+ // Infer from tags (safe - checking boolean flags with strict comparison)
308
+ const tags = attrs["llmobs.tags"];
309
+ if (tags) {
310
+ try {
311
+ const parsed = JSON.parse(tags);
312
+ // Use strict === true to avoid truthy coercion of arbitrary values
313
+ if (parsed.wasAborted === true)
314
+ return "aborted";
315
+ if (parsed.errorCategory &&
316
+ this.isValidErrorCategory(parsed.errorCategory)) {
317
+ return parsed.errorCategory;
318
+ }
319
+ }
320
+ catch {
321
+ // Ignore parse errors
322
+ }
323
+ }
324
+ return "unknown";
325
+ }
326
+ /**
327
+ * Extract finish reason.
328
+ * Handles gen_ai.response.finish_reasons as array per OTEL semantic conventions.
329
+ */
330
+ extractFinishReason(span) {
331
+ const attrs = span.attributes;
332
+ // Try single-value attribute first
333
+ const singleReason = attrs["llm.finish_reason"];
334
+ if (typeof singleReason === "string" && this.isValidFinishReason(singleReason)) {
335
+ return singleReason;
336
+ }
337
+ // Handle finish_reasons as array (OTEL semantic conventions uses plural/array)
338
+ const reasons = attrs["gen_ai.response.finish_reasons"];
339
+ if (Array.isArray(reasons) && reasons.length > 0) {
340
+ const firstReason = String(reasons[0]);
341
+ if (this.isValidFinishReason(firstReason)) {
342
+ return firstReason;
343
+ }
344
+ }
345
+ else if (typeof reasons === "string" && this.isValidFinishReason(reasons)) {
346
+ return reasons;
347
+ }
348
+ return undefined;
349
+ }
350
+ /**
351
+ * Normalize provider name to allowed values.
352
+ * Defensive: handles non-string inputs gracefully.
353
+ */
354
+ normalizeProvider(provider) {
355
+ // Defensive string coercion - handles objects with toString()
356
+ if (provider == null)
357
+ return "openai";
358
+ const providerStr = typeof provider === "string" ? provider : String(provider);
359
+ const normalized = providerStr.toLowerCase();
360
+ const mapping = {
361
+ openai: "openai",
362
+ anthropic: "anthropic",
363
+ claude: "anthropic",
364
+ azure: "azure",
365
+ azure_openai: "azure",
366
+ bedrock: "bedrock",
367
+ aws_bedrock: "bedrock",
368
+ google: "google",
369
+ gemini: "google",
370
+ cohere: "cohere",
371
+ mistral: "mistral",
372
+ };
373
+ return mapping[normalized] ?? "openai"; // Default to openai for unknown
374
+ }
375
+ /**
376
+ * Normalize provider to OTEL canonical names.
377
+ * Maps legacy names to OTEL gen_ai.provider.name values.
378
+ * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/
379
+ */
380
+ normalizeProviderOtel(provider) {
381
+ if (provider == null)
382
+ return "openai";
383
+ const providerStr = typeof provider === "string" ? provider : String(provider);
384
+ const normalized = providerStr.toLowerCase();
385
+ const mapping = {
386
+ openai: "openai",
387
+ anthropic: "anthropic",
388
+ claude: "anthropic",
389
+ azure: "azure.ai.openai",
390
+ azure_openai: "azure.ai.openai",
391
+ "azure.ai.openai": "azure.ai.openai",
392
+ "azure.ai.inference": "azure.ai.inference",
393
+ bedrock: "aws.bedrock",
394
+ aws_bedrock: "aws.bedrock",
395
+ "aws.bedrock": "aws.bedrock",
396
+ google: "gcp.vertex_ai",
397
+ gemini: "gcp.gemini",
398
+ vertex: "gcp.vertex_ai",
399
+ "gcp.gemini": "gcp.gemini",
400
+ "gcp.vertex_ai": "gcp.vertex_ai",
401
+ cohere: "cohere",
402
+ mistral: "mistral_ai",
403
+ mistral_ai: "mistral_ai",
404
+ deepseek: "deepseek",
405
+ groq: "groq",
406
+ };
407
+ return mapping[normalized] ?? "openai";
408
+ }
409
+ /**
410
+ * Extract operation name from span attributes.
411
+ * Maps span kind and attributes to OTEL gen_ai.operation.name values.
412
+ */
413
+ extractOperationName(span) {
414
+ const attrs = span.attributes;
415
+ // Check for explicit operation name
416
+ const explicit = attrs["gen_ai.operation.name"];
417
+ if (explicit && this.isValidOperationName(explicit)) {
418
+ return explicit;
419
+ }
420
+ // Infer from span kind
421
+ const spanKind = attrs["llmobs.span_kind"];
422
+ if (spanKind === "tool")
423
+ return "execute_tool";
424
+ if (spanKind === "workflow" || spanKind === "agent")
425
+ return "invoke_agent";
426
+ if (spanKind === "embedding")
427
+ return "embeddings";
428
+ // Infer from span name
429
+ const spanName = span.name.toLowerCase();
430
+ if (spanName.includes("embed"))
431
+ return "embeddings";
432
+ if (spanName.includes("agent") || spanName.includes("clark"))
433
+ return "invoke_agent";
434
+ if (spanName.includes("tool"))
435
+ return "execute_tool";
436
+ if (spanName.includes("complete") && !spanName.includes("chat"))
437
+ return "text_completion";
438
+ // Default to chat (most common)
439
+ return "chat";
440
+ }
441
+ /**
442
+ * Extract time to first token from span attributes.
443
+ * Checks multiple attribute names for compatibility.
444
+ * Returns value in MILLISECONDS for consistent internal handling.
445
+ *
446
+ * IMPORTANT: Different attributes use different units:
447
+ * - gen_ai.client.time_to_first_token: SECONDS (OTEL spec)
448
+ * - llm.time_to_first_token_ms: MILLISECONDS
449
+ * - llmobs.metrics.time_to_first_token_ms: MILLISECONDS
450
+ * - timeToFirstTokenMs: MILLISECONDS
451
+ */
452
+ extractTimeToFirstToken(attrs) {
453
+ // Check OTEL attribute first (in SECONDS) - convert to milliseconds
454
+ const ttftSeconds = attrs["gen_ai.client.time_to_first_token"];
455
+ if (typeof ttftSeconds === "number" && ttftSeconds > 0) {
456
+ return ttftSeconds * 1000; // Convert seconds to milliseconds
457
+ }
458
+ // Check millisecond-based attributes
459
+ const ttftMs = attrs["llm.time_to_first_token_ms"] ??
460
+ attrs["llmobs.metrics.time_to_first_token_ms"] ??
461
+ attrs["timeToFirstTokenMs"];
462
+ if (typeof ttftMs === "number" && ttftMs > 0) {
463
+ return ttftMs; // Already in milliseconds
464
+ }
465
+ return undefined;
466
+ }
467
+ /**
468
+ * Categorize tool errors.
469
+ * CRITICAL: Does NOT expose error messages or stack traces.
470
+ */
471
+ categorizeToolError(span) {
472
+ const attrs = span.attributes;
473
+ // Check for explicit error category
474
+ const explicit = attrs["tool.error_category"];
475
+ if (explicit && this.isValidToolErrorCategory(explicit)) {
476
+ return explicit;
477
+ }
478
+ // Check metadata
479
+ const metadata = attrs["llmobs.metadata"];
480
+ if (metadata) {
481
+ try {
482
+ const parsed = JSON.parse(metadata);
483
+ if (parsed.toolErrorCategory &&
484
+ this.isValidToolErrorCategory(parsed.toolErrorCategory)) {
485
+ return parsed.toolErrorCategory;
486
+ }
487
+ }
488
+ catch {
489
+ // Ignore parse errors
490
+ }
491
+ }
492
+ // Infer from error type patterns (safe - checking enum values only)
493
+ const errorType = attrs["error.type"];
494
+ if (errorType) {
495
+ const normalized = errorType.toLowerCase();
496
+ if (normalized.includes("timeout"))
497
+ return "timeout";
498
+ if (normalized.includes("permission") || normalized.includes("auth"))
499
+ return "permission_denied";
500
+ if (normalized.includes("not_found") || normalized.includes("notfound"))
501
+ return "not_found";
502
+ if (normalized.includes("validation") || normalized.includes("invalid"))
503
+ return "validation_error";
504
+ }
505
+ return "execution_error"; // Default for tool errors
506
+ }
507
+ /**
508
+ * Validate operation name is in the allowed enum.
509
+ */
510
+ isValidOperationName(name) {
511
+ const valid = [
512
+ "chat",
513
+ "text_completion",
514
+ "embeddings",
515
+ "execute_tool",
516
+ "invoke_agent",
517
+ "generate_content",
518
+ ];
519
+ return valid.includes(name);
520
+ }
521
+ /**
522
+ * Validate tool error category is in the allowed enum.
523
+ */
524
+ isValidToolErrorCategory(category) {
525
+ const valid = [
526
+ "none",
527
+ "timeout",
528
+ "execution_error",
529
+ "validation_error",
530
+ "permission_denied",
531
+ "not_found",
532
+ "unknown",
533
+ ];
534
+ return valid.includes(category);
535
+ }
536
+ /**
537
+ * Normalize model name with strict sanitization.
538
+ * SECURITY: Only allows alphanumeric, dots, hyphens to prevent data injection.
539
+ * Attacker-controlled model names could otherwise leak sensitive data to Tier 2.
540
+ */
541
+ normalizeModel(model) {
542
+ // Defensive string coercion - handles objects with toString()
543
+ if (model == null)
544
+ return "unknown";
545
+ const modelStr = typeof model === "string" ? model : String(model);
546
+ // Strict allowlist: alphanumeric, dots, hyphens only
547
+ const sanitized = modelStr
548
+ .toLowerCase()
549
+ .replace(/[^a-z0-9.-]/g, "")
550
+ .slice(0, 64);
551
+ // Remove date version suffixes for cardinality control
552
+ return sanitized.replace(/[-_]?\d{4}[-_]?\d{2}[-_]?\d{2}$/, "") || "unknown";
553
+ }
554
+ /**
555
+ * Normalize tool name with strict sanitization.
556
+ * SECURITY: Only allows alphanumeric, underscores, hyphens to prevent data injection.
557
+ * Attacker-controlled tool names could otherwise leak sensitive data to Tier 2.
558
+ */
559
+ normalizeToolName(toolName) {
560
+ // Defensive string coercion - handles objects with toString()
561
+ if (toolName == null)
562
+ return "unknown";
563
+ const toolStr = typeof toolName === "string" ? toolName : String(toolName);
564
+ return (toolStr
565
+ .toLowerCase()
566
+ .replace(/[^a-z0-9_-]/g, "_")
567
+ .replace(/_+/g, "_") // Collapse multiple underscores
568
+ .replace(/^_|_$/g, "") // Trim leading/trailing
569
+ .slice(0, 50) || "unknown");
570
+ }
571
+ /**
572
+ * Get span duration in milliseconds, clamped to non-negative.
573
+ * Handles clock skew or corrupted data gracefully.
574
+ */
575
+ getDurationMs(span) {
576
+ const [startSecs, startNanos] = span.startTime;
577
+ const [endSecs, endNanos] = span.endTime;
578
+ const durationMs = (endSecs - startSecs) * 1000 + (endNanos - startNanos) / 1e6;
579
+ return Math.max(0, durationMs);
580
+ }
581
+ /**
582
+ * Validate error category is in the allowed enum.
583
+ */
584
+ isValidErrorCategory(category) {
585
+ const valid = [
586
+ "none",
587
+ "rate_limit",
588
+ "context_length",
589
+ "content_filter",
590
+ "quota",
591
+ "network",
592
+ "timeout",
593
+ "auth_error",
594
+ "api_error",
595
+ "validation_error",
596
+ "aborted",
597
+ "unknown",
598
+ ];
599
+ return valid.includes(category);
600
+ }
601
+ /**
602
+ * Validate finish reason is in the allowed enum.
603
+ */
604
+ isValidFinishReason(reason) {
605
+ const valid = [
606
+ "stop",
607
+ "length",
608
+ "content_filter",
609
+ "tool_calls",
610
+ "error",
611
+ ];
612
+ return valid.includes(reason);
613
+ }
614
+ /**
615
+ * Estimate cost based on model and token counts.
616
+ * Uses rough estimates - actual costs should be calculated server-side.
617
+ */
618
+ estimateCost(model, inputTokens, outputTokens) {
619
+ const pricing = this.pricing.get(model) || this.pricing.get("default");
620
+ if (!pricing)
621
+ return 0;
622
+ return inputTokens * pricing.input + outputTokens * pricing.output;
623
+ }
624
+ /**
625
+ * Get default pricing per 1000 tokens (in USD).
626
+ */
627
+ getDefaultPricing() {
628
+ return new Map([
629
+ // OpenAI
630
+ ["gpt-4", { input: 0.00003, output: 0.00006 }],
631
+ ["gpt-4-turbo", { input: 0.00001, output: 0.00003 }],
632
+ ["gpt-4o", { input: 0.000005, output: 0.000015 }],
633
+ ["gpt-4o-mini", { input: 0.00000015, output: 0.0000006 }],
634
+ ["gpt-3.5-turbo", { input: 0.0000005, output: 0.0000015 }],
635
+ // Anthropic
636
+ ["claude-3-opus", { input: 0.000015, output: 0.000075 }],
637
+ ["claude-3-sonnet", { input: 0.000003, output: 0.000015 }],
638
+ ["claude-3-haiku", { input: 0.00000025, output: 0.00000125 }],
639
+ ["claude-3.5-sonnet", { input: 0.000003, output: 0.000015 }],
640
+ ["claude-sonnet", { input: 0.000003, output: 0.000015 }],
641
+ // Default fallback
642
+ ["default", { input: 0.000001, output: 0.000003 }],
643
+ ]);
644
+ }
645
+ }
646
+ //# sourceMappingURL=tier2-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier2-summarizer.js","sourceRoot":"","sources":["../../src/llmobs/tier2-summarizer.ts"],"names":[],"mappings":"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"}