openlit 1.9.1 → 1.11.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 (86) hide show
  1. package/README.md +51 -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/features/__tests__/rule-engine.test.d.ts +1 -0
  6. package/dist/features/__tests__/rule-engine.test.js +146 -0
  7. package/dist/features/__tests__/rule-engine.test.js.map +1 -0
  8. package/dist/features/base.d.ts +2 -0
  9. package/dist/features/base.js +2 -0
  10. package/dist/features/base.js.map +1 -1
  11. package/dist/features/rule-engine.d.ts +6 -0
  12. package/dist/features/rule-engine.js +60 -0
  13. package/dist/features/rule-engine.js.map +1 -0
  14. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.d.ts +18 -0
  15. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js +209 -0
  16. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js.map +1 -0
  17. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.d.ts +7 -0
  18. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js +237 -0
  19. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js.map +1 -0
  20. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.d.ts +17 -0
  21. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js +206 -0
  22. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js.map +1 -0
  23. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.d.ts +17 -0
  24. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js +182 -0
  25. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js.map +1 -0
  26. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.d.ts +7 -0
  27. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js +158 -0
  28. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js.map +1 -0
  29. package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +1 -0
  30. package/dist/instrumentation/__tests__/trace-comparison-utils.js +34 -27
  31. package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -1
  32. package/dist/instrumentation/anthropic/wrapper.js +1 -0
  33. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  34. package/dist/instrumentation/base-wrapper.js +3 -5
  35. package/dist/instrumentation/base-wrapper.js.map +1 -1
  36. package/dist/instrumentation/bedrock/wrapper.js +6 -2
  37. package/dist/instrumentation/bedrock/wrapper.js.map +1 -1
  38. package/dist/instrumentation/chroma/index.d.ts +11 -0
  39. package/dist/instrumentation/chroma/index.js +70 -0
  40. package/dist/instrumentation/chroma/index.js.map +1 -0
  41. package/dist/instrumentation/chroma/wrapper.d.ts +10 -0
  42. package/dist/instrumentation/chroma/wrapper.js +127 -0
  43. package/dist/instrumentation/chroma/wrapper.js.map +1 -0
  44. package/dist/instrumentation/cohere/wrapper.js +0 -4
  45. package/dist/instrumentation/cohere/wrapper.js.map +1 -1
  46. package/dist/instrumentation/groq/wrapper.js +3 -1
  47. package/dist/instrumentation/groq/wrapper.js.map +1 -1
  48. package/dist/instrumentation/huggingface/index.d.ts +13 -0
  49. package/dist/instrumentation/huggingface/index.js +110 -0
  50. package/dist/instrumentation/huggingface/index.js.map +1 -0
  51. package/dist/instrumentation/huggingface/wrapper.d.ts +41 -0
  52. package/dist/instrumentation/huggingface/wrapper.js +246 -0
  53. package/dist/instrumentation/huggingface/wrapper.js.map +1 -0
  54. package/dist/instrumentation/index.js +10 -0
  55. package/dist/instrumentation/index.js.map +1 -1
  56. package/dist/instrumentation/langchain/wrapper.js +2 -0
  57. package/dist/instrumentation/langchain/wrapper.js.map +1 -1
  58. package/dist/instrumentation/milvus/index.d.ts +11 -0
  59. package/dist/instrumentation/milvus/index.js +67 -0
  60. package/dist/instrumentation/milvus/index.js.map +1 -0
  61. package/dist/instrumentation/milvus/wrapper.d.ts +15 -0
  62. package/dist/instrumentation/milvus/wrapper.js +219 -0
  63. package/dist/instrumentation/milvus/wrapper.js.map +1 -0
  64. package/dist/instrumentation/mistral/wrapper.js +4 -2
  65. package/dist/instrumentation/mistral/wrapper.js.map +1 -1
  66. package/dist/instrumentation/openai/wrapper.js +7 -3
  67. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  68. package/dist/instrumentation/qdrant/index.d.ts +11 -0
  69. package/dist/instrumentation/qdrant/index.js +67 -0
  70. package/dist/instrumentation/qdrant/index.js.map +1 -0
  71. package/dist/instrumentation/qdrant/wrapper.d.ts +14 -0
  72. package/dist/instrumentation/qdrant/wrapper.js +213 -0
  73. package/dist/instrumentation/qdrant/wrapper.js.map +1 -0
  74. package/dist/instrumentation/replicate/index.d.ts +11 -0
  75. package/dist/instrumentation/replicate/index.js +57 -0
  76. package/dist/instrumentation/replicate/index.js.map +1 -0
  77. package/dist/instrumentation/replicate/wrapper.d.ts +15 -0
  78. package/dist/instrumentation/replicate/wrapper.js +99 -0
  79. package/dist/instrumentation/replicate/wrapper.js.map +1 -0
  80. package/dist/instrumentation/together/wrapper.js +3 -1
  81. package/dist/instrumentation/together/wrapper.js.map +1 -1
  82. package/dist/semantic-convention.d.ts +101 -30
  83. package/dist/semantic-convention.js +114 -39
  84. package/dist/semantic-convention.js.map +1 -1
  85. package/dist/types.d.ts +17 -1
  86. package/package.json +1 -1
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-Language Trace Comparison Tests for HuggingFace Inference Integration
4
+ *
5
+ * Verifies that the TypeScript SDK generates traces consistent with the Python SDK
6
+ * for HuggingFace Inference API chatCompletion and textGeneration.
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("../huggingface/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('HuggingFace Cross-Language Trace Comparison', () => {
21
+ let mockSpan;
22
+ let mockTracer;
23
+ beforeEach(() => {
24
+ mockSpan = {
25
+ setAttribute: jest.fn(),
26
+ addEvent: jest.fn(),
27
+ end: jest.fn(),
28
+ setStatus: jest.fn(),
29
+ };
30
+ mockTracer = {
31
+ startSpan: jest.fn().mockReturnValue(mockSpan),
32
+ };
33
+ config_1.default.environment = 'openlit-testing';
34
+ config_1.default.applicationName = 'openlit-test';
35
+ config_1.default.traceContent = true;
36
+ config_1.default.pricing_json = {};
37
+ config_1.default.updatePricingJson = jest.fn().mockResolvedValue({});
38
+ helpers_1.default.getChatModelCost = jest.fn().mockReturnValue(0.0005);
39
+ helpers_1.default.generalTokens = jest.fn().mockReturnValue(8);
40
+ helpers_1.default.buildInputMessages = jest.fn().mockReturnValue('[]');
41
+ helpers_1.default.buildOutputMessages = jest.fn().mockReturnValue('[]');
42
+ helpers_1.default.handleException = jest.fn();
43
+ helpers_1.default.createStreamProxy = jest.fn().mockImplementation((stream, _gen) => stream);
44
+ base_wrapper_1.default.recordMetrics = jest.fn();
45
+ base_wrapper_1.default.setBaseSpanAttributes = jest.fn().mockImplementation((span, attrs) => {
46
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, attrs.aiSystem);
47
+ span.setAttribute(semantic_convention_1.default.GEN_AI_ENDPOINT, attrs.genAIEndpoint);
48
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, attrs.model);
49
+ if (attrs.cost !== undefined)
50
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, attrs.cost);
51
+ if (attrs.serverAddress)
52
+ span.setAttribute(semantic_convention_1.default.SERVER_ADDRESS, attrs.serverAddress);
53
+ if (attrs.serverPort !== undefined)
54
+ span.setAttribute(semantic_convention_1.default.SERVER_PORT, attrs.serverPort);
55
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SDK_VERSION, '1.9.0');
56
+ });
57
+ });
58
+ afterEach(() => {
59
+ jest.clearAllMocks();
60
+ });
61
+ // ── Chat Completion ───────────────────────────────────────────────────────
62
+ describe('Chat Completion', () => {
63
+ const mockArgs = [
64
+ {
65
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
66
+ messages: [{ role: 'user', content: 'What is LLM Observability?' }],
67
+ max_tokens: 100,
68
+ temperature: 0.7,
69
+ stream: false,
70
+ },
71
+ ];
72
+ const mockResponse = {
73
+ id: 'hf-chat-123',
74
+ created: Date.now(),
75
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
76
+ choices: [
77
+ {
78
+ index: 0,
79
+ finish_reason: 'stop',
80
+ message: { role: 'assistant', content: 'LLM Observability is...' },
81
+ },
82
+ ],
83
+ usage: { prompt_tokens: 12, completion_tokens: 25, total_tokens: 37 },
84
+ };
85
+ it('should set gen_ai.system = "huggingface" matching Python GEN_AI_SYSTEM_HUGGING_FACE', async () => {
86
+ await wrapper_1.default._chatCompletion({
87
+ args: mockArgs,
88
+ genAIEndpoint: 'huggingface.chat.completions',
89
+ response: mockResponse,
90
+ span: mockSpan,
91
+ });
92
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
93
+ });
94
+ it('should set gen_ai.operation.name = "chat" matching Python', async () => {
95
+ await wrapper_1.default._chatCompletion({
96
+ args: mockArgs,
97
+ genAIEndpoint: 'huggingface.chat.completions',
98
+ response: mockResponse,
99
+ span: mockSpan,
100
+ });
101
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
102
+ });
103
+ it('should set token usage attributes matching Python SDK', async () => {
104
+ await wrapper_1.default._chatCompletion({
105
+ args: mockArgs,
106
+ genAIEndpoint: 'huggingface.chat.completions',
107
+ response: mockResponse,
108
+ span: mockSpan,
109
+ });
110
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, 12);
111
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS, 25);
112
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_TOTAL_TOKENS, 37);
113
+ });
114
+ it('should set server.address and server.port matching Python', async () => {
115
+ await wrapper_1.default._chatCompletion({
116
+ args: mockArgs,
117
+ genAIEndpoint: 'huggingface.chat.completions',
118
+ response: mockResponse,
119
+ span: mockSpan,
120
+ });
121
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'api-inference.huggingface.co');
122
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 443);
123
+ });
124
+ it('should set request params: temperature, max_tokens, is_stream', async () => {
125
+ await wrapper_1.default._chatCompletion({
126
+ args: mockArgs,
127
+ genAIEndpoint: 'huggingface.chat.completions',
128
+ response: mockResponse,
129
+ span: mockSpan,
130
+ });
131
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE, 0.7);
132
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, 100);
133
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, false);
134
+ });
135
+ it('should set finish_reason and output_type', async () => {
136
+ await wrapper_1.default._chatCompletion({
137
+ args: mockArgs,
138
+ genAIEndpoint: 'huggingface.chat.completions',
139
+ response: mockResponse,
140
+ span: mockSpan,
141
+ });
142
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_RESPONSE_FINISH_REASON, ['stop']);
143
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
144
+ });
145
+ it('should call recordMetrics after span ends', async () => {
146
+ await wrapper_1.default._chatCompletion({
147
+ args: mockArgs,
148
+ genAIEndpoint: 'huggingface.chat.completions',
149
+ response: mockResponse,
150
+ span: mockSpan,
151
+ });
152
+ expect(mockSpan.end).toHaveBeenCalled();
153
+ expect(base_wrapper_1.default.recordMetrics).toHaveBeenCalled();
154
+ });
155
+ });
156
+ // ── Streaming ─────────────────────────────────────────────────────────────
157
+ describe('Streaming Chat Completion', () => {
158
+ it('should set is_stream=true and accumulate content across chunks', async () => {
159
+ const mockArgs = [
160
+ {
161
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
162
+ messages: [{ role: 'user', content: 'Hello' }],
163
+ stream: true,
164
+ },
165
+ ];
166
+ async function* mockStream() {
167
+ yield {
168
+ id: 'hf-stream-1',
169
+ created: Date.now(),
170
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
171
+ choices: [{ delta: { content: 'Hello' } }],
172
+ };
173
+ yield {
174
+ id: 'hf-stream-1',
175
+ created: Date.now(),
176
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
177
+ choices: [{ delta: { content: ' world' }, finish_reason: 'stop' }],
178
+ };
179
+ }
180
+ const generator = wrapper_1.default._chatCompletionGenerator({
181
+ args: mockArgs,
182
+ genAIEndpoint: 'huggingface.chat.completions',
183
+ response: mockStream(),
184
+ span: mockSpan,
185
+ });
186
+ for await (const _ of generator) { /* consume */ }
187
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, true);
188
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
189
+ expect(mockSpan.end).toHaveBeenCalled();
190
+ });
191
+ });
192
+ // ── Text Generation ───────────────────────────────────────────────────────
193
+ describe('Text Generation', () => {
194
+ it('should set text_completion operation and correct attributes', async () => {
195
+ const mockArgs = [
196
+ {
197
+ model: 'gpt2',
198
+ inputs: 'The meaning of life is',
199
+ parameters: { max_new_tokens: 50, temperature: 0.9 },
200
+ },
201
+ ];
202
+ const mockResponse = { generated_text: 'The meaning of life is 42.' };
203
+ await wrapper_1.default._textGeneration({
204
+ args: mockArgs,
205
+ genAIEndpoint: 'huggingface.text.generation',
206
+ response: mockResponse,
207
+ span: mockSpan,
208
+ });
209
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_TEXT_COMPLETION);
210
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
211
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, 50);
212
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE, 0.9);
213
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, false);
214
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
215
+ expect(mockSpan.end).toHaveBeenCalled();
216
+ });
217
+ it('should capture prompt and completion content when traceContent=true', async () => {
218
+ const mockArgs = [
219
+ {
220
+ model: 'gpt2',
221
+ inputs: 'The meaning of life is',
222
+ parameters: {},
223
+ },
224
+ ];
225
+ const mockResponse = { generated_text: '42.' };
226
+ await wrapper_1.default._textGeneration({
227
+ args: mockArgs,
228
+ genAIEndpoint: 'huggingface.text.generation',
229
+ response: mockResponse,
230
+ span: mockSpan,
231
+ });
232
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_CONTENT_PROMPT_EVENT, 'The meaning of life is');
233
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_CONTENT_COMPLETION_EVENT, '42.');
234
+ });
235
+ });
236
+ });
237
+ //# sourceMappingURL=huggingface-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/huggingface-trace-comparison.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Cross-Language Trace Comparison Tests for Milvus Integration
3
+ *
4
+ * Verifies TypeScript SDK trace attributes match Python SDK.
5
+ *
6
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/milvus/milvus.py
7
+ *
8
+ * Key alignment:
9
+ * - db.system.name = 'milvus'
10
+ * - db.operation.name: SEARCH, INSERT, UPSERT, DELETE, QUERY
11
+ * - server.address, server.port (default localhost:19530)
12
+ * - db.vector.query.top_k for search
13
+ * - db.filter for expr/filter params
14
+ * - db.vector.count for insert/upsert
15
+ * - db.query.summary
16
+ */
17
+ export {};
@@ -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 {};