@microsoft/agents-a365-observability 0.1.0-preview.30

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 (130) hide show
  1. package/README.md +33 -0
  2. package/dist/cjs/ObservabilityBuilder.d.ts +61 -0
  3. package/dist/cjs/ObservabilityBuilder.d.ts.map +1 -0
  4. package/dist/cjs/ObservabilityBuilder.js +141 -0
  5. package/dist/cjs/ObservabilityBuilder.js.map +1 -0
  6. package/dist/cjs/ObservabilityManager.d.ts +29 -0
  7. package/dist/cjs/ObservabilityManager.d.ts.map +1 -0
  8. package/dist/cjs/ObservabilityManager.js +61 -0
  9. package/dist/cjs/ObservabilityManager.js.map +1 -0
  10. package/dist/cjs/index.d.ts +10 -0
  11. package/dist/cjs/index.d.ts.map +1 -0
  12. package/dist/cjs/index.js +33 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/tracing/constants.d.ts +83 -0
  15. package/dist/cjs/tracing/constants.d.ts.map +1 -0
  16. package/dist/cjs/tracing/constants.js +101 -0
  17. package/dist/cjs/tracing/constants.js.map +1 -0
  18. package/dist/cjs/tracing/contracts.d.ts +186 -0
  19. package/dist/cjs/tracing/contracts.d.ts.map +1 -0
  20. package/dist/cjs/tracing/contracts.js +44 -0
  21. package/dist/cjs/tracing/contracts.js.map +1 -0
  22. package/dist/cjs/tracing/exporter/Agent365Exporter.d.ts +53 -0
  23. package/dist/cjs/tracing/exporter/Agent365Exporter.d.ts.map +1 -0
  24. package/dist/cjs/tracing/exporter/Agent365Exporter.js +318 -0
  25. package/dist/cjs/tracing/exporter/Agent365Exporter.js.map +1 -0
  26. package/dist/cjs/tracing/exporter/utils.d.ts +38 -0
  27. package/dist/cjs/tracing/exporter/utils.d.ts.map +1 -0
  28. package/dist/cjs/tracing/exporter/utils.js +126 -0
  29. package/dist/cjs/tracing/exporter/utils.js.map +1 -0
  30. package/dist/cjs/tracing/middleware/BaggageBuilder.d.ts +182 -0
  31. package/dist/cjs/tracing/middleware/BaggageBuilder.d.ts.map +1 -0
  32. package/dist/cjs/tracing/middleware/BaggageBuilder.js +297 -0
  33. package/dist/cjs/tracing/middleware/BaggageBuilder.js.map +1 -0
  34. package/dist/cjs/tracing/processors/SpanProcessor.d.ts +30 -0
  35. package/dist/cjs/tracing/processors/SpanProcessor.d.ts.map +1 -0
  36. package/dist/cjs/tracing/processors/SpanProcessor.js +98 -0
  37. package/dist/cjs/tracing/processors/SpanProcessor.js.map +1 -0
  38. package/dist/cjs/tracing/processors/util.d.ts +9 -0
  39. package/dist/cjs/tracing/processors/util.d.ts.map +1 -0
  40. package/dist/cjs/tracing/processors/util.js +50 -0
  41. package/dist/cjs/tracing/processors/util.js.map +1 -0
  42. package/dist/cjs/tracing/scopes/ExecuteToolScope.d.ts +22 -0
  43. package/dist/cjs/tracing/scopes/ExecuteToolScope.d.ts.map +1 -0
  44. package/dist/cjs/tracing/scopes/ExecuteToolScope.js +51 -0
  45. package/dist/cjs/tracing/scopes/ExecuteToolScope.js.map +1 -0
  46. package/dist/cjs/tracing/scopes/InferenceScope.d.ts +47 -0
  47. package/dist/cjs/tracing/scopes/InferenceScope.d.ts.map +1 -0
  48. package/dist/cjs/tracing/scopes/InferenceScope.js +83 -0
  49. package/dist/cjs/tracing/scopes/InferenceScope.js.map +1 -0
  50. package/dist/cjs/tracing/scopes/InvokeAgentScope.d.ts +33 -0
  51. package/dist/cjs/tracing/scopes/InvokeAgentScope.d.ts.map +1 -0
  52. package/dist/cjs/tracing/scopes/InvokeAgentScope.js +94 -0
  53. package/dist/cjs/tracing/scopes/InvokeAgentScope.js.map +1 -0
  54. package/dist/cjs/tracing/scopes/OpenTelemetryScope.d.ts +57 -0
  55. package/dist/cjs/tracing/scopes/OpenTelemetryScope.d.ts.map +1 -0
  56. package/dist/cjs/tracing/scopes/OpenTelemetryScope.js +146 -0
  57. package/dist/cjs/tracing/scopes/OpenTelemetryScope.js.map +1 -0
  58. package/dist/cjs/tracing/util.d.ts +9 -0
  59. package/dist/cjs/tracing/util.d.ts.map +1 -0
  60. package/dist/cjs/tracing/util.js +28 -0
  61. package/dist/cjs/tracing/util.js.map +1 -0
  62. package/dist/cjs/utils/logging.d.ts +11 -0
  63. package/dist/cjs/utils/logging.d.ts.map +1 -0
  64. package/dist/cjs/utils/logging.js +84 -0
  65. package/dist/cjs/utils/logging.js.map +1 -0
  66. package/dist/esm/ObservabilityBuilder.d.ts +61 -0
  67. package/dist/esm/ObservabilityBuilder.d.ts.map +1 -0
  68. package/dist/esm/ObservabilityBuilder.js +137 -0
  69. package/dist/esm/ObservabilityBuilder.js.map +1 -0
  70. package/dist/esm/ObservabilityManager.d.ts +29 -0
  71. package/dist/esm/ObservabilityManager.d.ts.map +1 -0
  72. package/dist/esm/ObservabilityManager.js +57 -0
  73. package/dist/esm/ObservabilityManager.js.map +1 -0
  74. package/dist/esm/index.d.ts +10 -0
  75. package/dist/esm/index.d.ts.map +1 -0
  76. package/dist/esm/index.js +18 -0
  77. package/dist/esm/index.js.map +1 -0
  78. package/dist/esm/tracing/constants.d.ts +83 -0
  79. package/dist/esm/tracing/constants.d.ts.map +1 -0
  80. package/dist/esm/tracing/constants.js +97 -0
  81. package/dist/esm/tracing/constants.js.map +1 -0
  82. package/dist/esm/tracing/contracts.d.ts +186 -0
  83. package/dist/esm/tracing/contracts.d.ts.map +1 -0
  84. package/dist/esm/tracing/contracts.js +41 -0
  85. package/dist/esm/tracing/contracts.js.map +1 -0
  86. package/dist/esm/tracing/exporter/Agent365Exporter.d.ts +53 -0
  87. package/dist/esm/tracing/exporter/Agent365Exporter.d.ts.map +1 -0
  88. package/dist/esm/tracing/exporter/Agent365Exporter.js +281 -0
  89. package/dist/esm/tracing/exporter/Agent365Exporter.js.map +1 -0
  90. package/dist/esm/tracing/exporter/utils.d.ts +38 -0
  91. package/dist/esm/tracing/exporter/utils.d.ts.map +1 -0
  92. package/dist/esm/tracing/exporter/utils.js +113 -0
  93. package/dist/esm/tracing/exporter/utils.js.map +1 -0
  94. package/dist/esm/tracing/middleware/BaggageBuilder.d.ts +182 -0
  95. package/dist/esm/tracing/middleware/BaggageBuilder.d.ts.map +1 -0
  96. package/dist/esm/tracing/middleware/BaggageBuilder.js +292 -0
  97. package/dist/esm/tracing/middleware/BaggageBuilder.js.map +1 -0
  98. package/dist/esm/tracing/processors/SpanProcessor.d.ts +30 -0
  99. package/dist/esm/tracing/processors/SpanProcessor.d.ts.map +1 -0
  100. package/dist/esm/tracing/processors/SpanProcessor.js +94 -0
  101. package/dist/esm/tracing/processors/SpanProcessor.js.map +1 -0
  102. package/dist/esm/tracing/processors/util.d.ts +9 -0
  103. package/dist/esm/tracing/processors/util.d.ts.map +1 -0
  104. package/dist/esm/tracing/processors/util.js +47 -0
  105. package/dist/esm/tracing/processors/util.js.map +1 -0
  106. package/dist/esm/tracing/scopes/ExecuteToolScope.d.ts +22 -0
  107. package/dist/esm/tracing/scopes/ExecuteToolScope.d.ts.map +1 -0
  108. package/dist/esm/tracing/scopes/ExecuteToolScope.js +47 -0
  109. package/dist/esm/tracing/scopes/ExecuteToolScope.js.map +1 -0
  110. package/dist/esm/tracing/scopes/InferenceScope.d.ts +47 -0
  111. package/dist/esm/tracing/scopes/InferenceScope.d.ts.map +1 -0
  112. package/dist/esm/tracing/scopes/InferenceScope.js +79 -0
  113. package/dist/esm/tracing/scopes/InferenceScope.js.map +1 -0
  114. package/dist/esm/tracing/scopes/InvokeAgentScope.d.ts +33 -0
  115. package/dist/esm/tracing/scopes/InvokeAgentScope.d.ts.map +1 -0
  116. package/dist/esm/tracing/scopes/InvokeAgentScope.js +90 -0
  117. package/dist/esm/tracing/scopes/InvokeAgentScope.js.map +1 -0
  118. package/dist/esm/tracing/scopes/OpenTelemetryScope.d.ts +57 -0
  119. package/dist/esm/tracing/scopes/OpenTelemetryScope.d.ts.map +1 -0
  120. package/dist/esm/tracing/scopes/OpenTelemetryScope.js +139 -0
  121. package/dist/esm/tracing/scopes/OpenTelemetryScope.js.map +1 -0
  122. package/dist/esm/tracing/util.d.ts +9 -0
  123. package/dist/esm/tracing/util.d.ts.map +1 -0
  124. package/dist/esm/tracing/util.js +23 -0
  125. package/dist/esm/tracing/util.js.map +1 -0
  126. package/dist/esm/utils/logging.d.ts +11 -0
  127. package/dist/esm/utils/logging.d.ts.map +1 -0
  128. package/dist/esm/utils/logging.js +81 -0
  129. package/dist/esm/utils/logging.js.map +1 -0
  130. package/package.json +69 -0
@@ -0,0 +1,281 @@
1
+ import { ExportResultCode } from '@opentelemetry/core';
2
+ import { PowerPlatformApiDiscovery } from '@microsoft/agents-a365-runtime';
3
+ import { partitionByIdentity, parseIdentityKey, hexTraceId, hexSpanId, kindName, statusName } from './utils';
4
+ import logger, { formatError } from '../../utils/logging';
5
+ const DEFAULT_HTTP_TIMEOUT_SECONDS = 30000; // 30 seconds in ms
6
+ const DEFAULT_MAX_RETRIES = 3;
7
+ /**
8
+ * Observability span exporter for Agent365:
9
+ * - Partitions spans by (tenantId, agentId)
10
+ * - Builds OTLP-like JSON: resourceSpans -> scopeSpans -> spans
11
+ * - POSTs per group to https://{endpoint}/maven/agent365/agents/{agentId}/traces?api-version=1
12
+ * - Adds Bearer token via token_resolver(agentId, tenantId)
13
+ */
14
+ export class Agent365Exporter {
15
+ constructor(tokenResolver, clusterCategory = 'prod') {
16
+ this.closed = false;
17
+ if (!tokenResolver) {
18
+ logger.error('[Agent365Exporter] token_resolver is not provided');
19
+ throw new Error('token_resolver must be provided.');
20
+ }
21
+ this.tokenResolver = tokenResolver;
22
+ this.clusterCategory = clusterCategory;
23
+ }
24
+ /**
25
+ * Export spans to Agent365 service
26
+ */
27
+ async export(spans, resultCallback) {
28
+ if (this.closed) {
29
+ resultCallback({ code: ExportResultCode.FAILED });
30
+ return;
31
+ }
32
+ try {
33
+ logger.info(`[Agent365Exporter] Exporting ${spans.length} spans`);
34
+ const groups = partitionByIdentity(spans);
35
+ if (groups.size === 0) {
36
+ logger.info('[Agent365Exporter] No groups to export');
37
+ resultCallback({ code: ExportResultCode.SUCCESS });
38
+ return;
39
+ }
40
+ logger.info(`[Agent365Exporter] Exporting ${groups.size} identity groups`);
41
+ let anyFailure = false;
42
+ const promises = [];
43
+ for (const [identityKey, activities] of groups) {
44
+ const promise = this.exportGroup(identityKey, activities).catch(() => {
45
+ anyFailure = true;
46
+ });
47
+ promises.push(promise);
48
+ }
49
+ await Promise.all(promises);
50
+ logger.info(`[Agent365Exporter] Export completed. Success: ${!anyFailure}`);
51
+ resultCallback({
52
+ code: anyFailure ? ExportResultCode.FAILED : ExportResultCode.SUCCESS
53
+ });
54
+ }
55
+ catch (error) {
56
+ // Exporters should not raise; signal failure
57
+ resultCallback({ code: ExportResultCode.FAILED });
58
+ }
59
+ }
60
+ /**
61
+ * Export a group of spans for a specific identity
62
+ */
63
+ async exportGroup(identityKey, spans) {
64
+ const { tenantId, agentId } = parseIdentityKey(identityKey);
65
+ logger.info(`[Agent365Exporter] Exporting ${spans.length} spans for tenantId: ${tenantId}, agentId: ${agentId}`);
66
+ const payload = this.buildExportRequest(spans);
67
+ const body = JSON.stringify(payload);
68
+ // Resolve endpoint + token based on cluster category (defaults to 'prod')
69
+ const discovery = new PowerPlatformApiDiscovery(this.clusterCategory);
70
+ const endpoint = discovery.getTenantIslandClusterEndpoint(tenantId);
71
+ const url = `https://${endpoint}/maven/agent365/agents/${agentId}/traces?api-version=1`;
72
+ logger.info(`[Agent365Exporter] Resolved endpoint: ${endpoint}`);
73
+ const headers = {
74
+ 'content-type': 'application/json'
75
+ };
76
+ const tokenResult = this.tokenResolver(agentId, tenantId);
77
+ const token = tokenResult instanceof Promise ? await tokenResult : tokenResult;
78
+ if (token) {
79
+ headers['authorization'] = `Bearer ${token}`;
80
+ logger.info('[Agent365Exporter] Token resolved successfully');
81
+ }
82
+ else {
83
+ logger.error('[Agent365Exporter] No token resolved');
84
+ }
85
+ // Basic retry loop
86
+ const ok = await this.postWithRetries(url, body, headers);
87
+ if (!ok) {
88
+ logger.error('[Agent365Exporter] Failed to export spans');
89
+ throw new Error('Failed to export spans');
90
+ }
91
+ logger.info('[Agent365Exporter] Successfully exported spans');
92
+ }
93
+ /**
94
+ * HTTP POST with retry logic
95
+ */
96
+ async postWithRetries(url, body, headers) {
97
+ for (let attempt = 0; attempt <= DEFAULT_MAX_RETRIES; attempt++) {
98
+ let correlationId;
99
+ try {
100
+ logger.info(`[Agent365Exporter] Posting OTLP export request - Attempt ${attempt + 1}`);
101
+ const response = await fetch(url, {
102
+ method: 'POST',
103
+ headers,
104
+ body,
105
+ signal: AbortSignal.timeout(DEFAULT_HTTP_TIMEOUT_SECONDS)
106
+ });
107
+ correlationId = response?.headers?.get('x-ms-correlation-id') || response?.headers?.get('x-correlation-id') || 'unknown';
108
+ // 2xx => success
109
+ if (response.status >= 200 && response.status < 300) {
110
+ logger.info(`[Agent365Exporter] Success with status ${response.status}, correlation ID: ${correlationId}`);
111
+ return true;
112
+ }
113
+ // Retry transient errors
114
+ if ([408, 429].includes(response.status) || (response.status >= 500 && response.status < 600)) {
115
+ if (attempt < DEFAULT_MAX_RETRIES) {
116
+ const sleepMs = 200 * (attempt + 1);
117
+ logger.warn(`[Agent365Exporter] Transient error ${response.status}, correlation ID: ${correlationId}, retrying after ${sleepMs}ms`);
118
+ await this.sleep(sleepMs);
119
+ continue;
120
+ }
121
+ }
122
+ logger.error(`[Agent365Exporter] Failed with status ${response.status}, correlation ID: ${correlationId}`);
123
+ return false;
124
+ }
125
+ catch (error) {
126
+ logger.error('[Agent365Exporter] Request error:', formatError(error));
127
+ if (attempt < DEFAULT_MAX_RETRIES) {
128
+ const sleepMs = 200 * (attempt + 1);
129
+ logger.info(`[Agent365Exporter] Retrying after ${sleepMs}ms`);
130
+ await this.sleep(sleepMs);
131
+ continue;
132
+ }
133
+ return false;
134
+ }
135
+ }
136
+ return false;
137
+ }
138
+ /**
139
+ * Sleep for specified milliseconds
140
+ */
141
+ sleep(ms) {
142
+ return new Promise(resolve => setTimeout(resolve, ms));
143
+ }
144
+ /**
145
+ * Build OTLP export request payload
146
+ */
147
+ buildExportRequest(spans) {
148
+ // Group by instrumentation scope (name, version)
149
+ const scopeMap = new Map();
150
+ logger.info('[Agent365Exporter] Building OTLP export request payload');
151
+ for (const sp of spans) {
152
+ const scope = sp.instrumentationScope || sp.instrumentationLibrary;
153
+ const scopeKey = `${scope?.name || 'unknown'}:${scope?.version || ''}`;
154
+ const existing = scopeMap.get(scopeKey) || [];
155
+ existing.push(this.mapSpan(sp));
156
+ scopeMap.set(scopeKey, existing);
157
+ }
158
+ const scopeSpans = [];
159
+ for (const [scopeKey, mappedSpans] of scopeMap) {
160
+ const [name, version] = scopeKey.split(':');
161
+ scopeSpans.push({
162
+ scope: {
163
+ name,
164
+ version: version || undefined,
165
+ },
166
+ spans: mappedSpans,
167
+ });
168
+ }
169
+ // Resource attributes (from the first span - all spans in a batch usually share resource)
170
+ let resourceAttrs = {};
171
+ if (spans.length > 0) {
172
+ const firstSpanResource = spans[0].resource?.attributes;
173
+ if (firstSpanResource) {
174
+ resourceAttrs = { ...firstSpanResource };
175
+ }
176
+ }
177
+ return {
178
+ resourceSpans: [
179
+ {
180
+ resource: { attributes: Object.keys(resourceAttrs).length > 0 ? resourceAttrs : null },
181
+ scopeSpans,
182
+ }
183
+ ]
184
+ };
185
+ }
186
+ /**
187
+ * Map a ReadableSpan to OTLP span format
188
+ */
189
+ mapSpan(sp) {
190
+ const spanContext = sp.spanContext();
191
+ // Extract parent span ID - check multiple possible sources
192
+ let parentSpanIdHex = undefined;
193
+ const parentContext = sp.parentSpanContext;
194
+ if (parentContext?.spanId && parentContext.spanId !== '0000000000000000') {
195
+ parentSpanIdHex = hexSpanId(parentContext.spanId);
196
+ }
197
+ // attributes
198
+ const attrs = sp.attributes ? { ...sp.attributes } : {};
199
+ // events
200
+ const events = [];
201
+ for (const ev of sp.events || []) {
202
+ // Handle both hrtime arrays and direct nanosecond timestamps
203
+ let timeNs;
204
+ if (Array.isArray(ev.time)) {
205
+ timeNs = ev.time[0] * 1000000000 + ev.time[1];
206
+ }
207
+ else {
208
+ timeNs = ev.time;
209
+ }
210
+ const evAttrs = ev.attributes && Object.keys(ev.attributes).length > 0 ? { ...ev.attributes } : null;
211
+ events.push({
212
+ timeUnixNano: timeNs,
213
+ name: ev.name,
214
+ attributes: evAttrs,
215
+ });
216
+ }
217
+ // links
218
+ const links = [];
219
+ for (const ln of sp.links || []) {
220
+ const lnAttrs = ln.attributes && Object.keys(ln.attributes).length > 0 ? { ...ln.attributes } : null;
221
+ links.push({
222
+ traceId: hexTraceId(ln.context.traceId),
223
+ spanId: hexSpanId(ln.context.spanId),
224
+ attributes: lnAttrs,
225
+ });
226
+ }
227
+ // status
228
+ const statusCode = sp.status?.code ?? 0; // Default to UNSET (0) if no status
229
+ const status = {
230
+ code: statusName(statusCode),
231
+ message: sp.status?.message || '',
232
+ };
233
+ // Convert hrtime to nanoseconds - handle both hrtime arrays and direct nanosecond values
234
+ let startTimeNs;
235
+ let endTimeNs;
236
+ if (Array.isArray(sp.startTime)) {
237
+ // hrtime format [seconds, nanoseconds]
238
+ startTimeNs = sp.startTime[0] * 1000000000 + sp.startTime[1];
239
+ }
240
+ else {
241
+ // Direct nanosecond value
242
+ startTimeNs = sp.startTime;
243
+ }
244
+ if (Array.isArray(sp.endTime)) {
245
+ // hrtime format [seconds, nanoseconds]
246
+ endTimeNs = sp.endTime[0] * 1000000000 + sp.endTime[1];
247
+ }
248
+ else {
249
+ // Direct nanosecond value
250
+ endTimeNs = sp.endTime;
251
+ }
252
+ return {
253
+ traceId: hexTraceId(spanContext.traceId),
254
+ spanId: hexSpanId(spanContext.spanId),
255
+ parentSpanId: parentSpanIdHex,
256
+ name: sp.name,
257
+ kind: kindName(sp.kind),
258
+ startTimeUnixNano: startTimeNs,
259
+ endTimeUnixNano: endTimeNs,
260
+ attributes: Object.keys(attrs).length > 0 ? attrs : null,
261
+ events: events.length > 0 ? events : null,
262
+ links: links.length > 0 ? links : null,
263
+ status,
264
+ };
265
+ }
266
+ /**
267
+ * Shutdown the exporter
268
+ */
269
+ async shutdown() {
270
+ logger.info('[Agent365Exporter] Shutting down exporter');
271
+ this.closed = true;
272
+ }
273
+ /**
274
+ * Force flush any pending spans
275
+ */
276
+ async forceFlush() {
277
+ // No-op for this implementation
278
+ return Promise.resolve();
279
+ }
280
+ }
281
+ //# sourceMappingURL=Agent365Exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Agent365Exporter.js","sourceRoot":"","sources":["../../../../src/tracing/exporter/Agent365Exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
+ import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
3
+ /**
4
+ * Convert trace ID to hex string format
5
+ */
6
+ export declare function hexTraceId(value: string | number): string;
7
+ /**
8
+ * Convert span ID to hex string format
9
+ */
10
+ export declare function hexSpanId(value: string | number): string;
11
+ /**
12
+ * Convert any value to string, handling null/undefined
13
+ */
14
+ export declare function asStr(v: unknown): string | undefined;
15
+ /**
16
+ * Get span kind name from SpanKind enum
17
+ */
18
+ export declare function kindName(kind: SpanKind): string;
19
+ /**
20
+ * Get status name from SpanStatusCode enum
21
+ */
22
+ export declare function statusName(code: SpanStatusCode): string;
23
+ /**
24
+ * Partition spans by (tenantId, agentId) identity pairs
25
+ */
26
+ export declare function partitionByIdentity(spans: ReadableSpan[]): Map<string, ReadableSpan[]>;
27
+ /**
28
+ * Check if Agent 365 exporter is enabled via environment variable
29
+ */
30
+ export declare function isAgent365ExporterEnabled(): boolean;
31
+ /**
32
+ * Parse identity key back to tenant and agent IDs
33
+ */
34
+ export declare function parseIdentityKey(key: string): {
35
+ tenantId: string;
36
+ agentId: string;
37
+ };
38
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/tracing/exporter/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAI9D;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAOzD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAe/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAWvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,GACpB,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAuB7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAMnD;AAGD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGnF"}
@@ -0,0 +1,113 @@
1
+ // ------------------------------------------------------------------------------
2
+ // Copyright (c) Microsoft Corporation. All rights reserved.
3
+ // ------------------------------------------------------------------------------
4
+ import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
5
+ import { OpenTelemetryConstants } from '../constants';
6
+ import logger from '../../utils/logging';
7
+ /**
8
+ * Convert trace ID to hex string format
9
+ */
10
+ export function hexTraceId(value) {
11
+ if (typeof value === 'number') {
12
+ // Convert integer to 32 hex chars (128-bit)
13
+ return value.toString(16).padStart(32, '0');
14
+ }
15
+ // Handle hex string input - ensure it's 32 hex characters
16
+ return value.replace(/^0x/, '').padStart(32, '0');
17
+ }
18
+ /**
19
+ * Convert span ID to hex string format
20
+ */
21
+ export function hexSpanId(value) {
22
+ if (typeof value === 'number') {
23
+ // Convert integer to 16 hex chars (64-bit)
24
+ return value.toString(16).padStart(16, '0');
25
+ }
26
+ // Handle hex string input - ensure it's 16 hex characters
27
+ return value.replace(/^0x/, '').padStart(16, '0');
28
+ }
29
+ /**
30
+ * Convert any value to string, handling null/undefined
31
+ */
32
+ export function asStr(v) {
33
+ if (v === null || v === undefined) {
34
+ return undefined;
35
+ }
36
+ const s = String(v);
37
+ return s.trim() ? s : undefined;
38
+ }
39
+ /**
40
+ * Get span kind name from SpanKind enum
41
+ */
42
+ export function kindName(kind) {
43
+ switch (kind) {
44
+ case SpanKind.INTERNAL:
45
+ return 'INTERNAL';
46
+ case SpanKind.SERVER:
47
+ return 'SERVER';
48
+ case SpanKind.CLIENT:
49
+ return 'CLIENT';
50
+ case SpanKind.PRODUCER:
51
+ return 'PRODUCER';
52
+ case SpanKind.CONSUMER:
53
+ return 'CONSUMER';
54
+ default:
55
+ return 'UNSPECIFIED';
56
+ }
57
+ }
58
+ /**
59
+ * Get status name from SpanStatusCode enum
60
+ */
61
+ export function statusName(code) {
62
+ switch (code) {
63
+ case SpanStatusCode.UNSET:
64
+ return 'UNSET';
65
+ case SpanStatusCode.OK:
66
+ return 'OK';
67
+ case SpanStatusCode.ERROR:
68
+ return 'ERROR';
69
+ default:
70
+ return 'UNSET';
71
+ }
72
+ }
73
+ /**
74
+ * Partition spans by (tenantId, agentId) identity pairs
75
+ */
76
+ export function partitionByIdentity(spans) {
77
+ const groups = new Map();
78
+ let skippedCount = 0;
79
+ for (const span of spans) {
80
+ const attrs = span.attributes || {};
81
+ const tenant = asStr(attrs[OpenTelemetryConstants.TENANT_ID_KEY]);
82
+ const agent = asStr(attrs[OpenTelemetryConstants.GEN_AI_AGENT_ID_KEY]);
83
+ if (!tenant || !agent) {
84
+ skippedCount++;
85
+ logger.warn(`[Agent365Exporter] Skipping span without tenant or agent ID. Span name: ${span.name}`);
86
+ continue;
87
+ }
88
+ const key = `${tenant}:${agent}`;
89
+ const existing = groups.get(key) || [];
90
+ existing.push(span);
91
+ groups.set(key, existing);
92
+ }
93
+ logger.info(`[Agent365Exporter] Partitioned into ${groups.size} identity groups (${skippedCount} spans skipped)`);
94
+ return groups;
95
+ }
96
+ /**
97
+ * Check if Agent 365 exporter is enabled via environment variable
98
+ */
99
+ export function isAgent365ExporterEnabled() {
100
+ const a365Env = process.env[OpenTelemetryConstants.ENABLE_A365_OBSERVABILITY_EXPORTER]?.toLowerCase() || '';
101
+ const validValues = ['true', '1', 'yes', 'on'];
102
+ const enabled = validValues.includes(a365Env);
103
+ logger.info(`[Agent365Exporter] Agent 365 exporter enabled: ${enabled}`);
104
+ return enabled;
105
+ }
106
+ /**
107
+ * Parse identity key back to tenant and agent IDs
108
+ */
109
+ export function parseIdentityKey(key) {
110
+ const [tenantId, agentId] = key.split(':');
111
+ return { tenantId, agentId };
112
+ }
113
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/tracing/exporter/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Per request baggage builder for OpenTelemetry context propagation.
3
+ *
4
+ * This class provides a fluent API for setting baggage values that will be
5
+ * propagated in the OpenTelemetry context.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const scope = new BaggageBuilder()
10
+ * .tenantId("tenant-123")
11
+ * .agentId("agent-456")
12
+ * .correlationId("corr-789")
13
+ * .build();
14
+ *
15
+ * scope.enter();
16
+ * // Baggage is set in this context
17
+ * // ... do work ...
18
+ * scope.exit();
19
+ * // Baggage is restored after exiting the context
20
+ * ```
21
+ */
22
+ export declare class BaggageBuilder {
23
+ private pairs;
24
+ /**
25
+ * Set the operation source baggage value.
26
+ * @param value The operation source value
27
+ * @returns Self for method chaining
28
+ */
29
+ operationSource(value: string | null | undefined): BaggageBuilder;
30
+ /**
31
+ * Set the tenant ID baggage value.
32
+ * @param value The tenant ID
33
+ * @returns Self for method chaining
34
+ */
35
+ tenantId(value: string | null | undefined): BaggageBuilder;
36
+ /**
37
+ * Set the agent ID baggage value.
38
+ * @param value The agent ID
39
+ * @returns Self for method chaining
40
+ */
41
+ agentId(value: string | null | undefined): BaggageBuilder;
42
+ /**
43
+ * Set the agent AUID baggage value.
44
+ * @param value The agent AUID
45
+ * @returns Self for method chaining
46
+ */
47
+ agentAuid(value: string | null | undefined): BaggageBuilder;
48
+ /**
49
+ * Set the agent UPN baggage value.
50
+ * @param value The agent UPN
51
+ * @returns Self for method chaining
52
+ */
53
+ agentUpn(value: string | null | undefined): BaggageBuilder;
54
+ /**
55
+ * Set the agent blueprint ID baggage value.
56
+ * @param value The agent blueprint ID
57
+ * @returns Self for method chaining
58
+ */
59
+ agentBlueprintId(value: string | null | undefined): BaggageBuilder;
60
+ /**
61
+ * Set the correlation ID baggage value.
62
+ * @param value The correlation ID
63
+ * @returns Self for method chaining
64
+ */
65
+ correlationId(value: string | null | undefined): BaggageBuilder;
66
+ /**
67
+ * Set the caller ID baggage value.
68
+ * @param value The caller ID
69
+ * @returns Self for method chaining
70
+ */
71
+ callerId(value: string | null | undefined): BaggageBuilder;
72
+ /**
73
+ * Set the hiring manager ID baggage value.
74
+ * @param value The hiring manager ID
75
+ * @returns Self for method chaining
76
+ */
77
+ hiringManagerId(value: string | null | undefined): BaggageBuilder;
78
+ /**
79
+ * Set the agent name baggage value.
80
+ * @param value The agent name
81
+ * @returns Self for method chaining
82
+ */
83
+ agentName(value: string | null | undefined): BaggageBuilder;
84
+ /**
85
+ * Set the agent description baggage value.
86
+ * @param value The agent description
87
+ * @returns Self for method chaining
88
+ */
89
+ agentDescription(value: string | null | undefined): BaggageBuilder;
90
+ /**
91
+ * Set the caller name baggage value.
92
+ * @param value The caller name
93
+ * @returns Self for method chaining
94
+ */
95
+ callerName(value: string | null | undefined): BaggageBuilder;
96
+ /**
97
+ * Set the caller UPN baggage value.
98
+ * @param value The caller UPN
99
+ * @returns Self for method chaining
100
+ */
101
+ callerUpn(value: string | null | undefined): BaggageBuilder;
102
+ /**
103
+ * Set the conversation ID baggage value.
104
+ * @param value The conversation ID
105
+ * @returns Self for method chaining
106
+ */
107
+ conversationId(value: string | null | undefined): BaggageBuilder;
108
+ /**
109
+ * Set the conversation item link baggage value.
110
+ * @param value The conversation item link
111
+ * @returns Self for method chaining
112
+ */
113
+ conversationItemLink(value: string | null | undefined): BaggageBuilder;
114
+ /**
115
+ * Set the execution source metadata ID (e.g., channel ID).
116
+ * @param value The source metadata ID
117
+ * @returns Self for method chaining
118
+ */
119
+ sourceMetadataId(value: string | null | undefined): BaggageBuilder;
120
+ /**
121
+ * Set the execution source metadata name (e.g., channel name).
122
+ * @param value The source metadata name
123
+ * @returns Self for method chaining
124
+ */
125
+ sourceMetadataName(value: string | null | undefined): BaggageBuilder;
126
+ /**
127
+ * Set the execution source metadata description (e.g., channel description).
128
+ * @param value The source metadata description
129
+ * @returns Self for method chaining
130
+ */
131
+ sourceMetadataDescription(value: string | null | undefined): BaggageBuilder;
132
+ /**
133
+ * Set multiple baggage pairs from a dictionary or iterable.
134
+ * @param pairs Dictionary or iterable of key-value pairs
135
+ * @returns Self for method chaining
136
+ */
137
+ setPairs(pairs: Record<string, any> | Iterable<[string, any]> | null | undefined): BaggageBuilder;
138
+ /**
139
+ * Apply the collected baggage to the current context.
140
+ * @returns A context manager that restores the previous baggage on exit
141
+ */
142
+ build(): BaggageScope;
143
+ /**
144
+ * Add a baggage key/value if the value is not null or whitespace.
145
+ * @param key The baggage key
146
+ * @param value The baggage value
147
+ */
148
+ private set;
149
+ /**
150
+ * Convenience method to begin a request baggage scope with common fields.
151
+ * @param tenantId The tenant ID
152
+ * @param agentId The agent ID
153
+ * @param correlationId The correlation ID
154
+ * @returns A context manager that restores the previous baggage on exit
155
+ */
156
+ static setRequestContext(tenantId?: string | null, agentId?: string | null, correlationId?: string | null): BaggageScope;
157
+ }
158
+ /**
159
+ * Context manager for baggage scope.
160
+ *
161
+ * This class manages the lifecycle of baggage values, setting them on enter
162
+ * and restoring the previous context on exit.
163
+ */
164
+ export declare class BaggageScope implements Disposable {
165
+ private readonly contextWithBaggage;
166
+ constructor(pairs: Map<string, string>);
167
+ /**
168
+ * Execute a synchronous function under this baggage scope.
169
+ * Automatically restores previous context afterward.
170
+ */
171
+ run<T>(fn: () => T): T;
172
+ /**
173
+ * Dispose is a no-op because OpenTelemetry JS automatically restores
174
+ * the previous context after `context.with()` completes.
175
+ */
176
+ [Symbol.dispose](): void;
177
+ /**
178
+ * Manual cleanup alternative if caller isn't using `using`.
179
+ */
180
+ dispose(): void;
181
+ }
182
+ //# sourceMappingURL=BaggageBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaggageBuilder.d.ts","sourceRoot":"","sources":["../../../../src/tracing/middleware/BaggageBuilder.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAkC;IAE/C;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKjE;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK1D;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKzD;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK3D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK1D;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKlE;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK/D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK1D;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKjE;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK3D;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKlE;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK5D;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK3D;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKhE;;;;OAIG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKtE;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKlE;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAKpE;;;;OAIG;IACH,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAK3E;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc;IAqBjG;;;OAGG;IACH,KAAK,IAAI,YAAY;IAIrB;;;;OAIG;IACH,OAAO,CAAC,GAAG;IASX;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,YAAY;CAOhB;AAED;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,UAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;gBAEjC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAgBtC;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAItB;;;OAGG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}