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