langfuse-prod-checklist
Checklist and configuration patterns for deploying Langfuse to a production environment.
Install
mkdir -p .claude/skills/langfuse-prod-checklist && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/6308" && unzip -o skill.zip -d .claude/skills/langfuse-prod-checklist && rm skill.zipInstalls to .claude/skills/langfuse-prod-checklist
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Langfuse production readiness checklist and verification.Key capabilities
- →Tune SDK batch sizes and flush intervals for performance
- →Implement graceful shutdown handlers for SIGTERM and SIGINT
- →Validate API key formats at startup
- →Wrap traced operations with error safety
- →Verify production connectivity via health checks
How it works
The checklist ensures production resilience by configuring batching, timeouts, and graceful shutdowns to prevent data loss and application crashes.
Inputs & outputs
When to use langfuse-prod-checklist
- →Audit production SDK configuration
- →Configure batch size and interval for performance
- →Implement graceful shutdown for trace exporters
- →Validate production secret management
About this skill
Langfuse Production Checklist
Overview
Comprehensive checklist for deploying Langfuse observability to production with verified configuration, error handling, graceful shutdown, monitoring, and a pre-deployment verification script.
Prerequisites
- Development and staging testing completed
- Production Langfuse project created with separate API keys
- Secret management solution in place
Production Configuration
Recommended SDK Settings
// v4+ Production Config
import { LangfuseSpanProcessor } from "@langfuse/otel";
import { NodeSDK } from "@opentelemetry/sdk-node";
const processor = new LangfuseSpanProcessor({
exportIntervalMillis: 5000, // Flush every 5s
maxExportBatchSize: 50, // Batch size
maxQueueSize: 2048, // Buffer limit
});
const sdk = new NodeSDK({ spanProcessors: [processor] });
sdk.start();
// Graceful shutdown on all signals
for (const signal of ["SIGTERM", "SIGINT", "SIGUSR2"]) {
process.on(signal, async () => {
await sdk.shutdown();
process.exit(0);
});
}
// v3 Legacy Production Config
import { Langfuse } from "langfuse";
const langfuse = new Langfuse({
flushAt: 25, // Balance between latency and efficiency
flushInterval: 5000, // 5 second flush interval
requestTimeout: 15000, // 15s timeout
enabled: true, // Explicitly enable
});
process.on("beforeExit", () => langfuse.shutdownAsync());
process.on("SIGTERM", () => langfuse.shutdownAsync().then(() => process.exit(0)));
Production Error Handling
import { observe, updateActiveObservation, startActiveObservation } from "@langfuse/tracing";
// Wrap all traced operations with error safety
const tracedEndpoint = observe({ name: "api-endpoint" }, async (req: Request) => {
try {
updateActiveObservation({
input: { path: req.url, method: req.method },
metadata: { userId: req.userId },
});
const result = await processRequest(req);
updateActiveObservation({ output: { status: 200 } });
return result;
} catch (error) {
// Log error to trace -- don't let tracing error mask app error
try {
updateActiveObservation({
output: { error: String(error) },
metadata: { level: "ERROR" },
});
} catch {
// Tracing failure must never break the app
}
throw error;
}
});
Pre-Deployment Verification Script
// scripts/verify-langfuse-prod.ts
import { LangfuseClient } from "@langfuse/client";
import { startActiveObservation, updateActiveObservation } from "@langfuse/tracing";
async function verify() {
const checks: Array<{ name: string; pass: boolean; detail: string }> = [];
// 1. Environment variables
const requiredVars = ["LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY"];
for (const v of requiredVars) {
checks.push({
name: `Env: ${v}`,
pass: !!process.env[v],
detail: process.env[v] ? `SET (${process.env[v]!.slice(0, 10)}...)` : "MISSING",
});
}
// 2. Key validation
const pk = process.env.LANGFUSE_PUBLIC_KEY || "";
const sk = process.env.LANGFUSE_SECRET_KEY || "";
checks.push({
name: "Key format",
pass: pk.startsWith("pk-lf-") && sk.startsWith("sk-lf-"),
detail: `Public: ${pk.startsWith("pk-lf-")}, Secret: ${sk.startsWith("sk-lf-")}`,
});
// 3. API connectivity
try {
const langfuse = new LangfuseClient();
// Try fetching prompts as a connectivity test
await langfuse.prompt.get("__health-check__").catch(() => {});
checks.push({ name: "API connectivity", pass: true, detail: "Connected" });
} catch (error) {
checks.push({ name: "API connectivity", pass: false, detail: String(error) });
}
// 4. Trace creation
try {
await startActiveObservation("prod-verify", async () => {
updateActiveObservation({
input: { test: true },
output: { verified: true },
metadata: { verification: "pre-deploy" },
});
});
checks.push({ name: "Trace creation", pass: true, detail: "Trace created" });
} catch (error) {
checks.push({ name: "Trace creation", pass: false, detail: String(error) });
}
// Report
console.log("\n=== Langfuse Production Verification ===\n");
let allPassed = true;
for (const check of checks) {
const icon = check.pass ? "PASS" : "FAIL";
console.log(` [${icon}] ${check.name}: ${check.detail}`);
if (!check.pass) allPassed = false;
}
console.log(`\n${allPassed ? "All checks passed." : "SOME CHECKS FAILED."}\n`);
if (!allPassed) process.exit(1);
}
verify();
Production Checklist
Authentication & Security
- Production API keys created (separate from dev/staging)
- Keys stored in secret manager (not env files or code)
- Key prefix validated at startup (
pk-lf-/sk-lf-) - PII scrubbing enabled on trace inputs/outputs
- Secret scanning in CI/CD pipeline
SDK Configuration
- Singleton client pattern (no per-request instantiation)
- Batch size tuned (
flushAt: 25-50) - Flush interval set (
flushInterval: 5000) - Request timeout configured (
requestTimeout: 15000)
Reliability
- Graceful shutdown on SIGTERM/SIGINT
- All spans end in
try/finally(v3) or useobserve/startActiveObservation(v4+) - Tracing errors caught -- never crash the app
- Circuit breaker for sustained failures
Monitoring
- Trace creation success/failure logged
- Flush latency tracked
- Rate limit errors monitored
- Dashboard alerts for quality score regression
Operations
- Runbook documented for Langfuse outages
- Fallback behavior defined (app works without Langfuse)
- Data retention policy configured
- Log rotation includes redaction of API keys
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Missing traces in prod | No flush on exit | Add shutdown handler for SIGTERM |
| Memory growth | Client created per request | Use singleton pattern |
| High latency | Small batches | Increase flushAt to 25-50 |
| Lost traces on deploy | No graceful shutdown | Add SIGTERM handler with sdk.shutdown() |
Resources
When not to use it
- →Instantiating Langfuse clients per request in production
- →Ignoring tracing errors that could crash the application
Prerequisites
Limitations
- →Requires singleton client pattern to avoid memory growth
- →Tracing errors must be caught to prevent masking application errors
How it compares
This approach prioritizes application stability and performance by explicitly handling tracing failures and shutdown signals.
Compared to similar skills
langfuse-prod-checklist side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| langfuse-prod-checklist (this skill) | 1 | 27d | Review | Advanced |
| langfuse | 7 | 6mo | No flags | Intermediate |
| instantly-observability | 2 | 27d | Caution | Intermediate |
| genkit-production-expert | 0 | 27d | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
langfuse
davila7
Expert in Langfuse - the open-source LLM observability platform. Covers tracing, prompt management, evaluation, datasets, and integration with LangChain, LlamaIndex, and OpenAI. Essential for debugging, monitoring, and improving LLM applications in production. Use when: langfuse, llm observability, llm tracing, prompt management, llm evaluation.
instantly-observability
jeremylongshore
Set up comprehensive observability for Instantly integrations with metrics, traces, and alerts. Use when implementing monitoring for Instantly operations, setting up dashboards, or configuring alerting for Instantly integration health. Trigger with phrases like "instantly monitoring", "instantly metrics", "instantly observability", "monitor instantly", "instantly alerts", "instantly tracing".
genkit-production-expert
jeremylongshore
Build production Firebase Genkit applications including RAG systems, multi-step flows, and tool calling for Node.js/Python/Go. Deploy to Firebase Functions or Cloud Run with AI monitoring. Use when asked to "create genkit flow" or "implement RAG". Trigger with relevant phrases based on skill purpose.
perplexity-observability
jeremylongshore
Set up comprehensive observability for Perplexity integrations with metrics, traces, and alerts. Use when implementing monitoring for Perplexity operations, setting up dashboards, or configuring alerting for Perplexity integration health. Trigger with phrases like "perplexity monitoring", "perplexity metrics", "perplexity observability", "monitor perplexity", "perplexity alerts", "perplexity tracing".
nuxthub-migration
onmax
Use when migrating NuxtHub projects or when user mentions NuxtHub Admin sunset, GitHub Actions deployment removal, self-hosting NuxtHub, or upgrading to v1/nightly. Covers v0.9.X self-hosting (stable) and v1/nightly multi-cloud (experimental, database/blob not ready).
pwa-development
alinaqi
Progressive Web Apps - service workers, caching strategies, offline, Workbox