posthog-observability
Monitors PostHog event volume, flag latency, and API consumption.
Install
mkdir -p .claude/skills/posthog-observability && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/6625" && unzip -o skill.zip -d .claude/skills/posthog-observability && rm skill.zipInstalls to .claude/skills/posthog-observability
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.
Monitor PostHog integration health: event ingestion rates, feature flagKey capabilities
- →Monitor PostHog event ingestion rates and identify drops
- →Instrument and track feature flag evaluation latency
- →Monitor event volume by type to detect instrumentation regressions
- →Track API rate limit consumption to prevent 429 errors
- →Create Prometheus alerts for PostHog health and billing limits
How it works
The skill monitors PostHog integration health by querying event ingestion rates, instrumenting feature flag evaluation latency, and tracking event volume. It uses Prometheus for alerting on issues like ingestion drops, slow flag evaluations, and approaching billing limits.
Inputs & outputs
When to use posthog-observability
- →Tracking event ingestion rates
- →Monitoring feature flag evaluation latency
- →Setting up PostHog health alerts
- →Managing API rate limit consumption
About this skill
PostHog Observability
Overview
Monitor PostHog integration health with four key signals: event ingestion rate (are events flowing?), feature flag evaluation latency (are flags fast enough for hot paths?), event volume by type (detect instrumentation regressions), and API rate limit consumption (are we approaching 429s?).
Prerequisites
- PostHog project with personal API key (
phx_...) - Application instrumented with PostHog SDK
- Prometheus/Grafana or equivalent monitoring stack (optional)
Instructions
Step 1: Event Ingestion Health Check
set -euo pipefail
# Check if events are flowing (last 24 hours)
curl "https://app.posthog.com/api/projects/$POSTHOG_PROJECT_ID/query/" \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": {
"kind": "HogQLQuery",
"query": "SELECT toStartOfHour(timestamp) AS hour, count() AS events FROM events WHERE timestamp > now() - interval 24 hour GROUP BY hour ORDER BY hour"
}
}' | jq '.results | map({hour: .[0], events: .[1]}) | .[-3:]'
Step 2: Instrument Flag Evaluation Latency
// posthog-instrumented.ts
import { PostHog } from 'posthog-node';
const posthog = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
host: 'https://us.i.posthog.com',
personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY,
});
// Wrap flag evaluation with timing
async function getFlag(flagKey: string, userId: string): Promise<any> {
const start = performance.now();
const value = await posthog.getFeatureFlag(flagKey, userId);
const durationMs = performance.now() - start;
// Emit metrics to your monitoring system
emitHistogram('posthog_flag_eval_duration_ms', durationMs, { flag: flagKey });
emitCounter('posthog_flag_evals_total', 1, { flag: flagKey, result: String(value) });
// Alert on slow evaluations (likely means local eval not configured)
if (durationMs > 200) {
console.warn(`[PostHog] Slow flag eval: ${flagKey} took ${durationMs.toFixed(0)}ms — check personalApiKey`);
}
return value;
}
// Example: emit to Prometheus via prom-client
import { Histogram, Counter, Gauge } from 'prom-client';
const flagDuration = new Histogram({
name: 'posthog_flag_eval_duration_ms',
help: 'PostHog feature flag evaluation duration',
labelNames: ['flag'],
buckets: [1, 5, 10, 50, 100, 200, 500, 1000],
});
const flagEvals = new Counter({
name: 'posthog_flag_evals_total',
help: 'Total PostHog feature flag evaluations',
labelNames: ['flag', 'result'],
});
function emitHistogram(name: string, value: number, labels: Record<string, string>) {
flagDuration.observe(labels, value);
}
function emitCounter(name: string, value: number, labels: Record<string, string>) {
flagEvals.inc(labels, value);
}
Step 3: Monitor Event Volume and Billing
// Run on a cron (e.g., every 6 hours)
async function checkEventVolume() {
const result = await fetch(
`https://app.posthog.com/api/projects/${process.env.POSTHOG_PROJECT_ID}/query/`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}`,
},
body: JSON.stringify({
query: {
kind: 'HogQLQuery',
query: `
SELECT
count() AS events_this_month,
uniq(distinct_id) AS unique_users,
count() / dateDiff('day', toStartOfMonth(now()), now()) AS daily_avg
FROM events
WHERE timestamp > toStartOfMonth(now())
`,
},
}),
}
);
const data = await result.json();
const [eventsThisMonth, uniqueUsers, dailyAvg] = data.results[0];
const projectedMonthly = dailyAvg * 30;
const FREE_TIER = 1_000_000;
const metrics = {
events_this_month: eventsThisMonth,
unique_users: uniqueUsers,
daily_average: Math.round(dailyAvg),
projected_monthly: Math.round(projectedMonthly),
pct_of_free_tier: Math.round((projectedMonthly / FREE_TIER) * 100),
};
// Emit gauge metrics
const volumeGauge = new Gauge({
name: 'posthog_events_month_total',
help: 'PostHog events this month',
});
volumeGauge.set(eventsThisMonth);
// Alert if approaching limits
if (projectedMonthly > FREE_TIER * 0.8) {
await sendAlert(`PostHog: projected ${Math.round(projectedMonthly / 1000)}K events this month (free tier: 1M)`);
}
return metrics;
}
Step 4: Prometheus Alert Rules
# prometheus/posthog-alerts.yml
groups:
- name: posthog
rules:
- alert: PostHogIngestionDrop
expr: |
rate(posthog_events_captured_total[1h])
< rate(posthog_events_captured_total[1h] offset 1d) * 0.5
for: 15m
labels:
severity: warning
annotations:
summary: "PostHog event ingestion dropped >50% vs yesterday"
- alert: PostHogFlagEvalSlow
expr: |
histogram_quantile(0.95, rate(posthog_flag_eval_duration_ms_bucket[5m])) > 200
for: 5m
labels:
severity: warning
annotations:
summary: "PostHog flag eval P95 > 200ms — check if personalApiKey is set"
- alert: PostHogBillingAlert
expr: posthog_events_month_total > 800000
labels:
severity: info
annotations:
summary: "PostHog events approaching 1M free tier limit"
- alert: PostHogCaptureErrors
expr: rate(posthog_capture_errors_total[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "PostHog capture errors elevated — events may be lost"
Step 5: Health Check Dashboard Queries
// Dashboard panels to track PostHog health
const dashboardQueries = {
// Events per hour (last 24h)
eventRate: `
SELECT toStartOfHour(timestamp) AS hour, count() AS events
FROM events WHERE timestamp > now() - interval 24 hour
GROUP BY hour ORDER BY hour
`,
// Events by type (last 7 days)
eventsByType: `
SELECT event, count() AS total
FROM events WHERE timestamp > now() - interval 7 day
GROUP BY event ORDER BY total DESC LIMIT 15
`,
// Unique users per day (last 30 days)
dailyActiveUsers: `
SELECT toDate(timestamp) AS day, uniq(distinct_id) AS users
FROM events WHERE timestamp > now() - interval 30 day
GROUP BY day ORDER BY day
`,
// Event ingestion latency estimate
ingestionFreshness: `
SELECT max(timestamp) AS latest_event,
dateDiff('second', max(timestamp), now()) AS seconds_behind
FROM events
`,
};
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Zero events for 1h+ | SDK not initialized or API down | Check PostHog status, verify SDK init |
| Flag eval >200ms | No personalApiKey | Add personal key for local evaluation |
| Event volume spike | New feature autocapturing | Review autocapture config, add filters |
| Rate limit 429 | Too many API queries | Cache results, reduce poll frequency |
Output
- Flag evaluation latency instrumentation
- Event volume and billing monitoring
- Prometheus alert rules for PostHog health
- HogQL dashboard queries for key metrics
- Automated alerts for ingestion drops and billing limits
Resources
When not to use it
- →When not needing to monitor PostHog integration health
- →When not using Prometheus/Grafana or an equivalent monitoring stack
- →When not concerned with event ingestion rates or feature flag latency
Prerequisites
Limitations
- →Zero events for 1h+ might indicate SDK not initialized or API down
- →Flag evaluation >200ms might indicate missing personal API key
- →Event volume spikes might indicate new feature autocapturing
How it compares
This skill provides a structured approach to PostHog observability with metrics and alerts, which differs from manually checking PostHog dashboards or logs for integration health.
Compared to similar skills
posthog-observability side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| posthog-observability (this skill) | 1 | 25d | Caution | Advanced |
| distributed-tracing | 5 | 2mo | No flags | Intermediate |
| service-mesh-observability | 5 | 2mo | No flags | Advanced |
| observability-engineer | 12 | 4mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
distributed-tracing
wshobson
Implement distributed tracing with Jaeger and Tempo to track requests across microservices and identify performance bottlenecks. Use when debugging microservices, analyzing request flows, or implementing observability for distributed systems.
service-mesh-observability
wshobson
Implement comprehensive observability for service meshes including distributed tracing, metrics, and visualization. Use when setting up mesh monitoring, debugging latency issues, or implementing SLOs for service communication.
observability-engineer
sickn33
Build production-ready monitoring, logging, and tracing systems. Implements comprehensive observability strategies, SLI/SLO management, and incident response workflows. Use PROACTIVELY for monitoring infrastructure, performance optimization, or production reliability.
prometheus-configuration
wshobson
Set up Prometheus for comprehensive metric collection, storage, and monitoring of infrastructure and applications. Use when implementing metrics collection, setting up monitoring infrastructure, or configuring alerting systems.
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.
slo-implementation
wshobson
Define and implement Service Level Indicators (SLIs) and Service Level Objectives (SLOs) with error budgets and alerting. Use when establishing reliability targets, implementing SRE practices, or measuring service performance.