Loading...
Loading...
Optimize CodeRabbit API performance with caching, batching, and connection pooling. Use when experiencing slow API responses, implementing caching strategies, or optimizing request throughput for CodeRabbit integrations. Trigger with phrases like "coderabbit performance", "optimize coderabbit", "coderabbit latency", "coderabbit caching", "coderabbit slow", "coderabbit batch".
npx skill4agent add jeremylongshore/claude-code-plugins-plus-skills coderabbit-performance-tuning| Operation | P50 | P95 | P99 |
|---|---|---|---|
| Read | 50ms | 150ms | 300ms |
| Write | 100ms | 250ms | 500ms |
| List | 75ms | 200ms | 400ms |
import { LRUCache } from 'lru-cache';
const cache = new LRUCache<string, any>({
max: 1000,
ttl: 60000, // 1 minute
updateAgeOnGet: true,
});
async function cachedCodeRabbitRequest<T>(
key: string,
fetcher: () => Promise<T>,
ttl?: number
): Promise<T> {
const cached = cache.get(key);
if (cached) return cached as T;
const result = await fetcher();
cache.set(key, result, { ttl });
return result;
}import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
async function cachedWithRedis<T>(
key: string,
fetcher: () => Promise<T>,
ttlSeconds = 60
): Promise<T> {
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const result = await fetcher();
await redis.setex(key, ttlSeconds, JSON.stringify(result));
return result;
}import DataLoader from 'dataloader';
const coderabbitLoader = new DataLoader<string, any>(
async (ids) => {
// Batch fetch from CodeRabbit
const results = await coderabbitClient.batchGet(ids);
return ids.map(id => results.find(r => r.id === id) || null);
},
{
maxBatchSize: 100,
batchScheduleFn: callback => setTimeout(callback, 10),
}
);
// Usage - automatically batched
const [item1, item2, item3] = await Promise.all([
coderabbitLoader.load('id-1'),
coderabbitLoader.load('id-2'),
coderabbitLoader.load('id-3'),
]);import { Agent } from 'https';
// Keep-alive connection pooling
const agent = new Agent({
keepAlive: true,
maxSockets: 10,
maxFreeSockets: 5,
timeout: 30000,
});
const client = new CodeRabbitClient({
apiKey: process.env.CODERABBIT_API_KEY!,
httpAgent: agent,
});async function* paginatedCodeRabbitList<T>(
fetcher: (cursor?: string) => Promise<{ data: T[]; nextCursor?: string }>
): AsyncGenerator<T> {
let cursor: string | undefined;
do {
const { data, nextCursor } = await fetcher(cursor);
for (const item of data) {
yield item;
}
cursor = nextCursor;
} while (cursor);
}
// Usage
for await (const item of paginatedCodeRabbitList(cursor =>
coderabbitClient.list({ cursor, limit: 100 })
)) {
await process(item);
}async function measuredCodeRabbitCall<T>(
operation: string,
fn: () => Promise<T>
): Promise<T> {
const start = performance.now();
try {
const result = await fn();
const duration = performance.now() - start;
console.log({ operation, duration, status: 'success' });
return result;
} catch (error) {
const duration = performance.now() - start;
console.error({ operation, duration, status: 'error', error });
throw error;
}
}| Issue | Cause | Solution |
|---|---|---|
| Cache miss storm | TTL expired | Use stale-while-revalidate |
| Batch timeout | Too many items | Reduce batch size |
| Connection exhausted | No pooling | Configure max sockets |
| Memory pressure | Cache too large | Set max cache entries |
const withPerformance = <T>(name: string, fn: () => Promise<T>) =>
measuredCodeRabbitCall(name, () =>
cachedCodeRabbitRequest(`cache:${name}`, fn)
);coderabbit-cost-tuning