Untrace is currently in beta - Route LLM traces to any observability platform.
Configure Untrace for your LLM observability needs
untrace.config.yaml
# untrace.config.yaml version: "1.0" # Service identification service: name: "my-llm-app" version: "1.0.0" environment: "production" # Untrace API configuration api: key: "${UNTRACE_API_KEY}" # Use environment variable baseUrl: "https://api.untrace.dev" timeout: 30000 # Routing configuration routing: defaultDestination: "langfuse" rules: - name: "Production GPT-4" condition: model: "gpt-4*" environment: "production" destination: "langsmith" - name: "Development" condition: environment: "development" destination: "langfuse" # Integrations integrations: langsmith: apiKey: "${LANGSMITH_API_KEY}" project: "main" langfuse: publicKey: "${LANGFUSE_PUBLIC_KEY}" secretKey: "${LANGFUSE_SECRET_KEY}" webhook: url: "https://your-api.com/traces" headers: Authorization: "Bearer ${WEBHOOK_TOKEN}" # Sampling configuration sampling: default: 0.1 # 10% default sampling rules: - condition: { error: true } rate: 1.0 # 100% for errors - condition: { cost: "> 0.50" } rate: 0.5 # 50% for expensive requests # Privacy configuration privacy: piiDetection: enabled: true redactionMethod: "hash" patterns: - email - phone - ssn - creditCard
import { init } from '@untrace/sdk'; const untrace = init({ // Required apiKey: process.env.UNTRACE_API_KEY, // Service identification serviceName: 'my-llm-app', environment: process.env.NODE_ENV, version: '1.0.0', // Routing routing: { defaultDestination: 'langfuse', rules: [ { name: 'High Cost Analysis', condition: (trace) => trace.cost > 0.10, destination: 'langsmith' } ] }, // Sampling samplingRate: 0.1, // 10% // Privacy piiDetection: { enabled: true, redactionMethod: 'mask' }, // Performance maxBatchSize: 100, exportIntervalMs: 5000, // Debug debug: process.env.NODE_ENV === 'development' });
from untrace import Untrace untrace = Untrace( # Required api_key=os.getenv("UNTRACE_API_KEY"), # Service identification service_name="my-llm-app", environment=os.getenv("ENVIRONMENT", "production"), version="1.0.0", # Routing routing={ "default_destination": "langfuse", "rules": [ { "name": "High Cost Analysis", "condition": lambda trace: trace.cost > 0.10, "destination": "langsmith" } ] }, # Sampling sampling_rate=0.1, # 10% # Privacy pii_detection={ "enabled": True, "redaction_method": "mask" } )
# Core configuration UNTRACE_API_KEY=utr_your_api_key UNTRACE_BASE_URL=https://api.untrace.dev UNTRACE_SERVICE_NAME=my-llm-app UNTRACE_ENVIRONMENT=production UNTRACE_VERSION=1.0.0 # Debug and logging UNTRACE_DEBUG=false UNTRACE_LOG_LEVEL=info # Sampling UNTRACE_SAMPLING_RATE=0.1 UNTRACE_SAMPLE_ERRORS=1.0 # Privacy UNTRACE_PII_DETECTION=true UNTRACE_PII_REDACTION_METHOD=hash # Performance UNTRACE_MAX_BATCH_SIZE=100 UNTRACE_EXPORT_INTERVAL_MS=5000 # Integration credentials LANGSMITH_API_KEY=ls_... LANGFUSE_PUBLIC_KEY=pk_... LANGFUSE_SECRET_KEY=sk_...
integrations: langsmith: platform: "langsmith" apiKey: "${LANGSMITH_API_KEY}" project: "production" dataset: "main" config: batchSize: 50 flushInterval: 10000 retryAttempts: 3
integrations: langfuse: platform: "langfuse" publicKey: "${LANGFUSE_PUBLIC_KEY}" secretKey: "${LANGFUSE_SECRET_KEY}" host: "https://cloud.langfuse.com" # or self-hosted URL config: sessionTracking: true userIdentification: true publicLinkGeneration: false
integrations: custom: platform: "webhook" url: "${WEBHOOK_URL}" headers: Authorization: "Bearer ${WEBHOOK_TOKEN}" X-Custom-Header: "value" config: timeout: 30000 retryAttempts: 3 retryDelay: 1000 payloadFormat: "opentelemetry" # or "custom"
# untrace.config.yaml with environment overrides defaults: sampling: 0.1 piiDetection: true environments: development: routing: defaultDestination: "langfuse" sampling: 1.0 # 100% in dev debug: true staging: routing: defaultDestination: "langfuse" sampling: 0.5 # 50% in staging production: routing: defaultDestination: "langsmith" sampling: 0.1 # 10% in production piiDetection: enabled: true aggressive: true
providers: openai: captureStreaming: true captureTools: true captureImages: false # Don't capture image inputs anthropic: captureSystemPrompts: true maxPromptLength: 10000 # Truncate long prompts langchain: captureIntermediateSteps: true captureMemory: true captureTools: true
performance: # Batching batching: enabled: true maxBatchSize: 500 maxWaitTime: 10000 # 10 seconds # Compression compression: enabled: true algorithm: "gzip" level: 6 # Connection pooling connections: maxConcurrent: 10 keepAlive: true timeout: 30000 # Caching cache: enabled: true ttl: 3600 # 1 hour maxSize: 1000 # entries
security: # API key rotation apiKey: primary: "${UNTRACE_API_KEY}" secondary: "${UNTRACE_API_KEY_SECONDARY}" # For rotation # Network security network: allowedIPs: - "10.0.0.0/8" - "172.16.0.0/12" tlsVersion: "1.3" certificatePinning: true # Data security data: encryptionAtRest: true encryptionInTransit: true fieldEncryption: - "user.email" - "metadata.apiKey"
// 1. Default: samplingRate = 1.0 // 2. Config file sets: samplingRate = 0.5 // 3. Environment variable: UNTRACE_SAMPLING_RATE=0.3 // 4. SDK initialization: const untrace = init({ samplingRate: 0.1 // This wins }); // 5. Runtime override: untrace.setSamplingRate(0.2); // This is now active
// Enable strict validation const untrace = init({ apiKey: 'your-key', validateConfig: true, // Throws on invalid config configSchema: 'strict' // or 'permissive' });
# Good apiKey: "${UNTRACE_API_KEY}" # Bad apiKey: "utr_abc123..." # Never commit!
config/ untrace.config.yaml # Base config untrace.dev.yaml # Development overrides untrace.prod.yaml # Production overrides
version: "1.0" # Always include version
# Route high-value enterprise customers to premium monitoring # Contact: platform-team@company.com routing: rules: - name: "Enterprise Tier" condition: tags.tier: "enterprise" destination: "premium-monitoring"
untrace.on('configChanged', (changes) => { logger.info('Configuration updated', changes); });
# Check configuration path export UNTRACE_CONFIG_PATH=/path/to/untrace.config.yaml # Enable debug mode export UNTRACE_DEBUG=true # Validate configuration npx @untrace/cli validate-config
// Test integration connectivity const status = await untrace.testIntegration('langsmith'); console.log('Integration status:', status);
# Optimize for high volume performance: batching: maxBatchSize: 1000 # Increase batch size compression: enabled: true # Enable compression sampling: default: 0.01 # Sample 1% if volume is high