[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H7K4YJB5GXKFTMT7JMKQ7W":3,"skill-same:01M6H7K4YJB5GXKFTMT7JMKQ7W":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6H7K4YJB5GXKFTMT7JMKQ7W","langfuse-performance-tuning",null,"Optimize Langfuse tracing performance for high-throughput applications.\nUse when experiencing latency issues, optimizing trace overhead,\nor scaling Langfuse for production workloads.\nTrigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n\"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".","micsapp\u002Fmicstec-skills","micsapp","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F82411001?v=4","01M6GWCFQ6D3PV8EHNY62NN5VW","01M6GWCFVE1PA5HG0DKC7AMFJ3",4,"MIT","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fclaude-code\u002Fplugins-plus-skills\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"performance","langfuse performance tuning","performance tuning","langfuse","tuning","for","openclaw","throughput","trigger","io","latency","scaling","optimize","edit","write","read","applications","tracing","issues","code","2026-11-10 10:12:30",false,"---\nname: langfuse-performance-tuning\ndescription: |\n  Optimize Langfuse tracing performance for high-throughput applications.\n  Use when experiencing latency issues, optimizing trace overhead,\n  or scaling Langfuse for production workloads.\n  Trigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n  \"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ncompatible-with: claude-code, codex, openclaw\n---\n# Langfuse Performance Tuning\n\n## Overview\nOptimize Langfuse tracing for minimal overhead and maximum throughput.\n\n## Prerequisites\n- Existing Langfuse integration\n- Performance baseline measurements\n- Understanding of async patterns\n\n## Performance Targets\n\n| Metric | Target | Critical |\n|--------|--------|----------|\n| Trace creation overhead | \u003C 1ms | \u003C 5ms |\n| Flush latency | \u003C 100ms | \u003C 500ms |\n| Memory per trace | \u003C 1KB | \u003C 5KB |\n| CPU overhead | \u003C 1% | \u003C 5% |\n\n## Instructions\n\n### Step 1: Measure Baseline Performance\n\n```typescript\n\u002F\u002F scripts\u002Fbenchmark-langfuse.ts\nimport { Langfuse } from \"langfuse\";\nimport { performance } from \"perf_hooks\";\n\nasync function benchmark() {\n  const langfuse = new Langfuse();\n  const iterations = 1000;  # 1000: 1 second in ms\n\n  \u002F\u002F Measure trace creation\n  const traceTimings: number[] = [];\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const trace = langfuse.trace({ name: `benchmark-${i}` });\n    traceTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure generation creation\n  const genTimings: number[] = [];\n  const trace = langfuse.trace({ name: \"gen-benchmark\" });\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const gen = trace.generation({\n      name: `gen-${i}`,\n      model: \"gpt-4\",\n      input: [{ role: \"user\", content: \"test\" }],\n    });\n    gen.end({ output: \"response\" });\n    genTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure flush\n  const flushStart = performance.now();\n  await langfuse.flushAsync();\n  const flushTime = performance.now() - flushStart;\n\n  \u002F\u002F Calculate stats\n  const stats = (arr: number[]) => ({\n    mean: arr.reduce((a, b) => a + b) \u002F arr.length,\n    p50: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.5)],\n    p95: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.95)],\n    p99: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.99)],\n  });\n\n  console.log(\"=== Langfuse Performance Benchmark ===\");\n  console.log(`\\nTrace Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(traceTimings), null, 2));\n  console.log(`\\nGeneration Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(genTimings), null, 2));\n  console.log(`\\nFlush Time: ${flushTime.toFixed(2)}ms`);\n\n  await langfuse.shutdownAsync();\n}\n\nbenchmark();\n```\n\n### Step 2: Optimize Batching Configuration\n\n```typescript\n\u002F\u002F High-throughput configuration\nconst langfuse = new Langfuse({\n  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,\n  secretKey: process.env.LANGFUSE_SECRET_KEY!,\n\n  \u002F\u002F Batching optimization\n  flushAt: 100,           \u002F\u002F Larger batches = fewer requests\n  flushInterval: 10000,   \u002F\u002F Less frequent flushes  # 10000: 10 seconds in ms\n\n  \u002F\u002F Timeout tuning\n  requestTimeout: 30000,  \u002F\u002F Allow time for large batches  # 30000: 30 seconds in ms\n\n  \u002F\u002F Optional: Disable in development\n  enabled: process.env.NODE_ENV === \"production\",\n});\n```\n\n### Step 3: Implement Non-Blocking Tracing\n\n```typescript\n\u002F\u002F Trace wrapper that never blocks the main operation\nclass NonBlockingLangfuse {\n  private langfuse: Langfuse;\n  private errorCount = 0;\n  private maxErrors = 10;\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n  }\n\n  \u002F\u002F Fire-and-forget trace\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    if (this.errorCount >= this.maxErrors) {\n      \u002F\u002F Circuit breaker: stop tracing if too many errors\n      return this.createNoOpTrace();\n    }\n\n    try {\n      return this.langfuse.trace(params);\n    } catch (error) {\n      this.errorCount++;\n      console.error(\"Langfuse trace error:\", error);\n      return this.createNoOpTrace();\n    }\n  }\n\n  private createNoOpTrace() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      update: () => {},\n      getTraceUrl: () => \"\",\n    };\n  }\n\n  private createNoOpSpan() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      end: () => {},\n    };\n  }\n\n  private createNoOpGeneration() {\n    return {\n      id: \"noop\",\n      end: () => {},\n    };\n  }\n\n  \u002F\u002F Background flush - don't await in hot path\n  flush() {\n    this.langfuse.flushAsync().catch((error) => {\n      this.errorCount++;\n      console.error(\"Langfuse flush error:\", error);\n    });\n  }\n\n  async shutdown() {\n    return this.langfuse.shutdownAsync();\n  }\n}\n```\n\n### Step 4: Optimize Data Payload Size\n\n```typescript\n\u002F\u002F Reduce trace payload size\nfunction optimizeTraceInput(input: any): any {\n  \u002F\u002F Truncate large strings\n  const MAX_STRING_LENGTH = 10000;  # 10000: 10 seconds in ms\n\n  if (typeof input === \"string\") {\n    return input.length > MAX_STRING_LENGTH\n      ? input.slice(0, MAX_STRING_LENGTH) + \"...[truncated]\"\n      : input;\n  }\n\n  if (Array.isArray(input)) {\n    \u002F\u002F Limit array size\n    const MAX_ARRAY_LENGTH = 100;\n    const truncated = input.slice(0, MAX_ARRAY_LENGTH);\n    return truncated.map(optimizeTraceInput);\n  }\n\n  if (typeof input === \"object\" && input !== null) {\n    \u002F\u002F Remove large binary data\n    const optimized: Record\u003Cstring, any> = {};\n    for (const [key, value] of Object.entries(input)) {\n      if (value instanceof Buffer || value instanceof Uint8Array) {\n        optimized[key] = `[Binary: ${value.length} bytes]`;\n      } else {\n        optimized[key] = optimizeTraceInput(value);\n      }\n    }\n    return optimized;\n  }\n\n  return input;\n}\n\n\u002F\u002F Use in traces\nconst trace = langfuse.trace({\n  name: \"optimized-trace\",\n  input: optimizeTraceInput(largeInput),\n});\n```\n\n### Step 5: Implement Sampling for Ultra-High Volume\n\n```typescript\ninterface SamplingStrategy {\n  shouldSample(params: TraceParams): boolean;\n}\n\n\u002F\u002F Deterministic sampling based on trace attributes\nclass DeterministicSampler implements SamplingStrategy {\n  private rate: number;\n\n  constructor(rate: number) {\n    this.rate = rate;\n  }\n\n  shouldSample(params: TraceParams): boolean {\n    \u002F\u002F Always sample errors\n    if (params.level === \"ERROR\" || params.tags?.includes(\"error\")) {\n      return true;\n    }\n\n    \u002F\u002F Deterministic hash-based sampling\n    const hash = this.hashString(params.name + (params.userId || \"\"));\n    return (hash % 100) \u003C (this.rate * 100);\n  }\n\n  private hashString(str: string): number {\n    let hash = 0;\n    for (let i = 0; i \u003C str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash \u003C\u003C 5) - hash) + char;\n      hash = hash & hash;\n    }\n    return Math.abs(hash);\n  }\n}\n\n\u002F\u002F Adaptive sampling based on throughput\nclass AdaptiveSampler implements SamplingStrategy {\n  private windowMs = 60000;  # 60000: 1 minute in ms\n  private maxPerWindow = 1000;  # 1000: 1 second in ms\n  private counts: number[] = [];\n\n  shouldSample(params: TraceParams): boolean {\n    const now = Date.now();\n    const windowStart = now - this.windowMs;\n\n    \u002F\u002F Clean old counts\n    this.counts = this.counts.filter((t) => t > windowStart);\n\n    \u002F\u002F Check if under limit\n    if (this.counts.length \u003C this.maxPerWindow) {\n      this.counts.push(now);\n      return true;\n    }\n\n    \u002F\u002F Over limit - only sample important traces\n    return params.level === \"ERROR\";\n  }\n}\n\n\u002F\u002F Apply sampling\nconst sampler = new DeterministicSampler(0.1); \u002F\u002F 10% sampling\n\nfunction sampledTrace(params: TraceParams) {\n  if (!sampler.shouldSample(params)) {\n    return createNoOpTrace();\n  }\n\n  return langfuse.trace({\n    ...params,\n    metadata: {\n      ...params.metadata,\n      sampled: true,\n    },\n  });\n}\n```\n\n### Step 6: Memory Management\n\n```typescript\n\u002F\u002F Prevent memory leaks with trace cleanup\nclass ManagedLangfuse {\n  private langfuse: Langfuse;\n  private activeTraces: Map\u003Cstring, { createdAt: Date }> = new Map();\n  private maxTraceAge = 300000; \u002F\u002F 5 minutes  # 300000 = configured value\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n\n    \u002F\u002F Periodic cleanup\n    setInterval(() => this.cleanupStaleTraces(), 60000);  # 60000: 1 minute in ms\n  }\n\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    const trace = this.langfuse.trace(params);\n    this.activeTraces.set(trace.id, { createdAt: new Date() });\n    return trace;\n  }\n\n  private cleanupStaleTraces() {\n    const now = Date.now();\n    let cleaned = 0;\n\n    for (const [id, meta] of this.activeTraces) {\n      if (now - meta.createdAt.getTime() > this.maxTraceAge) {\n        this.activeTraces.delete(id);\n        cleaned++;\n      }\n    }\n\n    if (cleaned > 0) {\n      console.log(`Cleaned up ${cleaned} stale trace references`);\n    }\n  }\n\n  getStats() {\n    return {\n      activeTraces: this.activeTraces.size,\n      heapUsed: process.memoryUsage().heapUsed \u002F 1024 \u002F 1024,  # 1024: 1 KB\n    };\n  }\n}\n```\n\n## Output\n- Baseline performance measurements\n- Optimized batching configuration\n- Non-blocking trace wrapper\n- Payload size optimization\n- Sampling strategies for high volume\n- Memory leak prevention\n\n## Performance Optimization Checklist\n\n| Optimization | Impact | Effort |\n|--------------|--------|--------|\n| Increase `flushAt` | High | Low |\n| Non-blocking traces | High | Medium |\n| Payload truncation | Medium | Low |\n| Sampling | High | Medium |\n| Memory management | Medium | Medium |\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| High latency | Small batch size | Increase `flushAt` |\n| Memory growth | No cleanup | Add trace cleanup |\n| Request timeouts | Large payloads | Truncate inputs |\n| High CPU | Sync operations | Use async patterns |\n\n## Resources\n- [Langfuse SDK Configuration](https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fsdk)\n- [Node.js Performance](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdocs\u002Fguides\u002Fdont-block-the-event-loop)\n- [Sampling Strategies](https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F)\n\n## Next Steps\nFor cost optimization, see `langfuse-cost-tuning`.\n\n## Examples\n\n**Basic usage**: Apply langfuse performance tuning to a standard project setup with default configuration options.\n\n**Advanced scenario**: Customize langfuse performance tuning for production environments with multiple constraints and team-specific requirements.","# Langfuse Performance Tuning\n\n## Overview\nOptimize Langfuse tracing for minimal overhead and maximum throughput.\n\n## Prerequisites\n- Existing Langfuse integration\n- Performance baseline measurements\n- Understanding of async patterns\n\n## Performance Targets\n\n| Metric | Target | Critical |\n|--------|--------|----------|\n| Trace creation overhead | \u003C 1ms | \u003C 5ms |\n| Flush latency | \u003C 100ms | \u003C 500ms |\n| Memory per trace | \u003C 1KB | \u003C 5KB |\n| CPU overhead | \u003C 1% | \u003C 5% |\n\n## Instructions\n\n### Step 1: Measure Baseline Performance\n\n```typescript\n\u002F\u002F scripts\u002Fbenchmark-langfuse.ts\nimport { Langfuse } from \"langfuse\";\nimport { performance } from \"perf_hooks\";\n\nasync function benchmark() {\n  const langfuse = new Langfuse();\n  const iterations = 1000;  # 1000: 1 second in ms\n\n  \u002F\u002F Measure trace creation\n  const traceTimings: number[] = [];\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const trace = langfuse.trace({ name: `benchmark-${i}` });\n    traceTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure generation creation\n  const genTimings: number[] = [];\n  const trace = langfuse.trace({ name: \"gen-benchmark\" });\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const gen = trace.generation({\n      name: `gen-${i}`,\n      model: \"gpt-4\",\n      input: [{ role: \"user\", content: \"test\" }],\n    });\n    gen.end({ output: \"response\" });\n    genTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure flush\n  const flushStart = performance.now();\n  await langfuse.flushAsync();\n  const flushTime = performance.now() - flushStart;\n\n  \u002F\u002F Calculate stats\n  const stats = (arr: number[]) => ({\n    mean: arr.reduce((a, b) => a + b) \u002F arr.length,\n    p50: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.5)],\n    p95: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.95)],\n    p99: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.99)],\n  });\n\n  console.log(\"=== Langfuse Performance Benchmark ===\");\n  console.log(`\\nTrace Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(traceTimings), null, 2));\n  console.log(`\\nGeneration Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(genTimings), null, 2));\n  console.log(`\\nFlush Time: ${flushTime.toFixed(2)}ms`);\n\n  await langfuse.shutdownAsync();\n}\n\nbenchmark();\n```\n\n### Step 2: Optimize Batching Configuration\n\n```typescript\n\u002F\u002F High-throughput configuration\nconst langfuse = new Langfuse({\n  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,\n  secretKey: process.env.LANGFUSE_SECRET_KEY!,\n\n  \u002F\u002F Batching optimization\n  flushAt: 100,           \u002F\u002F Larger batches = fewer requests\n  flushInterval: 10000,   \u002F\u002F Less frequent flushes  # 10000: 10 seconds in ms\n\n  \u002F\u002F Timeout tuning\n  requestTimeout: 30000,  \u002F\u002F Allow time for large batches  # 30000: 30 seconds in ms\n\n  \u002F\u002F Optional: Disable in development\n  enabled: process.env.NODE_ENV === \"production\",\n});\n```\n\n### Step 3: Implement Non-Blocking Tracing\n\n```typescript\n\u002F\u002F Trace wrapper that never blocks the main operation\nclass NonBlockingLangfuse {\n  private langfuse: Langfuse;\n  private errorCount = 0;\n  private maxErrors = 10;\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n  }\n\n  \u002F\u002F Fire-and-forget trace\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    if (this.errorCount >= this.maxErrors) {\n      \u002F\u002F Circuit breaker: stop tracing if too many errors\n      return this.createNoOpTrace();\n    }\n\n    try {\n      return this.langfuse.trace(params);\n    } catch (error) {\n      this.errorCount++;\n      console.error(\"Langfuse trace error:\", error);\n      return this.createNoOpTrace();\n    }\n  }\n\n  private createNoOpTrace() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      update: () => {},\n      getTraceUrl: () => \"\",\n    };\n  }\n\n  private createNoOpSpan() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      end: () => {},\n    };\n  }\n\n  private createNoOpGeneration() {\n    return {\n      id: \"noop\",\n      end: () => {},\n    };\n  }\n\n  \u002F\u002F Background flush - don't await in hot path\n  flush() {\n    this.langfuse.flushAsync().catch((error) => {\n      this.errorCount++;\n      console.error(\"Langfuse flush error:\", error);\n    });\n  }\n\n  async shutdown() {\n    return this.langfuse.shutdownAsync();\n  }\n}\n```\n\n### Step 4: Optimize Data Payload Size\n\n```typescript\n\u002F\u002F Reduce trace payload size\nfunction optimizeTraceInput(input: any): any {\n  \u002F\u002F Truncate large strings\n  const MAX_STRING_LENGTH = 10000;  # 10000: 10 seconds in ms\n\n  if (typeof input === \"string\") {\n    return input.length > MAX_STRING_LENGTH\n      ? input.slice(0, MAX_STRING_LENGTH) + \"...[truncated]\"\n      : input;\n  }\n\n  if (Array.isArray(input)) {\n    \u002F\u002F Limit array size\n    const MAX_ARRAY_LENGTH = 100;\n    const truncated = input.slice(0, MAX_ARRAY_LENGTH);\n    return truncated.map(optimizeTraceInput);\n  }\n\n  if (typeof input === \"object\" && input !== null) {\n    \u002F\u002F Remove large binary data\n    const optimized: Record\u003Cstring, any> = {};\n    for (const [key, value] of Object.entries(input)) {\n      if (value instanceof Buffer || value instanceof Uint8Array) {\n        optimized[key] = `[Binary: ${value.length} bytes]`;\n      } else {\n        optimized[key] = optimizeTraceInput(value);\n      }\n    }\n    return optimized;\n  }\n\n  return input;\n}\n\n\u002F\u002F Use in traces\nconst trace = langfuse.trace({\n  name: \"optimized-trace\",\n  input: optimizeTraceInput(largeInput),\n});\n```\n\n### Step 5: Implement Sampling for Ultra-High Volume\n\n```typescript\ninterface SamplingStrategy {\n  shouldSample(params: TraceParams): boolean;\n}\n\n\u002F\u002F Deterministic sampling based on trace attributes\nclass DeterministicSampler implements SamplingStrategy {\n  private rate: number;\n\n  constructor(rate: number) {\n    this.rate = rate;\n  }\n\n  shouldSample(params: TraceParams): boolean {\n    \u002F\u002F Always sample errors\n    if (params.level === \"ERROR\" || params.tags?.includes(\"error\")) {\n      return true;\n    }\n\n    \u002F\u002F Deterministic hash-based sampling\n    const hash = this.hashString(params.name + (params.userId || \"\"));\n    return (hash % 100) \u003C (this.rate * 100);\n  }\n\n  private hashString(str: string): number {\n    let hash = 0;\n    for (let i = 0; i \u003C str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash \u003C\u003C 5) - hash) + char;\n      hash = hash & hash;\n    }\n    return Math.abs(hash);\n  }\n}\n\n\u002F\u002F Adaptive sampling based on throughput\nclass AdaptiveSampler implements SamplingStrategy {\n  private windowMs = 60000;  # 60000: 1 minute in ms\n  private maxPerWindow = 1000;  # 1000: 1 second in ms\n  private counts: number[] = [];\n\n  shouldSample(params: TraceParams): boolean {\n    const now = Date.now();\n    const windowStart = now - this.windowMs;\n\n    \u002F\u002F Clean old counts\n    this.counts = this.counts.filter((t) => t > windowStart);\n\n    \u002F\u002F Check if under limit\n    if (this.counts.length \u003C this.maxPerWindow) {\n      this.counts.push(now);\n      return true;\n    }\n\n    \u002F\u002F Over limit - only sample important traces\n    return params.level === \"ERROR\";\n  }\n}\n\n\u002F\u002F Apply sampling\nconst sampler = new DeterministicSampler(0.1); \u002F\u002F 10% sampling\n\nfunction sampledTrace(params: TraceParams) {\n  if (!sampler.shouldSample(params)) {\n    return createNoOpTrace();\n  }\n\n  return langfuse.trace({\n    ...params,\n    metadata: {\n      ...params.metadata,\n      sampled: true,\n    },\n  });\n}\n```\n\n### Step 6: Memory Management\n\n```typescript\n\u002F\u002F Prevent memory leaks with trace cleanup\nclass ManagedLangfuse {\n  private langfuse: Langfuse;\n  private activeTraces: Map\u003Cstring, { createdAt: Date }> = new Map();\n  private maxTraceAge = 300000; \u002F\u002F 5 minutes  # 300000 = configured value\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n\n    \u002F\u002F Periodic cleanup\n    setInterval(() => this.cleanupStaleTraces(), 60000);  # 60000: 1 minute in ms\n  }\n\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    const trace = this.langfuse.trace(params);\n    this.activeTraces.set(trace.id, { createdAt: new Date() });\n    return trace;\n  }\n\n  private cleanupStaleTraces() {\n    const now = Date.now();\n    let cleaned = 0;\n\n    for (const [id, meta] of this.activeTraces) {\n      if (now - meta.createdAt.getTime() > this.maxTraceAge) {\n        this.activeTraces.delete(id);\n        cleaned++;\n      }\n    }\n\n    if (cleaned > 0) {\n      console.log(`Cleaned up ${cleaned} stale trace references`);\n    }\n  }\n\n  getStats() {\n    return {\n      activeTraces: this.activeTraces.size,\n      heapUsed: process.memoryUsage().heapUsed \u002F 1024 \u002F 1024,  # 1024: 1 KB\n    };\n  }\n}\n```\n\n## Output\n- Baseline performance measurements\n- Optimized batching configuration\n- Non-blocking trace wrapper\n- Payload size optimization\n- Sampling strategies for high volume\n- Memory leak prevention\n\n## Performance Optimization Checklist\n\n| Optimization | Impact | Effort |\n|--------------|--------|--------|\n| Increase `flushAt` | High | Low |\n| Non-blocking traces | High | Medium |\n| Payload truncation | Medium | Low |\n| Sampling | High | Medium |\n| Memory management | Medium | Medium |\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| High latency | Small batch size | Increase `flushAt` |\n| Memory growth | No cleanup | Add trace cleanup |\n| Request timeouts | Large payloads | Truncate inputs |\n| High CPU | Sync operations | Use async patterns |\n\n## Resources\n- [Langfuse SDK Configuration](https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fsdk)\n- [Node.js Performance](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdocs\u002Fguides\u002Fdont-block-the-event-loop)\n- [Sampling Strategies](https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F)\n\n## Next Steps\nFor cost optimization, see `langfuse-cost-tuning`.\n\n## Examples\n\n**Basic usage**: Apply langfuse performance tuning to a standard project setup with default configuration options.\n\n**Advanced scenario**: Customize langfuse performance tuning for production environments with multiple constraints and team-specific requirements.",{"name":5,"author":43,"license":14,"version":44,"description":45,"allowed-tools":46,"compatible-with":47},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Optimize Langfuse tracing performance for high-throughput applications.\nUse when experiencing latency issues, optimizing trace overhead,\nor scaling Langfuse for production workloads.\nTrigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n\"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".\n","Read, Write, Edit","claude-code, codex, openclaw","master","3f5d983eb4ef375b749adcd6b07ec03bd82ae8a8","claude-code\u002Fplugins-plus-skills\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning",0,"https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills","https:\u002F\u002Fgithub.com\u002Fmicsapp","2026-03-20 11:24:18",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add micsapp\u002Fmicstec-skills --skill langfuse-performance-tuning",{"tool":61,"command":62},"bunx","bunx skills add micsapp\u002Fmicstec-skills --skill langfuse-performance-tuning",{"tool":64,"command":65},"pnpm","pnpm dlx skills add micsapp\u002Fmicstec-skills --skill langfuse-performance-tuning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fclaude-code\u002Fplugins-plus-skills\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning\u002FSKILL.md",true,[],[70,106,135,156,176,199],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":86,"publishedAt":38},"01M6HBTJ02FXBFG9NYEHHYAP52","azure-apim-architecture","Analyzes and explains Azure API Management architecture decisions for enterprise API marketplace implementations using VNet Internal mode, Front Door, hybrid authentication, and multi-environment strategies. Use when discussing APIM component selection, network topology, cost optimization, or comparing alternatives like workspaces vs instances, VNet Internal vs External mode, or Front Door vs Application Gateway.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fcopilot-agent-skills\u002F.github\u002Fskills\u002Fazure-apim-architecture\u002FSKILL.md",[76,81],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,23],"architecture","azure","azure apim architecture","component","authentication","gateway","topology","Optimization","network","api","team","environment","multi-environment","workspaces","instances","selection","strategies","azure api management","mode",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":120,"publishedAt":38},"01M6HBT7J4H082JEEA670B3EQ9","apiops-deployment","Guides deployment of Azure API Management infrastructure using Infrastructure as Code (Bicep\u002FTerraform), CI\u002FCD pipelines (GitHub Actions\u002FAzure DevOps), and APIOps workflows. Use when deploying APIM, creating pipelines, or implementing dev→test→prod promotion strategies.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fcopilot-agent-skills\u002F.github\u002Fskills\u002Fapiops-deployment\u002FSKILL.md",[112,113,116,119],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},{"categoryNo":114,"categoryName":115,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":117,"categoryName":118,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},[121,122,123,124,88,125,37,126,127,128,129,130,96,97,103,131,132,104,133,134],"deployment","apiops deployment","workflows","azure devops","infrastructure","infrastructure as code","actions","ci","github actions","github-actions","as","guides","CI\u002FCD","implementing",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":38},"01M6HBT2HEA23THNE9E00GYQBE","apim-policy-authoring","Creates production-ready Azure API Management policy XML for authentication (OAuth 2.0, JWT validation, subscription keys), rate limiting, CORS configuration, error handling, and API transformations. Use when implementing API security, access control, or request\u002Fresponse processing logic.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fcopilot-agent-skills\u002F.github\u002Fskills\u002Fapim-policy-authoring\u002FSKILL.md",[141],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},[143,144,145,146,88,91,96,97,147,148,149,150,151,152,153,104,154,155,134,23],"policy","authoring","apim policy authoring","security","access","use","ready","api security","Access Control","error","processing","cors configuration","production-ready",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":164,"publishedAt":38},"01M6HBSY65SB29J9WE9KYD0K6T","api-security-review","Reviews Azure API Management configurations for security vulnerabilities, OWASP API Security Top 10 compliance, VNet Internal mode validation, Private Link verification, and Azure Security Benchmark alignment. Use when performing security audits, pre-deployment validation, or compliance reviews.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fcopilot-agent-skills\u002F.github\u002Fskills\u002Fapi-security-review\u002FSKILL.md",[162,163],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},[165,146,166,96,150,167,88,121,168,169,170,171,97,172,104,173,174,175,105,23],"review","security review","api security review","benchmark","verification","owasp","owasp-api","alignment","azure security","reviews","top",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":38},"01M6HBSRW4PDFE6K4F8JYPZQ05","jira-cli","Interact with Jira from the command line to create, list, view, edit, and transition issues, manage sprints and epics, and perform common Jira workflows. Use when the user asks about Jira tasks, tickets, issues, sprints, or needs to manage project work items.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fawesome-copilot-agents\u002Fskills\u002Fjira-cli\u002FSKILL.md",[],[183,184,185,123,186,187,188,36,96,189,190,191,31,192,193,194,195,196,197,198],"cli","jira","jira cli","init","tasks","create","common","work","command","list","view","project","project work","token","line","sprints",{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":203,"categories":204,"keywords":205,"publishedAt":38},"01M6HBSNS3JHMW603G47TWE31H","calculator","Performs arbitrary-precision arithmetic calculations including addition, subtraction, multiplication, division, and exponents. Use when the user asks to calculate, compute, or evaluate math expressions, or when precise decimal arithmetic is needed to avoid floating-point errors.","https:\u002F\u002Fgithub.com\u002Fmicsapp\u002Fmicstec-skills\u002Fblob\u002Fmaster\u002Fcopilot-cli\u002Fawesome-copilot-agents\u002Fskills\u002Fcalculator\u002FSKILL.md",[],[201,206,207,208,209,210,211,148,212,213],"npm","js","calculate","node","math","user","compute","errors"]