openlit 1.9.1 → 1.10.0

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 (77) hide show
  1. package/README.md +17 -1
  2. package/dist/constant.d.ts +1 -2
  3. package/dist/constant.js +6 -3
  4. package/dist/constant.js.map +1 -1
  5. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.d.ts +18 -0
  6. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js +209 -0
  7. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js.map +1 -0
  8. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.d.ts +7 -0
  9. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js +237 -0
  10. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js.map +1 -0
  11. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.d.ts +17 -0
  12. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js +206 -0
  13. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js.map +1 -0
  14. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.d.ts +17 -0
  15. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js +182 -0
  16. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js.map +1 -0
  17. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.d.ts +7 -0
  18. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js +158 -0
  19. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js.map +1 -0
  20. package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +1 -0
  21. package/dist/instrumentation/__tests__/trace-comparison-utils.js +34 -27
  22. package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -1
  23. package/dist/instrumentation/anthropic/wrapper.js +1 -0
  24. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  25. package/dist/instrumentation/base-wrapper.js +3 -5
  26. package/dist/instrumentation/base-wrapper.js.map +1 -1
  27. package/dist/instrumentation/bedrock/wrapper.js +6 -2
  28. package/dist/instrumentation/bedrock/wrapper.js.map +1 -1
  29. package/dist/instrumentation/chroma/index.d.ts +11 -0
  30. package/dist/instrumentation/chroma/index.js +70 -0
  31. package/dist/instrumentation/chroma/index.js.map +1 -0
  32. package/dist/instrumentation/chroma/wrapper.d.ts +10 -0
  33. package/dist/instrumentation/chroma/wrapper.js +127 -0
  34. package/dist/instrumentation/chroma/wrapper.js.map +1 -0
  35. package/dist/instrumentation/cohere/wrapper.js +0 -4
  36. package/dist/instrumentation/cohere/wrapper.js.map +1 -1
  37. package/dist/instrumentation/groq/wrapper.js +3 -1
  38. package/dist/instrumentation/groq/wrapper.js.map +1 -1
  39. package/dist/instrumentation/huggingface/index.d.ts +13 -0
  40. package/dist/instrumentation/huggingface/index.js +110 -0
  41. package/dist/instrumentation/huggingface/index.js.map +1 -0
  42. package/dist/instrumentation/huggingface/wrapper.d.ts +41 -0
  43. package/dist/instrumentation/huggingface/wrapper.js +246 -0
  44. package/dist/instrumentation/huggingface/wrapper.js.map +1 -0
  45. package/dist/instrumentation/index.js +10 -0
  46. package/dist/instrumentation/index.js.map +1 -1
  47. package/dist/instrumentation/langchain/wrapper.js +2 -0
  48. package/dist/instrumentation/langchain/wrapper.js.map +1 -1
  49. package/dist/instrumentation/milvus/index.d.ts +11 -0
  50. package/dist/instrumentation/milvus/index.js +67 -0
  51. package/dist/instrumentation/milvus/index.js.map +1 -0
  52. package/dist/instrumentation/milvus/wrapper.d.ts +15 -0
  53. package/dist/instrumentation/milvus/wrapper.js +219 -0
  54. package/dist/instrumentation/milvus/wrapper.js.map +1 -0
  55. package/dist/instrumentation/mistral/wrapper.js +4 -2
  56. package/dist/instrumentation/mistral/wrapper.js.map +1 -1
  57. package/dist/instrumentation/openai/wrapper.js +7 -3
  58. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  59. package/dist/instrumentation/qdrant/index.d.ts +11 -0
  60. package/dist/instrumentation/qdrant/index.js +67 -0
  61. package/dist/instrumentation/qdrant/index.js.map +1 -0
  62. package/dist/instrumentation/qdrant/wrapper.d.ts +14 -0
  63. package/dist/instrumentation/qdrant/wrapper.js +213 -0
  64. package/dist/instrumentation/qdrant/wrapper.js.map +1 -0
  65. package/dist/instrumentation/replicate/index.d.ts +11 -0
  66. package/dist/instrumentation/replicate/index.js +57 -0
  67. package/dist/instrumentation/replicate/index.js.map +1 -0
  68. package/dist/instrumentation/replicate/wrapper.d.ts +15 -0
  69. package/dist/instrumentation/replicate/wrapper.js +99 -0
  70. package/dist/instrumentation/replicate/wrapper.js.map +1 -0
  71. package/dist/instrumentation/together/wrapper.js +3 -1
  72. package/dist/instrumentation/together/wrapper.js.map +1 -1
  73. package/dist/semantic-convention.d.ts +101 -30
  74. package/dist/semantic-convention.js +114 -39
  75. package/dist/semantic-convention.js.map +1 -1
  76. package/dist/types.d.ts +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-Language Trace Comparison Tests for Milvus Integration
4
+ *
5
+ * Verifies TypeScript SDK trace attributes match Python SDK.
6
+ *
7
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/milvus/milvus.py
8
+ *
9
+ * Key alignment:
10
+ * - db.system.name = 'milvus'
11
+ * - db.operation.name: SEARCH, INSERT, UPSERT, DELETE, QUERY
12
+ * - server.address, server.port (default localhost:19530)
13
+ * - db.vector.query.top_k for search
14
+ * - db.filter for expr/filter params
15
+ * - db.vector.count for insert/upsert
16
+ * - db.query.summary
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ const wrapper_1 = __importDefault(require("../milvus/wrapper"));
23
+ const config_1 = __importDefault(require("../../config"));
24
+ const helpers_1 = __importDefault(require("../../helpers"));
25
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
26
+ jest.mock('../../config');
27
+ jest.mock('../../helpers');
28
+ describe('Milvus Cross-Language Trace Comparison', () => {
29
+ let mockSpan;
30
+ let mockTracer;
31
+ beforeEach(() => {
32
+ mockSpan = {
33
+ setAttribute: jest.fn(),
34
+ addEvent: jest.fn(),
35
+ end: jest.fn(),
36
+ setStatus: jest.fn(),
37
+ };
38
+ mockTracer = {
39
+ startSpan: jest.fn().mockReturnValue(mockSpan),
40
+ };
41
+ config_1.default.environment = 'openlit-testing';
42
+ config_1.default.applicationName = 'openlit-test';
43
+ config_1.default.traceContent = true;
44
+ helpers_1.default.handleException = jest.fn();
45
+ });
46
+ afterEach(() => {
47
+ jest.clearAllMocks();
48
+ });
49
+ // ── Common attributes ────────────────────────────────────────────────────
50
+ it('should set db.system.name = "milvus" matching Python DB_SYSTEM_MILVUS', async () => {
51
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
52
+ const originalMethod = jest.fn().mockResolvedValue({ results: [] });
53
+ const wrapped = patchFn(originalMethod);
54
+ await wrapped.call({}, { collection_name: 'test', vectors: [[0.1]], topk: 5 });
55
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_SYSTEM_NAME, 'milvus');
56
+ });
57
+ it('should set server.address = localhost and server.port = 19530', async () => {
58
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
59
+ const originalMethod = jest.fn().mockResolvedValue({ results: [] });
60
+ const wrapped = patchFn(originalMethod);
61
+ await wrapped.call({}, { collection_name: 'test', vectors: [[0.1]], topk: 5 });
62
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'localhost');
63
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 19530);
64
+ });
65
+ // ── search → SEARCH ───────────────────────────────────────────────────────
66
+ describe('search() → SEARCH', () => {
67
+ async function runSearch(params, returnValue = { results: [] }) {
68
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
69
+ const originalMethod = jest.fn().mockResolvedValue(returnValue);
70
+ const wrapped = patchFn(originalMethod);
71
+ await wrapped.call({}, params);
72
+ }
73
+ it('should set db.operation.name = "SEARCH"', async () => {
74
+ await runSearch({ collection_name: 'embeddings', vectors: [[0.1]], topk: 10 });
75
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'SEARCH');
76
+ });
77
+ it('should set db.collection.name from collection_name param', async () => {
78
+ await runSearch({ collection_name: 'my_embeddings', vectors: [[0.1]], topk: 5 });
79
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_COLLECTION_NAME, 'my_embeddings');
80
+ });
81
+ it('should set db.vector.query.top_k from topk param', async () => {
82
+ await runSearch({ collection_name: 'col', vectors: [[0.1]], topk: 20 });
83
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_QUERY_TOP_K, 20);
84
+ });
85
+ it('should also accept "limit" as top_k param', async () => {
86
+ await runSearch({ collection_name: 'col', vectors: [[0.1]], limit: 15 });
87
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_QUERY_TOP_K, 15);
88
+ });
89
+ it('should set db.filter when expr provided', async () => {
90
+ await runSearch({
91
+ collection_name: 'col',
92
+ vectors: [[0.1]],
93
+ topk: 5,
94
+ expr: 'category == "books"',
95
+ });
96
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, 'category == "books"');
97
+ });
98
+ it('should set db.n_results from results length', async () => {
99
+ await runSearch({ collection_name: 'col', vectors: [[0.1]], topk: 5 }, { results: [{ id: 1 }, { id: 2 }] });
100
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_N_RESULTS, 2);
101
+ });
102
+ });
103
+ // ── insert → INSERT ───────────────────────────────────────────────────────
104
+ describe('insert() → INSERT (matches Python DB_OPERATION_INSERT)', () => {
105
+ async function runInsert(params) {
106
+ const patchFn = wrapper_1.default._patchInsert(mockTracer);
107
+ const originalMethod = jest.fn().mockResolvedValue({ insert_cnt: params.data?.length ?? 0 });
108
+ const wrapped = patchFn(originalMethod);
109
+ await wrapped.call({}, params);
110
+ }
111
+ it('should set db.operation.name = "INSERT"', async () => {
112
+ await runInsert({ collection_name: 'col', data: [{ id: 1, vector: [0.1] }] });
113
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'INSERT');
114
+ });
115
+ it('should set db.vector.count from data length', async () => {
116
+ await runInsert({
117
+ collection_name: 'col',
118
+ data: [{ id: 1 }, { id: 2 }, { id: 3 }],
119
+ });
120
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_COUNT, 3);
121
+ });
122
+ it('should also work with collectionName (camelCase) param', async () => {
123
+ const patchFn = wrapper_1.default._patchInsert(mockTracer);
124
+ const originalMethod = jest.fn().mockResolvedValue({});
125
+ const wrapped = patchFn(originalMethod);
126
+ await wrapped.call({}, { collectionName: 'camelCase', data: [{ id: 1 }] });
127
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_COLLECTION_NAME, 'camelCase');
128
+ });
129
+ });
130
+ // ── upsert → UPSERT ───────────────────────────────────────────────────────
131
+ describe('upsert() → UPSERT', () => {
132
+ it('should set db.operation.name = "UPSERT" and db.vector.count', async () => {
133
+ const patchFn = wrapper_1.default._patchUpsert(mockTracer);
134
+ const originalMethod = jest.fn().mockResolvedValue({});
135
+ const wrapped = patchFn(originalMethod);
136
+ await wrapped.call({}, {
137
+ collection_name: 'col',
138
+ data: [{ id: 1, vector: [0.1] }, { id: 2, vector: [0.2] }],
139
+ });
140
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'UPSERT');
141
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_COUNT, 2);
142
+ });
143
+ });
144
+ // ── delete → DELETE ───────────────────────────────────────────────────────
145
+ describe('delete() → DELETE', () => {
146
+ it('should set db.operation.name = "DELETE"', async () => {
147
+ const patchFn = wrapper_1.default._patchDelete(mockTracer);
148
+ const originalMethod = jest.fn().mockResolvedValue({ delete_cnt: 2 });
149
+ const wrapped = patchFn(originalMethod);
150
+ await wrapped.call({}, {
151
+ collection_name: 'col',
152
+ ids: [1, 2],
153
+ });
154
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'DELETE');
155
+ });
156
+ it('should set db.filter when expr provided', async () => {
157
+ const patchFn = wrapper_1.default._patchDelete(mockTracer);
158
+ const originalMethod = jest.fn().mockResolvedValue({});
159
+ const wrapped = patchFn(originalMethod);
160
+ await wrapped.call({}, {
161
+ collection_name: 'col',
162
+ expr: 'id in [1, 2, 3]',
163
+ });
164
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, 'id in [1, 2, 3]');
165
+ });
166
+ it('should set db.ids_count when ids provided', async () => {
167
+ const patchFn = wrapper_1.default._patchDelete(mockTracer);
168
+ const originalMethod = jest.fn().mockResolvedValue({});
169
+ const wrapped = patchFn(originalMethod);
170
+ await wrapped.call({}, { collection_name: 'col', ids: [10, 20, 30] });
171
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_ID_COUNT, 3);
172
+ });
173
+ });
174
+ // ── query → QUERY ─────────────────────────────────────────────────────────
175
+ describe('query() → QUERY (scalar filter query)', () => {
176
+ it('should set db.operation.name = "QUERY"', async () => {
177
+ const patchFn = wrapper_1.default._patchQuery(mockTracer);
178
+ const originalMethod = jest.fn().mockResolvedValue({ data: [{ id: 1 }, { id: 2 }] });
179
+ const wrapped = patchFn(originalMethod);
180
+ await wrapped.call({}, {
181
+ collection_name: 'col',
182
+ expr: 'category == "books"',
183
+ limit: 50,
184
+ });
185
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'QUERY');
186
+ });
187
+ it('should set db.n_results from data length', async () => {
188
+ const patchFn = wrapper_1.default._patchQuery(mockTracer);
189
+ const originalMethod = jest.fn().mockResolvedValue({ data: [{ id: 1 }, { id: 2 }, { id: 3 }] });
190
+ const wrapped = patchFn(originalMethod);
191
+ await wrapped.call({}, { collection_name: 'col', expr: 'id > 0' });
192
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_N_RESULTS, 3);
193
+ });
194
+ });
195
+ // ── Error handling ────────────────────────────────────────────────────────
196
+ it('should call handleException and end span on error', async () => {
197
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
198
+ const error = new Error('Milvus not available');
199
+ const originalMethod = jest.fn().mockRejectedValue(error);
200
+ const wrapped = patchFn(originalMethod);
201
+ await expect(wrapped.call({}, { collection_name: 'col', vectors: [[0.1]], topk: 5 })).rejects.toThrow();
202
+ expect(helpers_1.default.handleException).toHaveBeenCalledWith(mockSpan, error);
203
+ expect(mockSpan.end).toHaveBeenCalled();
204
+ });
205
+ });
206
+ //# sourceMappingURL=milvus-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milvus-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/milvus-trace-comparison.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Cross-Language Trace Comparison Tests for Qdrant Integration
3
+ *
4
+ * Verifies TypeScript SDK trace attributes match Python SDK.
5
+ *
6
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/qdrant/utils.py
7
+ *
8
+ * Key alignment:
9
+ * - db.system.name = 'qdrant'
10
+ * - db.operation.name: SEARCH, UPSERT, DELETE, GET
11
+ * - server.address, server.port (default localhost:6333)
12
+ * - db.vector.query.top_k for search
13
+ * - db.filter for filtered operations
14
+ * - db.vector.count for upsert
15
+ * - db.query.summary
16
+ */
17
+ export {};
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-Language Trace Comparison Tests for Qdrant Integration
4
+ *
5
+ * Verifies TypeScript SDK trace attributes match Python SDK.
6
+ *
7
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/qdrant/utils.py
8
+ *
9
+ * Key alignment:
10
+ * - db.system.name = 'qdrant'
11
+ * - db.operation.name: SEARCH, UPSERT, DELETE, GET
12
+ * - server.address, server.port (default localhost:6333)
13
+ * - db.vector.query.top_k for search
14
+ * - db.filter for filtered operations
15
+ * - db.vector.count for upsert
16
+ * - db.query.summary
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ const wrapper_1 = __importDefault(require("../qdrant/wrapper"));
23
+ const config_1 = __importDefault(require("../../config"));
24
+ const helpers_1 = __importDefault(require("../../helpers"));
25
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
26
+ jest.mock('../../config');
27
+ jest.mock('../../helpers');
28
+ describe('Qdrant Cross-Language Trace Comparison', () => {
29
+ let mockSpan;
30
+ let mockTracer;
31
+ beforeEach(() => {
32
+ mockSpan = {
33
+ setAttribute: jest.fn(),
34
+ addEvent: jest.fn(),
35
+ end: jest.fn(),
36
+ setStatus: jest.fn(),
37
+ };
38
+ mockTracer = {
39
+ startSpan: jest.fn().mockReturnValue(mockSpan),
40
+ };
41
+ config_1.default.environment = 'openlit-testing';
42
+ config_1.default.applicationName = 'openlit-test';
43
+ config_1.default.traceContent = true;
44
+ helpers_1.default.handleException = jest.fn();
45
+ });
46
+ afterEach(() => {
47
+ jest.clearAllMocks();
48
+ });
49
+ // ── Common attributes ────────────────────────────────────────────────────
50
+ it('should set db.system.name = "qdrant" matching Python DB_SYSTEM_QDRANT', async () => {
51
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
52
+ const originalMethod = jest.fn().mockResolvedValue([{ id: 1, score: 0.9 }]);
53
+ const wrapped = patchFn(originalMethod);
54
+ await wrapped.call({}, 'my_collection', { vector: [0.1, 0.2], limit: 5 });
55
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_SYSTEM_NAME, 'qdrant');
56
+ });
57
+ it('should set server.address = localhost and server.port = 6333 (Python defaults)', async () => {
58
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
59
+ const originalMethod = jest.fn().mockResolvedValue([]);
60
+ const wrapped = patchFn(originalMethod);
61
+ await wrapped.call({}, 'col', { vector: [0.1], limit: 5 });
62
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'localhost');
63
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 6333);
64
+ });
65
+ // ── search → SEARCH ───────────────────────────────────────────────────────
66
+ describe('search() → SEARCH (matches Python DB_OPERATION_SEARCH)', () => {
67
+ async function runSearch(collectionName, params, returnValue = []) {
68
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
69
+ const originalMethod = jest.fn().mockResolvedValue(returnValue);
70
+ const wrapped = patchFn(originalMethod);
71
+ await wrapped.call({}, collectionName, params);
72
+ }
73
+ it('should set db.operation.name = "SEARCH"', async () => {
74
+ await runSearch('my_col', { vector: [0.1, 0.2], limit: 10 });
75
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'SEARCH');
76
+ });
77
+ it('should set db.collection.name', async () => {
78
+ await runSearch('embeddings', { vector: [0.1], limit: 5 });
79
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_COLLECTION_NAME, 'embeddings');
80
+ });
81
+ it('should set db.vector.query.top_k from limit param', async () => {
82
+ await runSearch('col', { vector: [0.1], limit: 20 });
83
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_QUERY_TOP_K, 20);
84
+ });
85
+ it('should set db.filter when filter provided', async () => {
86
+ const filter = { must: [{ key: 'city', match: { value: 'Paris' } }] };
87
+ await runSearch('col', { vector: [0.1], limit: 5, filter });
88
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, JSON.stringify(filter));
89
+ });
90
+ it('should set db.n_results to response array length', async () => {
91
+ await runSearch('col', { vector: [0.1], limit: 5 }, [
92
+ { id: 1, score: 0.9 },
93
+ { id: 2, score: 0.8 },
94
+ ]);
95
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_N_RESULTS, 2);
96
+ });
97
+ });
98
+ // ── upsert → UPSERT ───────────────────────────────────────────────────────
99
+ describe('upsert() → UPSERT (matches Python DB_OPERATION_UPSERT)', () => {
100
+ async function runUpsert(collectionName, params) {
101
+ const patchFn = wrapper_1.default._patchUpsert(mockTracer);
102
+ const originalMethod = jest.fn().mockResolvedValue({ status: 'completed' });
103
+ const wrapped = patchFn(originalMethod);
104
+ await wrapped.call({}, collectionName, params);
105
+ }
106
+ it('should set db.operation.name = "UPSERT"', async () => {
107
+ await runUpsert('col', { points: [{ id: 1, vector: [0.1], payload: {} }] });
108
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'UPSERT');
109
+ });
110
+ it('should set db.vector.count from points length', async () => {
111
+ await runUpsert('col', {
112
+ points: [
113
+ { id: 1, vector: [0.1] },
114
+ { id: 2, vector: [0.2] },
115
+ { id: 3, vector: [0.3] },
116
+ ],
117
+ });
118
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_COUNT, 3);
119
+ });
120
+ });
121
+ // ── delete → DELETE ───────────────────────────────────────────────────────
122
+ describe('delete() → DELETE (matches Python DB_OPERATION_DELETE)', () => {
123
+ async function runDelete(collectionName, params) {
124
+ const patchFn = wrapper_1.default._patchDelete(mockTracer);
125
+ const originalMethod = jest.fn().mockResolvedValue({ status: 'completed' });
126
+ const wrapped = patchFn(originalMethod);
127
+ await wrapped.call({}, collectionName, params);
128
+ }
129
+ it('should set db.operation.name = "DELETE"', async () => {
130
+ await runDelete('col', { points: [1, 2] });
131
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'DELETE');
132
+ });
133
+ it('should set db.ids_count from points array', async () => {
134
+ await runDelete('col', { points: [1, 2, 3] });
135
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_ID_COUNT, 3);
136
+ });
137
+ it('should set db.filter when filter provided', async () => {
138
+ const filter = { must: [{ key: 'city', match: { value: 'London' } }] };
139
+ await runDelete('col', { filter });
140
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, JSON.stringify(filter));
141
+ });
142
+ });
143
+ // ── retrieve → GET ────────────────────────────────────────────────────────
144
+ describe('retrieve() → GET (matches Python DB_OPERATION_GET)', () => {
145
+ it('should set db.operation.name = "GET"', async () => {
146
+ const patchFn = wrapper_1.default._patchRetrieve(mockTracer);
147
+ const originalMethod = jest.fn().mockResolvedValue([{ id: 1 }, { id: 2 }]);
148
+ const wrapped = patchFn(originalMethod);
149
+ await wrapped.call({}, 'col', { ids: [1, 2] });
150
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'GET');
151
+ });
152
+ it('should set db.ids_count and db.response.returned_rows', async () => {
153
+ const patchFn = wrapper_1.default._patchRetrieve(mockTracer);
154
+ const originalMethod = jest.fn().mockResolvedValue([{ id: 1 }, { id: 2 }]);
155
+ const wrapped = patchFn(originalMethod);
156
+ await wrapped.call({}, 'col', { ids: [1, 2] });
157
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_ID_COUNT, 2);
158
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_RESPONSE_RETURNED_ROWS, 2);
159
+ });
160
+ });
161
+ // ── scroll → GET ─────────────────────────────────────────────────────────
162
+ describe('scroll() → GET (matches Python DB_OPERATION_GET)', () => {
163
+ it('should set db.operation.name = "GET"', async () => {
164
+ const patchFn = wrapper_1.default._patchScroll(mockTracer);
165
+ const originalMethod = jest.fn().mockResolvedValue({ points: [{ id: 1 }, { id: 2 }] });
166
+ const wrapped = patchFn(originalMethod);
167
+ await wrapped.call({}, 'col', { limit: 100 });
168
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'GET');
169
+ });
170
+ });
171
+ // ── Error handling ────────────────────────────────────────────────────────
172
+ it('should call handleException and end span on error', async () => {
173
+ const patchFn = wrapper_1.default._patchSearch(mockTracer);
174
+ const error = new Error('Qdrant connection refused');
175
+ const originalMethod = jest.fn().mockRejectedValue(error);
176
+ const wrapped = patchFn(originalMethod);
177
+ await expect(wrapped.call({}, 'col', { vector: [0.1], limit: 5 })).rejects.toThrow();
178
+ expect(helpers_1.default.handleException).toHaveBeenCalledWith(mockSpan, error);
179
+ expect(mockSpan.end).toHaveBeenCalled();
180
+ });
181
+ });
182
+ //# sourceMappingURL=qdrant-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/qdrant-trace-comparison.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Trace Comparison Tests for Replicate Integration
3
+ *
4
+ * Verifies that the TypeScript SDK generates consistent traces for
5
+ * Replicate model runs.
6
+ */
7
+ export {};
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Trace Comparison Tests for Replicate Integration
4
+ *
5
+ * Verifies that the TypeScript SDK generates consistent traces for
6
+ * Replicate model runs.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const wrapper_1 = __importDefault(require("../replicate/wrapper"));
13
+ const config_1 = __importDefault(require("../../config"));
14
+ const helpers_1 = __importDefault(require("../../helpers"));
15
+ const base_wrapper_1 = __importDefault(require("../base-wrapper"));
16
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
17
+ jest.mock('../../config');
18
+ jest.mock('../../helpers');
19
+ jest.mock('../base-wrapper');
20
+ describe('Replicate Trace Comparison', () => {
21
+ let mockSpan;
22
+ beforeEach(() => {
23
+ mockSpan = {
24
+ setAttribute: jest.fn(),
25
+ addEvent: jest.fn(),
26
+ end: jest.fn(),
27
+ setStatus: jest.fn(),
28
+ };
29
+ config_1.default.environment = 'openlit-testing';
30
+ config_1.default.applicationName = 'openlit-test';
31
+ config_1.default.traceContent = true;
32
+ config_1.default.pricing_json = {};
33
+ config_1.default.updatePricingJson = jest.fn().mockResolvedValue({});
34
+ helpers_1.default.getChatModelCost = jest.fn().mockReturnValue(0.001);
35
+ helpers_1.default.generalTokens = jest.fn().mockReturnValue(10);
36
+ helpers_1.default.handleException = jest.fn();
37
+ base_wrapper_1.default.recordMetrics = jest.fn();
38
+ base_wrapper_1.default.setBaseSpanAttributes = jest.fn().mockImplementation((span, attrs) => {
39
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, attrs.aiSystem);
40
+ span.setAttribute(semantic_convention_1.default.GEN_AI_ENDPOINT, attrs.genAIEndpoint);
41
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, attrs.model);
42
+ if (attrs.cost !== undefined)
43
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, attrs.cost);
44
+ if (attrs.serverAddress)
45
+ span.setAttribute(semantic_convention_1.default.SERVER_ADDRESS, attrs.serverAddress);
46
+ if (attrs.serverPort !== undefined)
47
+ span.setAttribute(semantic_convention_1.default.SERVER_PORT, attrs.serverPort);
48
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SDK_VERSION, '1.9.0');
49
+ });
50
+ });
51
+ afterEach(() => {
52
+ jest.clearAllMocks();
53
+ });
54
+ describe('run() — text output', () => {
55
+ const identifier = 'meta/llama-2-70b-chat';
56
+ const mockArgs = [
57
+ identifier,
58
+ { input: { prompt: 'What is the capital of France?' } },
59
+ ];
60
+ it('should set gen_ai.system = "replicate"', async () => {
61
+ await wrapper_1.default._run({
62
+ args: mockArgs,
63
+ genAIEndpoint: 'replicate.run',
64
+ response: 'Paris.',
65
+ span: mockSpan,
66
+ });
67
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'replicate');
68
+ });
69
+ it('should set gen_ai.request.model stripped of version hash', async () => {
70
+ await wrapper_1.default._run({
71
+ args: mockArgs,
72
+ genAIEndpoint: 'replicate.run',
73
+ response: 'Paris.',
74
+ span: mockSpan,
75
+ });
76
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, 'meta/llama-2-70b-chat');
77
+ });
78
+ it('should strip version hash from identifier with colon', async () => {
79
+ const argsWithVersion = [
80
+ 'stability-ai/sdxl:abc123def456',
81
+ { input: { prompt: 'A sunset over mountains' } },
82
+ ];
83
+ await wrapper_1.default._run({
84
+ args: argsWithVersion,
85
+ genAIEndpoint: 'replicate.run',
86
+ response: ['https://example.com/image.png'],
87
+ span: mockSpan,
88
+ });
89
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, 'stability-ai/sdxl');
90
+ });
91
+ it('should set text_completion operation', async () => {
92
+ await wrapper_1.default._run({
93
+ args: mockArgs,
94
+ genAIEndpoint: 'replicate.run',
95
+ response: 'Paris.',
96
+ span: mockSpan,
97
+ });
98
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_TEXT_COMPLETION);
99
+ });
100
+ it('should set output_type=text for string responses', async () => {
101
+ await wrapper_1.default._run({
102
+ args: mockArgs,
103
+ genAIEndpoint: 'replicate.run',
104
+ response: 'Paris.',
105
+ span: mockSpan,
106
+ });
107
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
108
+ });
109
+ it('should set output_type=text for array responses (streaming text chunks)', async () => {
110
+ await wrapper_1.default._run({
111
+ args: mockArgs,
112
+ genAIEndpoint: 'replicate.run',
113
+ response: ['Par', 'is', '.'],
114
+ span: mockSpan,
115
+ });
116
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
117
+ });
118
+ it('should set output_type=json for object responses', async () => {
119
+ await wrapper_1.default._run({
120
+ args: mockArgs,
121
+ genAIEndpoint: 'replicate.run',
122
+ response: { answer: 'Paris', confidence: 0.99 },
123
+ span: mockSpan,
124
+ });
125
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_JSON);
126
+ });
127
+ it('should set server.address = api.replicate.com and port 443', async () => {
128
+ await wrapper_1.default._run({
129
+ args: mockArgs,
130
+ genAIEndpoint: 'replicate.run',
131
+ response: 'Paris.',
132
+ span: mockSpan,
133
+ });
134
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'api.replicate.com');
135
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 443);
136
+ });
137
+ it('should capture prompt content when traceContent=true', async () => {
138
+ await wrapper_1.default._run({
139
+ args: mockArgs,
140
+ genAIEndpoint: 'replicate.run',
141
+ response: 'Paris.',
142
+ span: mockSpan,
143
+ });
144
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_CONTENT_PROMPT_EVENT, 'What is the capital of France?');
145
+ });
146
+ it('should end span and record metrics', async () => {
147
+ await wrapper_1.default._run({
148
+ args: mockArgs,
149
+ genAIEndpoint: 'replicate.run',
150
+ response: 'Paris.',
151
+ span: mockSpan,
152
+ });
153
+ expect(mockSpan.end).toHaveBeenCalled();
154
+ expect(base_wrapper_1.default.recordMetrics).toHaveBeenCalled();
155
+ });
156
+ });
157
+ });
158
+ //# sourceMappingURL=replicate-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replicate-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/replicate-trace-comparison.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAEH,mEAAoD;AACpD,0DAAyC;AACzC,4DAA0C;AAC1C,mEAA0C;AAC1C,oFAA2D;AAE3D,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAE7B,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,QAAa,CAAC;IAElB,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG;YACT,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;YACvB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YACd,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;SACrB,CAAC;QAED,gBAAqB,CAAC,WAAW,GAAG,iBAAiB,CAAC;QACtD,gBAAqB,CAAC,eAAe,GAAG,cAAc,CAAC;QACvD,gBAAqB,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1C,gBAAqB,CAAC,YAAY,GAAG,EAAE,CAAC;QACxC,gBAAqB,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAE1E,iBAAqB,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1E,iBAAqB,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACpE,iBAAqB,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElD,sBAAmB,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9C,sBAAmB,CAAC,qBAAqB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAS,EAAE,KAAU,EAAE,EAAE;YAClG,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACxE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClG,IAAI,KAAK,CAAC,aAAa;gBAAE,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YACnG,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YACxG,IAAI,CAAC,YAAY,CAAC,6BAAkB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,MAAM,UAAU,GAAG,uBAAuB,CAAC;QAC3C,MAAM,QAAQ,GAAG;YACf,UAAU;YACV,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,gCAAgC,EAAE,EAAE;SACxD,CAAC;QAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,oBAAoB,EACvC,WAAW,CACZ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,oBAAoB,EACvC,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,eAAe,GAAG;gBACtB,gCAAgC;gBAChC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE,EAAE;aACjD,CAAC;YAEF,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,eAAe;gBACrB,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,CAAC,+BAA+B,CAAC;gBAC3C,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,oBAAoB,EACvC,mBAAmB,CACpB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,gBAAgB,EACnC,6BAAkB,CAAC,qCAAqC,CACzD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,kBAAkB,EACrC,6BAAkB,CAAC,uBAAuB,CAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC;gBAC5B,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,kBAAkB,EACrC,6BAAkB,CAAC,uBAAuB,CAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;gBAC/C,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,kBAAkB,EACrC,6BAAkB,CAAC,uBAAuB,CAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,cAAc,EACjC,mBAAmB,CACpB,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,6BAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAChD,6BAAkB,CAAC,2BAA2B,EAC9C,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,iBAAgB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,CAAC,sBAAW,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * This module provides utilities to compare traces generated by Python and TypeScript
5
5
  * OpenLIT SDKs to ensure consistency across implementations.
6
+ * Uses SemanticConvention keys so comparisons stay in sync with the SDK.
6
7
  */
7
8
  import { Span } from '@opentelemetry/api';
8
9
  import { ReadableSpan } from '@opentelemetry/sdk-trace-base';