import { TealTiger } from 'tealtiger';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
// 1. Initialize OpenTelemetry SDK
const sdk = new NodeSDK({
serviceName: 'ai-agent-service',
traceExporter: new OTLPTraceExporter({
url: 'http://localhost:4318/v1/traces'
}),
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: 'http://localhost:4318/v1/metrics'
}),
exportIntervalMillis: 60000 // Export every minute
}),
instrumentations: [getNodeAutoInstrumentations()]
});
sdk.start();
// 2. Configure TealTiger with OTel integration
const teal = new TealTiger({
policies: {
tools: {
file_delete: { allowed: false },
web_search: { allowed: true }
},
budget: {
maxCostPerRequest: 0.50,
maxCostPerDay: 100.00
}
},
// OpenTelemetry configuration
telemetry: {
opentelemetry: {
enabled: true,
// Export decisions as spans
exportDecisions: true,
spanAttributes: {
'service.name': 'ai-agent-service',
'deployment.environment': process.env.NODE_ENV
},
// Export cost metrics
exportMetrics: true,
metricPrefix: 'tealtiger',
// Export audit logs
exportLogs: true,
logLevel: 'INFO'
}
}
});
// 3. Use TealTiger with automatic OTel export
import { trace } from '@opentelemetry/api';
async function handleRequest(request: any) {
const tracer = trace.getTracer('ai-agent');
return await tracer.startActiveSpan('handle_request', async (span) => {
try {
// Evaluate policy (creates child span)
const decision = await teal.evaluate({
action: 'tool.execute',
tool: request.tool,
context: {
userId: request.userId,
environment: 'production'
}
});
// Add decision to span
span.setAttribute('tealtiger.decision', decision.action);
span.setAttribute('tealtiger.risk_score', decision.risk_score);
if (decision.action === 'DENY') {
span.setStatus({ code: 2, message: 'Policy denied' });
throw new Error(`Blocked: ${decision.reason_codes.join(', ')}`);
}
// Execute the request
const result = await executeRequest(request);
span.setStatus({ code: 1 });
return result;
} catch (error) {
span.recordException(error);
span.setStatus({ code: 2, message: error.message });
throw error;
} finally {
span.end();
}
});
}