import { TelemetryConfig } from './telemetry.js';
import { trace, context } from '@opentelemetry/api';
import { readFileSync, unlinkSync, existsSync } from 'fs';
console.log('๐งช Testing AI SDK Telemetry Integration...\n');
const testTraceFile = './test-ai-sdk-traces.jsonl';
if (existsSync(testTraceFile)) {
unlinkSync(testTraceFile);
}
const telemetryConfig = new TelemetryConfig({
serviceName: 'probe-chat-ai-sdk-test',
serviceVersion: '1.0.0',
enableFile: true,
enableConsole: true,
enableRemote: false,
filePath: testTraceFile,
});
telemetryConfig.initialize();
console.log('โ
Telemetry initialized');
async function simulateAISDKCall() {
const tracer = telemetryConfig.getTracer();
if (!tracer) {
console.log('โ No tracer available');
return;
}
console.log('๐ฏ Starting simulated AI SDK call...');
const parentSpan = tracer.startSpan('ai.generateText', {
attributes: {
'ai.model.id': 'claude-3-7-sonnet-20250219',
'ai.model.provider': 'anthropic',
'ai.operation.name': 'generateText',
'ai.request.model': 'claude-3-7-sonnet-20250219',
'ai.request.max_tokens': 4096,
'ai.request.temperature': 0.3,
'ai.telemetry.functionId': 'chat-test-session-123',
'ai.telemetry.metadata.sessionId': 'test-session-123',
'ai.telemetry.metadata.iteration': '1',
'ai.telemetry.metadata.model': 'claude-3-7-sonnet-20250219',
'ai.telemetry.metadata.apiType': 'anthropic',
'ai.telemetry.metadata.allowEdit': 'false',
'ai.telemetry.metadata.promptType': 'default'
}
});
try {
await context.with(trace.setSpan(context.active(), parentSpan), async () => {
parentSpan.addEvent('ai.request.start', {
'ai.request.messages': '[{"role":"user","content":"Hello world"}]',
'ai.request.system': 'You are a helpful assistant'
});
await new Promise(resolve => setTimeout(resolve, 100));
const streamSpan = tracer.startSpan('ai.stream.process', {
attributes: {
'ai.stream.type': 'text',
'ai.stream.provider': 'anthropic'
}
});
try {
streamSpan.addEvent('ai.stream.start');
for (let i = 0; i < 5; i++) {
streamSpan.addEvent('ai.stream.chunk', {
'ai.stream.chunk.index': i,
'ai.stream.chunk.content': `chunk_${i}`
});
await new Promise(resolve => setTimeout(resolve, 20));
}
streamSpan.addEvent('ai.stream.end');
streamSpan.setStatus({ code: 1 });
} catch (error) {
streamSpan.setStatus({
code: 2, message: error.message
});
streamSpan.recordException(error);
} finally {
streamSpan.end();
}
parentSpan.addEvent('ai.response.complete', {
'ai.response.text': 'Hello! How can I help you today?',
'ai.response.finish_reason': 'stop',
'ai.usage.prompt_tokens': 15,
'ai.usage.completion_tokens': 8,
'ai.usage.total_tokens': 23
});
parentSpan.setStatus({ code: 1 });
});
} catch (error) {
parentSpan.setStatus({
code: 2, message: error.message
});
parentSpan.recordException(error);
} finally {
parentSpan.end();
}
}
try {
await simulateAISDKCall();
console.log('โ
AI SDK call simulation completed');
await new Promise(resolve => setTimeout(resolve, 500));
if (existsSync(testTraceFile)) {
const traceData = readFileSync(testTraceFile, 'utf8');
console.log(`โ
Trace file created with ${traceData.split('\n').filter(Boolean).length} trace entries`);
const traceLines = traceData.split('\n').filter(Boolean);
if (traceLines.length > 0) {
console.log('\n๐ Trace Analysis:');
traceLines.forEach((line, index) => {
try {
const traceEntry = JSON.parse(line);
console.log(`\n๐ Trace Entry ${index + 1}:`);
console.log(` - Name: ${traceEntry.name}`);
console.log(` - Trace ID: ${traceEntry.traceId}`);
console.log(` - Span ID: ${traceEntry.spanId}`);
console.log(` - Status: ${traceEntry.status?.code || 'unknown'}`);
console.log(` - Start Time: ${new Date(traceEntry.startTimeUnixNano / 1000000).toISOString()}`);
console.log(` - Duration: ${(traceEntry.endTimeUnixNano - traceEntry.startTimeUnixNano) / 1000000}ms`);
console.log(` - Attributes: ${Object.keys(traceEntry.attributes || {}).length} attributes`);
console.log(` - Events: ${traceEntry.events?.length || 0} events`);
const aiAttributes = Object.keys(traceEntry.attributes || {}).filter(key => key.startsWith('ai.'));
if (aiAttributes.length > 0) {
console.log(` - AI Attributes: ${aiAttributes.join(', ')}`);
}
} catch (error) {
console.log(` โ Error parsing trace entry ${index + 1}: ${error.message}`);
}
});
console.log('\nโ
All trace data parsed successfully!');
console.log('\n๐ Sample trace entry:');
console.log(JSON.stringify(JSON.parse(traceLines[0]), null, 2));
} else {
console.log('โ Trace file is empty');
}
} else {
console.log('โ Trace file was not created');
}
} catch (error) {
console.error('โ Test failed:', error);
} finally {
await telemetryConfig.shutdown();
console.log('๐งน Telemetry shutdown complete');
if (existsSync(testTraceFile)) {
unlinkSync(testTraceFile);
console.log('๐งน Test trace file cleaned up');
}
}
console.log('\n๐ AI SDK Telemetry Integration Test Complete!');