openlit 1.7.1 → 1.8.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.
- package/README.md +14 -10
- package/dist/helpers.d.ts +10 -0
- package/dist/helpers.js +106 -3
- package/dist/helpers.js.map +1 -1
- package/dist/instrumentation/__tests__/anthropic-wrapper.test.js +1 -1
- package/dist/instrumentation/__tests__/anthropic-wrapper.test.js.map +1 -1
- package/dist/instrumentation/__tests__/base-wrapper.test.js +1 -1
- package/dist/instrumentation/__tests__/base-wrapper.test.js.map +1 -1
- package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.d.ts +4 -0
- package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.js +99 -0
- package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/groq-trace-comparison.test.d.ts +7 -0
- package/dist/instrumentation/__tests__/groq-trace-comparison.test.js +180 -0
- package/dist/instrumentation/__tests__/groq-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/mistral-trace-comparison.test.d.ts +4 -0
- package/dist/instrumentation/__tests__/mistral-trace-comparison.test.js +127 -0
- package/dist/instrumentation/__tests__/mistral-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/together-trace-comparison.test.d.ts +4 -0
- package/dist/instrumentation/__tests__/together-trace-comparison.test.js +98 -0
- package/dist/instrumentation/__tests__/together-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +66 -0
- package/dist/instrumentation/__tests__/trace-comparison-utils.js +245 -0
- package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -0
- package/dist/instrumentation/anthropic/index.js +6 -4
- package/dist/instrumentation/anthropic/index.js.map +1 -1
- package/dist/instrumentation/anthropic/wrapper.js +12 -30
- package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
- package/dist/instrumentation/base-wrapper.js +2 -2
- package/dist/instrumentation/base-wrapper.js.map +1 -1
- package/dist/instrumentation/cohere/wrapper.js +8 -10
- package/dist/instrumentation/cohere/wrapper.js.map +1 -1
- package/dist/instrumentation/google-ai/index.d.ts +11 -0
- package/dist/instrumentation/google-ai/index.js +48 -0
- package/dist/instrumentation/google-ai/index.js.map +1 -0
- package/dist/instrumentation/google-ai/wrapper.d.ts +34 -0
- package/dist/instrumentation/google-ai/wrapper.js +241 -0
- package/dist/instrumentation/google-ai/wrapper.js.map +1 -0
- package/dist/instrumentation/groq/index.d.ts +11 -0
- package/dist/instrumentation/groq/index.js +43 -0
- package/dist/instrumentation/groq/index.js.map +1 -0
- package/dist/instrumentation/groq/wrapper.d.ts +33 -0
- package/dist/instrumentation/groq/wrapper.js +289 -0
- package/dist/instrumentation/groq/wrapper.js.map +1 -0
- package/dist/instrumentation/index.js +10 -0
- package/dist/instrumentation/index.js.map +1 -1
- package/dist/instrumentation/mistral/index.d.ts +11 -0
- package/dist/instrumentation/mistral/index.js +66 -0
- package/dist/instrumentation/mistral/index.js.map +1 -0
- package/dist/instrumentation/mistral/wrapper.d.ts +34 -0
- package/dist/instrumentation/mistral/wrapper.js +340 -0
- package/dist/instrumentation/mistral/wrapper.js.map +1 -0
- package/dist/instrumentation/ollama/wrapper.d.ts +11 -3
- package/dist/instrumentation/ollama/wrapper.js +60 -95
- package/dist/instrumentation/ollama/wrapper.js.map +1 -1
- package/dist/instrumentation/openai/wrapper.js +14 -84
- package/dist/instrumentation/openai/wrapper.js.map +1 -1
- package/dist/instrumentation/together/index.d.ts +11 -0
- package/dist/instrumentation/together/index.js +43 -0
- package/dist/instrumentation/together/index.js.map +1 -0
- package/dist/instrumentation/together/wrapper.d.ts +33 -0
- package/dist/instrumentation/together/wrapper.js +271 -0
- package/dist/instrumentation/together/wrapper.js.map +1 -0
- package/dist/otel/__tests__/metrics.test.js +5 -5
- package/dist/otel/__tests__/metrics.test.js.map +1 -1
- package/dist/semantic-convention.d.ts +4 -3
- package/dist/semantic-convention.js +4 -3
- package/dist/semantic-convention.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-Language Trace Comparison Tests for Mistral Integration
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const wrapper_1 = __importDefault(require("../mistral/wrapper"));
|
|
10
|
+
const config_1 = __importDefault(require("../../config"));
|
|
11
|
+
const helpers_1 = __importDefault(require("../../helpers"));
|
|
12
|
+
const base_wrapper_1 = __importDefault(require("../base-wrapper"));
|
|
13
|
+
const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
|
|
14
|
+
jest.mock('../../config');
|
|
15
|
+
jest.mock('../../helpers');
|
|
16
|
+
jest.mock('../base-wrapper');
|
|
17
|
+
describe('Mistral Cross-Language Trace Comparison', () => {
|
|
18
|
+
let mockSpan;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
// Create mock span
|
|
21
|
+
mockSpan = {
|
|
22
|
+
setAttribute: jest.fn(),
|
|
23
|
+
addEvent: jest.fn(),
|
|
24
|
+
end: jest.fn(),
|
|
25
|
+
setStatus: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
// Mock OpenlitConfig
|
|
28
|
+
config_1.default.environment = 'openlit-testing';
|
|
29
|
+
config_1.default.applicationName = 'openlit-test';
|
|
30
|
+
config_1.default.traceContent = true;
|
|
31
|
+
config_1.default.pricing_json = {};
|
|
32
|
+
config_1.default.updatePricingJson = jest.fn().mockResolvedValue({});
|
|
33
|
+
// Mock OpenLitHelper
|
|
34
|
+
helpers_1.default.getChatModelCost = jest.fn().mockReturnValue(0.001);
|
|
35
|
+
helpers_1.default.getEmbedModelCost = jest.fn().mockReturnValue(0.0001);
|
|
36
|
+
helpers_1.default.openaiTokens = jest.fn().mockReturnValue(5);
|
|
37
|
+
helpers_1.default.handleException = jest.fn();
|
|
38
|
+
helpers_1.default.createStreamProxy = jest.fn().mockImplementation((stream, generator) => stream);
|
|
39
|
+
// Mock BaseWrapper
|
|
40
|
+
base_wrapper_1.default.recordMetrics = jest.fn();
|
|
41
|
+
base_wrapper_1.default.setBaseSpanAttributes = jest.fn().mockImplementation((span, attrs) => {
|
|
42
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, attrs.aiSystem);
|
|
43
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_ENDPOINT, attrs.genAIEndpoint);
|
|
44
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, attrs.model);
|
|
45
|
+
if (attrs.cost !== undefined) {
|
|
46
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, attrs.cost);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
jest.clearAllMocks();
|
|
52
|
+
});
|
|
53
|
+
describe('Chat Completion Trace Consistency', () => {
|
|
54
|
+
it('should set same attributes as Python SDK', async () => {
|
|
55
|
+
const mockArgs = [
|
|
56
|
+
{
|
|
57
|
+
messages: [{ role: 'user', content: 'What is Mistral AI?' }],
|
|
58
|
+
model: 'mistral-small-latest',
|
|
59
|
+
max_tokens: 50,
|
|
60
|
+
temperature: 0.7,
|
|
61
|
+
stream: false,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
const mockResponse = {
|
|
65
|
+
id: 'mistral-test-id',
|
|
66
|
+
created: Date.now(),
|
|
67
|
+
model: 'mistral-small-latest',
|
|
68
|
+
choices: [
|
|
69
|
+
{
|
|
70
|
+
index: 0,
|
|
71
|
+
finish_reason: 'stop',
|
|
72
|
+
message: { role: 'assistant', content: 'Mistral AI is...' },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
usage: {
|
|
76
|
+
prompt_tokens: 8,
|
|
77
|
+
completion_tokens: 15,
|
|
78
|
+
total_tokens: 23,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
await wrapper_1.default._chatCompletion({
|
|
82
|
+
args: mockArgs,
|
|
83
|
+
genAIEndpoint: 'mistral.chat.completions',
|
|
84
|
+
response: mockResponse,
|
|
85
|
+
span: mockSpan,
|
|
86
|
+
});
|
|
87
|
+
// Verify critical attributes are set (matching Python SDK)
|
|
88
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'mistral');
|
|
89
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
|
|
90
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, 'mistral-small-latest');
|
|
91
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_RESPONSE_MODEL, 'mistral-small-latest');
|
|
92
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, 8);
|
|
93
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS, 15);
|
|
94
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_TOTAL_TOKENS, 23);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('Embedding Trace Consistency', () => {
|
|
98
|
+
it('should set embedding attributes matching Python SDK', async () => {
|
|
99
|
+
const mockArgs = [
|
|
100
|
+
{
|
|
101
|
+
model: 'mistral-embed',
|
|
102
|
+
input: 'Test embedding text',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
const mockResponse = {
|
|
106
|
+
model: 'mistral-embed',
|
|
107
|
+
data: [{ embedding: [0.1, 0.2, 0.3] }],
|
|
108
|
+
usage: {
|
|
109
|
+
prompt_tokens: 3,
|
|
110
|
+
total_tokens: 3,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
const mockTracer = {
|
|
114
|
+
startSpan: jest.fn().mockReturnValue(mockSpan),
|
|
115
|
+
};
|
|
116
|
+
const patchMethod = wrapper_1.default._patchEmbedding(mockTracer);
|
|
117
|
+
const wrappedMethod = patchMethod(async () => mockResponse);
|
|
118
|
+
await wrappedMethod.call({}, ...mockArgs);
|
|
119
|
+
// Verify embedding-specific attributes
|
|
120
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'mistral');
|
|
121
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_EMBEDDING);
|
|
122
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, 'mistral-embed');
|
|
123
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, 3);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=mistral-trace-comparison.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/mistral-trace-comparison.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-Language Trace Comparison Tests for Together AI Integration
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const wrapper_1 = __importDefault(require("../together/wrapper"));
|
|
10
|
+
const config_1 = __importDefault(require("../../config"));
|
|
11
|
+
const helpers_1 = __importDefault(require("../../helpers"));
|
|
12
|
+
const base_wrapper_1 = __importDefault(require("../base-wrapper"));
|
|
13
|
+
const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
|
|
14
|
+
jest.mock('../../config');
|
|
15
|
+
jest.mock('../../helpers');
|
|
16
|
+
jest.mock('../base-wrapper');
|
|
17
|
+
describe('Together AI Cross-Language Trace Comparison', () => {
|
|
18
|
+
let mockSpan;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
// Create mock span
|
|
21
|
+
mockSpan = {
|
|
22
|
+
setAttribute: jest.fn(),
|
|
23
|
+
addEvent: jest.fn(),
|
|
24
|
+
end: jest.fn(),
|
|
25
|
+
setStatus: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
// Mock OpenlitConfig
|
|
28
|
+
config_1.default.environment = 'openlit-testing';
|
|
29
|
+
config_1.default.applicationName = 'openlit-test';
|
|
30
|
+
config_1.default.traceContent = true;
|
|
31
|
+
config_1.default.pricing_json = {};
|
|
32
|
+
config_1.default.updatePricingJson = jest.fn().mockResolvedValue({});
|
|
33
|
+
// Mock OpenLitHelper
|
|
34
|
+
helpers_1.default.getChatModelCost = jest.fn().mockReturnValue(0.001);
|
|
35
|
+
helpers_1.default.openaiTokens = jest.fn().mockReturnValue(5);
|
|
36
|
+
helpers_1.default.handleException = jest.fn();
|
|
37
|
+
helpers_1.default.createStreamProxy = jest.fn().mockImplementation((stream, generator) => stream);
|
|
38
|
+
// Mock BaseWrapper
|
|
39
|
+
base_wrapper_1.default.recordMetrics = jest.fn();
|
|
40
|
+
base_wrapper_1.default.setBaseSpanAttributes = jest.fn().mockImplementation((span, attrs) => {
|
|
41
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, attrs.aiSystem);
|
|
42
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_ENDPOINT, attrs.genAIEndpoint);
|
|
43
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, attrs.model);
|
|
44
|
+
if (attrs.cost !== undefined) {
|
|
45
|
+
span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, attrs.cost);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
jest.clearAllMocks();
|
|
51
|
+
});
|
|
52
|
+
describe('Chat Completion Trace Consistency', () => {
|
|
53
|
+
it('should set same attributes as Python SDK', async () => {
|
|
54
|
+
const mockArgs = [
|
|
55
|
+
{
|
|
56
|
+
messages: [{ role: 'user', content: 'What is Together AI?' }],
|
|
57
|
+
model: 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo',
|
|
58
|
+
max_tokens: 50,
|
|
59
|
+
temperature: 0.7,
|
|
60
|
+
top_p: 0.9,
|
|
61
|
+
stream: false,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
const mockResponse = {
|
|
65
|
+
id: 'together-test-id',
|
|
66
|
+
created: Date.now(),
|
|
67
|
+
model: 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo',
|
|
68
|
+
choices: [
|
|
69
|
+
{
|
|
70
|
+
index: 0,
|
|
71
|
+
finish_reason: 'stop',
|
|
72
|
+
message: { role: 'assistant', content: 'Together AI is...' },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
usage: {
|
|
76
|
+
prompt_tokens: 9,
|
|
77
|
+
completion_tokens: 12,
|
|
78
|
+
total_tokens: 21,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
await wrapper_1.default._chatCompletion({
|
|
82
|
+
args: mockArgs,
|
|
83
|
+
genAIEndpoint: 'together.chat.completions',
|
|
84
|
+
response: mockResponse,
|
|
85
|
+
span: mockSpan,
|
|
86
|
+
});
|
|
87
|
+
// Verify critical attributes are set (matching Python SDK)
|
|
88
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'together');
|
|
89
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
|
|
90
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo');
|
|
91
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_RESPONSE_MODEL, 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo');
|
|
92
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, 9);
|
|
93
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS, 12);
|
|
94
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_TOTAL_TOKENS, 21);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=together-trace-comparison.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"together-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/together-trace-comparison.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Language Trace Comparison Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities to compare traces generated by Python and TypeScript
|
|
5
|
+
* OpenLIT SDKs to ensure consistency across implementations.
|
|
6
|
+
*/
|
|
7
|
+
import { Span } from '@opentelemetry/api';
|
|
8
|
+
import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
9
|
+
export interface NormalizedTrace {
|
|
10
|
+
spanName: string;
|
|
11
|
+
spanKind: string;
|
|
12
|
+
attributes: Record<string, any>;
|
|
13
|
+
events: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
attributes?: Record<string, any>;
|
|
16
|
+
}>;
|
|
17
|
+
status: {
|
|
18
|
+
code: string;
|
|
19
|
+
message?: string;
|
|
20
|
+
};
|
|
21
|
+
duration?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface TraceComparisonResult {
|
|
24
|
+
match: boolean;
|
|
25
|
+
differences: string[];
|
|
26
|
+
pythonTrace?: NormalizedTrace;
|
|
27
|
+
typescriptTrace?: NormalizedTrace;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Normalize a TypeScript span to a comparable format
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeTypeScriptSpan(span: ReadableSpan | Span): NormalizedTrace;
|
|
33
|
+
/**
|
|
34
|
+
* Compare two normalized traces
|
|
35
|
+
*/
|
|
36
|
+
export declare function compareTraces(pythonTrace: NormalizedTrace, typescriptTrace: NormalizedTrace): TraceComparisonResult;
|
|
37
|
+
/**
|
|
38
|
+
* Extract key metrics from a trace for comparison
|
|
39
|
+
*/
|
|
40
|
+
export declare function extractKeyMetrics(trace: NormalizedTrace): {
|
|
41
|
+
tokens: {
|
|
42
|
+
input: number;
|
|
43
|
+
output: number;
|
|
44
|
+
total: number;
|
|
45
|
+
};
|
|
46
|
+
cost: number;
|
|
47
|
+
model: string;
|
|
48
|
+
operation: string;
|
|
49
|
+
system: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Compare key metrics between Python and TypeScript traces
|
|
53
|
+
*/
|
|
54
|
+
export declare function compareMetrics(pythonTrace: NormalizedTrace, typescriptTrace: NormalizedTrace): {
|
|
55
|
+
match: boolean;
|
|
56
|
+
differences: string[];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Create a test helper that validates trace consistency
|
|
60
|
+
*/
|
|
61
|
+
export declare function createTraceValidator(providerName: string, expectedAttributes?: string[]): {
|
|
62
|
+
validateTrace: (trace: NormalizedTrace) => {
|
|
63
|
+
valid: boolean;
|
|
64
|
+
errors: string[];
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-Language Trace Comparison Utilities
|
|
4
|
+
*
|
|
5
|
+
* This module provides utilities to compare traces generated by Python and TypeScript
|
|
6
|
+
* OpenLIT SDKs to ensure consistency across implementations.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.normalizeTypeScriptSpan = normalizeTypeScriptSpan;
|
|
10
|
+
exports.compareTraces = compareTraces;
|
|
11
|
+
exports.extractKeyMetrics = extractKeyMetrics;
|
|
12
|
+
exports.compareMetrics = compareMetrics;
|
|
13
|
+
exports.createTraceValidator = createTraceValidator;
|
|
14
|
+
const api_1 = require("@opentelemetry/api");
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a TypeScript span to a comparable format
|
|
17
|
+
*/
|
|
18
|
+
function normalizeTypeScriptSpan(span) {
|
|
19
|
+
const spanData = span;
|
|
20
|
+
return {
|
|
21
|
+
spanName: spanData.name || '',
|
|
22
|
+
spanKind: spanData.kind?.toString() || 'INTERNAL',
|
|
23
|
+
attributes: normalizeAttributes(spanData.attributes || {}),
|
|
24
|
+
events: (spanData.events || []).map((event) => ({
|
|
25
|
+
name: event.name || '',
|
|
26
|
+
attributes: normalizeAttributes(event.attributes || {}),
|
|
27
|
+
})),
|
|
28
|
+
status: {
|
|
29
|
+
code: spanData.status?.code === api_1.SpanStatusCode.OK ? 'OK' :
|
|
30
|
+
spanData.status?.code === api_1.SpanStatusCode.ERROR ? 'ERROR' : 'UNSET',
|
|
31
|
+
message: spanData.status?.message,
|
|
32
|
+
},
|
|
33
|
+
duration: spanData.duration?.[0] ? spanData.duration[0] * 1e9 + spanData.duration[1] : undefined,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Normalize attributes for comparison (handles array/object differences)
|
|
38
|
+
*/
|
|
39
|
+
function normalizeAttributes(attrs) {
|
|
40
|
+
const normalized = {};
|
|
41
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
42
|
+
// Normalize arrays - sort for comparison
|
|
43
|
+
if (Array.isArray(value)) {
|
|
44
|
+
normalized[key] = [...value].sort();
|
|
45
|
+
}
|
|
46
|
+
// Normalize numbers (handle float precision)
|
|
47
|
+
else if (typeof value === 'number') {
|
|
48
|
+
normalized[key] = Math.round(value * 1000) / 1000; // Round to 3 decimal places
|
|
49
|
+
}
|
|
50
|
+
// Normalize strings (trim whitespace)
|
|
51
|
+
else if (typeof value === 'string') {
|
|
52
|
+
normalized[key] = value.trim();
|
|
53
|
+
}
|
|
54
|
+
// Keep other types as-is
|
|
55
|
+
else {
|
|
56
|
+
normalized[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return normalized;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Compare two normalized traces
|
|
63
|
+
*/
|
|
64
|
+
function compareTraces(pythonTrace, typescriptTrace) {
|
|
65
|
+
const differences = [];
|
|
66
|
+
// Compare span names
|
|
67
|
+
if (pythonTrace.spanName !== typescriptTrace.spanName) {
|
|
68
|
+
differences.push(`Span name mismatch: Python="${pythonTrace.spanName}", TypeScript="${typescriptTrace.spanName}"`);
|
|
69
|
+
}
|
|
70
|
+
// Compare span kind
|
|
71
|
+
if (pythonTrace.spanKind !== typescriptTrace.spanKind) {
|
|
72
|
+
differences.push(`Span kind mismatch: Python="${pythonTrace.spanKind}", TypeScript="${typescriptTrace.spanKind}"`);
|
|
73
|
+
}
|
|
74
|
+
// Compare status
|
|
75
|
+
if (pythonTrace.status.code !== typescriptTrace.status.code) {
|
|
76
|
+
differences.push(`Status code mismatch: Python="${pythonTrace.status.code}", TypeScript="${typescriptTrace.status.code}"`);
|
|
77
|
+
}
|
|
78
|
+
// Compare attributes
|
|
79
|
+
const attrDiff = compareAttributes(pythonTrace.attributes, typescriptTrace.attributes);
|
|
80
|
+
differences.push(...attrDiff);
|
|
81
|
+
// Compare events (optional - events may differ slightly)
|
|
82
|
+
const eventDiff = compareEvents(pythonTrace.events, typescriptTrace.events);
|
|
83
|
+
if (eventDiff.length > 0) {
|
|
84
|
+
differences.push(`Event differences: ${eventDiff.join(', ')}`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
match: differences.length === 0,
|
|
88
|
+
differences,
|
|
89
|
+
pythonTrace,
|
|
90
|
+
typescriptTrace,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compare attributes between two traces
|
|
95
|
+
*/
|
|
96
|
+
function compareAttributes(pythonAttrs, typescriptAttrs) {
|
|
97
|
+
const differences = [];
|
|
98
|
+
const allKeys = new Set([...Object.keys(pythonAttrs), ...Object.keys(typescriptAttrs)]);
|
|
99
|
+
// Critical attributes that must match
|
|
100
|
+
const criticalAttributes = [
|
|
101
|
+
'gen_ai.system',
|
|
102
|
+
'gen_ai.operation.name',
|
|
103
|
+
'gen_ai.request.model',
|
|
104
|
+
'gen_ai.response.model',
|
|
105
|
+
'gen_ai.usage.input_tokens',
|
|
106
|
+
'gen_ai.usage.output_tokens',
|
|
107
|
+
'gen_ai.usage.total_tokens',
|
|
108
|
+
'gen_ai.usage.cost',
|
|
109
|
+
'gen_ai.endpoint',
|
|
110
|
+
'gen_ai.environment',
|
|
111
|
+
'gen_ai.application_name',
|
|
112
|
+
];
|
|
113
|
+
for (const key of allKeys) {
|
|
114
|
+
const pythonValue = pythonAttrs[key];
|
|
115
|
+
const typescriptValue = typescriptAttrs[key];
|
|
116
|
+
const isCritical = criticalAttributes.includes(key);
|
|
117
|
+
if (pythonValue === undefined && typescriptValue !== undefined) {
|
|
118
|
+
if (isCritical) {
|
|
119
|
+
differences.push(`Missing in Python: ${key} (TypeScript has: ${typescriptValue})`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (typescriptValue === undefined && pythonValue !== undefined) {
|
|
123
|
+
if (isCritical) {
|
|
124
|
+
differences.push(`Missing in TypeScript: ${key} (Python has: ${pythonValue})`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (pythonValue !== typescriptValue) {
|
|
128
|
+
// For critical attributes, always report differences
|
|
129
|
+
if (isCritical) {
|
|
130
|
+
differences.push(`Attribute "${key}" mismatch: Python="${pythonValue}", TypeScript="${typescriptValue}"`);
|
|
131
|
+
}
|
|
132
|
+
// For non-critical, only report if significantly different
|
|
133
|
+
else if (typeof pythonValue === 'number' && typeof typescriptValue === 'number') {
|
|
134
|
+
const diff = Math.abs(pythonValue - typescriptValue);
|
|
135
|
+
if (diff > 0.01) { // Allow small floating point differences
|
|
136
|
+
differences.push(`Attribute "${key}" significant difference: Python=${pythonValue}, TypeScript=${typescriptValue}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return differences;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Compare events between two traces
|
|
145
|
+
*/
|
|
146
|
+
function compareEvents(pythonEvents, typescriptEvents) {
|
|
147
|
+
const differences = [];
|
|
148
|
+
if (pythonEvents.length !== typescriptEvents.length) {
|
|
149
|
+
differences.push(`Event count mismatch: Python=${pythonEvents.length}, TypeScript=${typescriptEvents.length}`);
|
|
150
|
+
}
|
|
151
|
+
// Compare event names (order may differ)
|
|
152
|
+
const pythonEventNames = pythonEvents.map(e => e.name).sort();
|
|
153
|
+
const typescriptEventNames = typescriptEvents.map(e => e.name).sort();
|
|
154
|
+
if (JSON.stringify(pythonEventNames) !== JSON.stringify(typescriptEventNames)) {
|
|
155
|
+
differences.push(`Event names differ: Python=[${pythonEventNames.join(', ')}], TypeScript=[${typescriptEventNames.join(', ')}]`);
|
|
156
|
+
}
|
|
157
|
+
return differences;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extract key metrics from a trace for comparison
|
|
161
|
+
*/
|
|
162
|
+
function extractKeyMetrics(trace) {
|
|
163
|
+
const attrs = trace.attributes;
|
|
164
|
+
return {
|
|
165
|
+
tokens: {
|
|
166
|
+
input: attrs['gen_ai.usage.input_tokens'] || 0,
|
|
167
|
+
output: attrs['gen_ai.usage.output_tokens'] || 0,
|
|
168
|
+
total: attrs['gen_ai.usage.total_tokens'] || 0,
|
|
169
|
+
},
|
|
170
|
+
cost: attrs['gen_ai.usage.cost'] || 0,
|
|
171
|
+
model: attrs['gen_ai.request.model'] || attrs['gen_ai.response.model'] || '',
|
|
172
|
+
operation: attrs['gen_ai.operation.name'] || '',
|
|
173
|
+
system: attrs['gen_ai.system'] || '',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Compare key metrics between Python and TypeScript traces
|
|
178
|
+
*/
|
|
179
|
+
function compareMetrics(pythonTrace, typescriptTrace) {
|
|
180
|
+
const pythonMetrics = extractKeyMetrics(pythonTrace);
|
|
181
|
+
const typescriptMetrics = extractKeyMetrics(typescriptTrace);
|
|
182
|
+
const differences = [];
|
|
183
|
+
// Compare tokens (allow small differences due to estimation)
|
|
184
|
+
const tokenTolerance = 5; // Allow 5 token difference
|
|
185
|
+
if (Math.abs(pythonMetrics.tokens.input - typescriptMetrics.tokens.input) > tokenTolerance) {
|
|
186
|
+
differences.push(`Input tokens differ significantly: Python=${pythonMetrics.tokens.input}, TypeScript=${typescriptMetrics.tokens.input}`);
|
|
187
|
+
}
|
|
188
|
+
if (Math.abs(pythonMetrics.tokens.output - typescriptMetrics.tokens.output) > tokenTolerance) {
|
|
189
|
+
differences.push(`Output tokens differ significantly: Python=${pythonMetrics.tokens.output}, TypeScript=${typescriptMetrics.tokens.output}`);
|
|
190
|
+
}
|
|
191
|
+
// Compare cost (allow small differences due to rounding)
|
|
192
|
+
const costTolerance = 0.0001;
|
|
193
|
+
if (Math.abs(pythonMetrics.cost - typescriptMetrics.cost) > costTolerance) {
|
|
194
|
+
differences.push(`Cost differs: Python=${pythonMetrics.cost}, TypeScript=${typescriptMetrics.cost}`);
|
|
195
|
+
}
|
|
196
|
+
// Compare model (must match exactly)
|
|
197
|
+
if (pythonMetrics.model !== typescriptMetrics.model) {
|
|
198
|
+
differences.push(`Model mismatch: Python="${pythonMetrics.model}", TypeScript="${typescriptMetrics.model}"`);
|
|
199
|
+
}
|
|
200
|
+
// Compare operation (must match exactly)
|
|
201
|
+
if (pythonMetrics.operation !== typescriptMetrics.operation) {
|
|
202
|
+
differences.push(`Operation mismatch: Python="${pythonMetrics.operation}", TypeScript="${typescriptMetrics.operation}"`);
|
|
203
|
+
}
|
|
204
|
+
// Compare system (must match exactly)
|
|
205
|
+
if (pythonMetrics.system !== typescriptMetrics.system) {
|
|
206
|
+
differences.push(`System mismatch: Python="${pythonMetrics.system}", TypeScript="${typescriptMetrics.system}"`);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
match: differences.length === 0,
|
|
210
|
+
differences,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create a test helper that validates trace consistency
|
|
215
|
+
*/
|
|
216
|
+
function createTraceValidator(providerName, expectedAttributes = []) {
|
|
217
|
+
return {
|
|
218
|
+
validateTrace: (trace) => {
|
|
219
|
+
const errors = [];
|
|
220
|
+
// Check required attributes
|
|
221
|
+
for (const attr of expectedAttributes) {
|
|
222
|
+
if (!(attr in trace.attributes)) {
|
|
223
|
+
errors.push(`Missing required attribute: ${attr}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Check system matches provider
|
|
227
|
+
if (trace.attributes['gen_ai.system'] !== providerName) {
|
|
228
|
+
errors.push(`System mismatch: expected "${providerName}", got "${trace.attributes['gen_ai.system']}"`);
|
|
229
|
+
}
|
|
230
|
+
// Check operation is set
|
|
231
|
+
if (!trace.attributes['gen_ai.operation.name']) {
|
|
232
|
+
errors.push('Missing operation name');
|
|
233
|
+
}
|
|
234
|
+
// Check tokens are present
|
|
235
|
+
if (!trace.attributes['gen_ai.usage.input_tokens'] && !trace.attributes['gen_ai.usage.output_tokens']) {
|
|
236
|
+
errors.push('Missing token usage information');
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
valid: errors.length === 0,
|
|
240
|
+
errors,
|
|
241
|
+
};
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=trace-comparison-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-comparison-utils.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/trace-comparison-utils.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwBH,0DAkBC;AAiCD,sCA2CC;AA8FD,8CAoBC;AAKD,wCAsDC;AAKD,oDAsCC;AA5UD,4CAA0D;AAmB1D;;GAEG;AACH,SAAgB,uBAAuB,CAAC,IAAyB;IAC/D,MAAM,QAAQ,GAAG,IAAW,CAAC;IAE7B,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;QAC7B,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,UAAU;QACjD,UAAU,EAAE,mBAAmB,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1D,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YACtB,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;SACxD,CAAC,CAAC;QACH,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpD,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAc,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACxE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO;SAClC;QACD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACjG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAA0B;IACrD,MAAM,UAAU,GAAwB,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,yCAAyC;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,6CAA6C;aACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,4BAA4B;QACjF,CAAC;QACD,sCAAsC;aACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,yBAAyB;aACpB,CAAC;YACJ,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,WAA4B,EAC5B,eAAgC;IAEhC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,qBAAqB;IACrB,IAAI,WAAW,CAAC,QAAQ,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CACd,+BAA+B,WAAW,CAAC,QAAQ,kBAAkB,eAAe,CAAC,QAAQ,GAAG,CACjG,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,IAAI,WAAW,CAAC,QAAQ,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CACd,+BAA+B,WAAW,CAAC,QAAQ,kBAAkB,eAAe,CAAC,QAAQ,GAAG,CACjG,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5D,WAAW,CAAC,IAAI,CACd,iCAAiC,WAAW,CAAC,MAAM,CAAC,IAAI,kBAAkB,eAAe,CAAC,MAAM,CAAC,IAAI,GAAG,CACzG,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvF,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAE9B,yDAAyD;IACzD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAC/B,WAAW;QACX,WAAW;QACX,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,WAAgC,EAChC,eAAoC;IAEpC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAExF,sCAAsC;IACtC,MAAM,kBAAkB,GAAG;QACzB,eAAe;QACf,uBAAuB;QACvB,sBAAsB;QACtB,uBAAuB;QACvB,2BAA2B;QAC3B,4BAA4B;QAC5B,2BAA2B;QAC3B,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,yBAAyB;KAC1B,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,WAAW,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAC/D,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,eAAe,GAAG,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,IAAI,eAAe,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACtE,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,IAAI,CAAC,0BAA0B,GAAG,iBAAiB,WAAW,GAAG,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;YAC3C,qDAAqD;YACrD,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,IAAI,CACd,cAAc,GAAG,uBAAuB,WAAW,kBAAkB,eAAe,GAAG,CACxF,CAAC;YACJ,CAAC;YACD,2DAA2D;iBACtD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAChF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC;gBACrD,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,yCAAyC;oBAC1D,WAAW,CAAC,IAAI,CACd,cAAc,GAAG,oCAAoC,WAAW,gBAAgB,eAAe,EAAE,CAClG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,YAAuE,EACvE,gBAA2E;IAE3E,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,YAAY,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,CACd,gCAAgC,YAAY,CAAC,MAAM,gBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAC7F,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtE,IAAI,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC9E,WAAW,CAAC,IAAI,CACd,+BAA+B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC/G,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAsB;IAOtD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAE/B,OAAO;QACL,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,CAAC,2BAA2B,CAAC,IAAI,CAAC;YAC9C,MAAM,EAAE,KAAK,CAAC,4BAA4B,CAAC,IAAI,CAAC;YAChD,KAAK,EAAE,KAAK,CAAC,2BAA2B,CAAC,IAAI,CAAC;SAC/C;QACD,IAAI,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE;QAC5E,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE;QAC/C,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAC5B,WAA4B,EAC5B,eAAgC;IAEhC,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,6DAA6D;IAC7D,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,2BAA2B;IACrD,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,EAAE,CAAC;QAC3F,WAAW,CAAC,IAAI,CACd,6CAA6C,aAAa,CAAC,MAAM,CAAC,KAAK,gBAAgB,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CACxH,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;QAC7F,WAAW,CAAC,IAAI,CACd,8CAA8C,aAAa,CAAC,MAAM,CAAC,MAAM,gBAAgB,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,CAC3H,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,aAAa,GAAG,MAAM,CAAC;IAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC;QAC1E,WAAW,CAAC,IAAI,CACd,wBAAwB,aAAa,CAAC,IAAI,gBAAgB,iBAAiB,CAAC,IAAI,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI,aAAa,CAAC,KAAK,KAAK,iBAAiB,CAAC,KAAK,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,CACd,2BAA2B,aAAa,CAAC,KAAK,kBAAkB,iBAAiB,CAAC,KAAK,GAAG,CAC3F,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,IAAI,aAAa,CAAC,SAAS,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC5D,WAAW,CAAC,IAAI,CACd,+BAA+B,aAAa,CAAC,SAAS,kBAAkB,iBAAiB,CAAC,SAAS,GAAG,CACvG,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,aAAa,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CACd,4BAA4B,aAAa,CAAC,MAAM,kBAAkB,iBAAiB,CAAC,MAAM,GAAG,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAC/B,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,YAAoB,EACpB,qBAA+B,EAAE;IAEjC,OAAO;QACL,aAAa,EAAE,CAAC,KAAsB,EAAE,EAAE;YACxC,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,4BAA4B;YAC5B,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,YAAY,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CACT,8BAA8B,YAAY,WAAW,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAC1F,CAAC;YACJ,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACxC,CAAC;YAED,2BAA2B;YAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBACtG,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACjD,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM;aACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -26,17 +26,19 @@ class OpenlitAnthropicInstrumentation extends instrumentation_1.InstrumentationB
|
|
|
26
26
|
}
|
|
27
27
|
_patch(moduleExports) {
|
|
28
28
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const AnthropicClass = moduleExports.Anthropic ?? moduleExports;
|
|
30
|
+
if ((0, instrumentation_1.isWrapped)(AnthropicClass.Messages.prototype.create)) {
|
|
31
|
+
this._unwrap(AnthropicClass.Messages.prototype, 'create');
|
|
31
32
|
}
|
|
32
|
-
this._wrap(
|
|
33
|
+
this._wrap(AnthropicClass.Messages.prototype, 'create', wrapper_1.default._patchMessageCreate(this.tracer));
|
|
33
34
|
}
|
|
34
35
|
catch (e) {
|
|
35
36
|
console.error('Error in _patch method:', e);
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
_unpatch(moduleExports) {
|
|
39
|
-
|
|
40
|
+
const AnthropicClass = moduleExports.Anthropic ?? moduleExports;
|
|
41
|
+
this._unwrap(AnthropicClass.Messages.prototype, 'create');
|
|
40
42
|
}
|
|
41
43
|
}
|
|
42
44
|
exports.default = OpenlitAnthropicInstrumentation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentation/anthropic/index.ts"],"names":[],"mappings":";;;;;AAAA,oEAKwC;AAExC,6CAAwD;AAExD,wDAAyC;AAIzC,MAAqB,+BAAgC,SAAQ,qCAAmB;IAC9E,YAAY,SAAyC,EAAE;QACrD,KAAK,CAAC,GAAG,iCAAsB,4BAA4B,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAES,IAAI;QACZ,MAAM,MAAM,GAAG,IAAI,qDAAmC,CACpD,mBAAmB,EACnB,CAAC,WAAW,CAAC,EACb,CAAC,aAAa,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO,aAAa,CAAC;QACvB,CAAC,EACD,CAAC,aAAa,EAAE,EAAE;YAChB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CACF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAEM,WAAW,CAAC,SAAc;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAES,MAAM,CAAC,aAA+B;QAC9C,IAAI,CAAC;YACH,IAAI,IAAA,2BAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentation/anthropic/index.ts"],"names":[],"mappings":";;;;;AAAA,oEAKwC;AAExC,6CAAwD;AAExD,wDAAyC;AAIzC,MAAqB,+BAAgC,SAAQ,qCAAmB;IAC9E,YAAY,SAAyC,EAAE;QACrD,KAAK,CAAC,GAAG,iCAAsB,4BAA4B,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAES,IAAI;QACZ,MAAM,MAAM,GAAG,IAAI,qDAAmC,CACpD,mBAAmB,EACnB,CAAC,WAAW,CAAC,EACb,CAAC,aAAa,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO,aAAa,CAAC;QACvB,CAAC,EACD,CAAC,aAAa,EAAE,EAAE;YAChB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CACF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAEM,WAAW,CAAC,SAAc;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAES,MAAM,CAAC,aAA+B;QAC9C,IAAI,CAAC;YACH,MAAM,cAAc,GAAI,aAAqB,CAAC,SAAS,IAAI,aAAa,CAAC;YACzE,IAAI,IAAA,2BAAS,EAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,IAAI,CAAC,KAAK,CACR,cAAc,CAAC,QAAQ,CAAC,SAAS,EACjC,QAAQ,EACR,iBAAgB,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAClD,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAES,QAAQ,CAAC,aAA+B;QAChD,MAAM,cAAc,GAAI,aAAqB,CAAC,SAAS,IAAI,aAAa,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;CACF;AA/CD,kDA+CC"}
|