Apache Airflow DAG Patterns
Build production Apache Airflow DAGs with best practices for operators, sensors, testing, and deployment. Use when creating data pipelines, orchestrating workflows, or scheduling batch jobs.
5,019,680 AI resources indexedWorking toward the worldβs largest AI resource index.
Prometheus monitoring patterns, cardinality management, alerting best practices, and PromQL traps.
---
name: prometheus-24e3045f21d5
slug: prom
version: 1.0.0
description: Prometheus monitoring patterns, cardinality management, alerting best practices, and PromQL traps.
homepage: https://clawic.com/skills/prom
metadata:
category: infrastructure
skills:
- prometheus
- monitoring
- alerting
- metrics
- observability
clawdbot:
emoji: π
displayName: Prometheus
---
## Cardinality Explosions
- Every unique label combination creates a new time series β `user_id` as label kills Prometheus
- Avoid high-cardinality labels: user IDs, email addresses, request IDs, timestamps, UUIDs
- Check cardinality: `prometheus_tsdb_head_series` metric β above 1M series needs attention
- Use histograms for latency, not per-request labels β buckets are fixed cardinality
- Relabeling can drop dangerous labels before ingestion: `labeldrop` in scrape config
## Histogram vs Summary
- Histograms: use for SLOs, aggregatable across instances, buckets defined upfront
- Summaries: use when you need exact percentiles, cannot aggregate across instances
- Histogram bucket boundaries must be defined before data arrives β wrong buckets = wrong percentiles
- Default buckets (.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10) assume HTTP latency β adjust for your use case
## Rate and Increase
- `rate()` requires range selector at least 4x scrape interval β `rate(metric[1m])` with 30s scrape misses data
- `rate()` is per-second, `increase()` is total over range β don't confuse them
- Counter resets on restart β `rate()` handles this, raw delta doesn't
- `irate()` uses only last two samples β too spiky for alerting, use `rate()` for alerts
## Alerting Mistakes
- Alert on symptoms, not causes β "high latency" not "high CPU"
- `for` clause prevents flapping: `for: 5m` means condition must hold 5 minutes before firing
- Missing `for` clause = fires immediately on first match = noisy
- Alerts need `runbook_url` label β on-call needs to know what to do, not just that something's wrong
- Test alerts with `promtool check rules` β syntax errors discovered at 3am are bad
## PromQL Traps
- `and` is intersection by labels, not boolean AND β results must have matching label sets
- `or` fills in missing series, doesn't do boolean OR on values
- `{}` without metric name is expensive β scans all metrics
- `offset` goes back in time: `metric offset 1h` is value from 1 hour ago
- Comparison operators filter series: `http_requests > 100` drops series below 100, doesn't return boolean
## Scrape Configuration
- `honor_labels: true` trusts source labels β use only when source is authoritative (e.g., Pushgateway)
- `scrape_timeout` must be less than `scrape_interval` β otherwise overlapping scrapes
- Static configs don't reload without restart β use file_sd or service discovery for dynamic targets
- TLS verification disabled (`insecure_skip_verify`) should be temporary, never permanent
## Pushgateway Pitfalls
- Pushgateway is for batch jobs, not services β services should expose /metrics
- Metrics persist until deleted β stale metrics from dead jobs confuse dashboards
- Add job and instance labels to distinguish sources β default grouping hides failures
- Delete metrics when job completes: `curl -X DELETE http://pushgateway/metrics/job/myjob`
## Recording Rules
- Pre-compute expensive queries: `record: job:request_duration_seconds:rate5m`
- Naming convention: `level:metric:operations` β helps identify what rules produce
- Recording rules update every evaluation interval β not instant, plan for slight delay
- Reduce cardinality with recording rules: aggregate away labels you don't need for alerting
## Federation and Remote Write
- Federation for pulling from other Prometheus β use sparingly, adds latency
- Remote write for long-term storage β Prometheus local storage is not durable
- Remote write can buffer during outages β but buffer is finite, data loss on extended outages
- Prometheus is not highly available by default β run two instances scraping same targets
## Common Operational Issues
- TSDB corruption on unclean shutdown β use `--storage.tsdb.wal-compression` and monitor disk space
- Memory grows with series count β each series costs ~3KB RAM
- Compaction pauses during high load β leave 40% disk headroom
- Scrape targets stuck "Unknown" β check network, firewall, target actually exposing /metrics
## Label Best Practices
- Use labels for dimensions you'll filter/aggregate by β environment, service, instance
- Keep label values low-cardinality β tens or hundreds, not thousands
- Consistent naming: `snake_case`, prefix with domain: `http_requests_total`, `node_cpu_seconds_total`
- `le` label is reserved for histogram buckets β don't use for other purposes
---
name: prometheus-24e3045f21d5
slug: prom
version: 1.0.0
description: Prometheus monitoring patterns, cardinality management, alerting best practices, and PromQL traps.
homepage: https://clawic.com/skills/prom
metadata:
category: infrastructure
skills:
- prometheus
- monitoring
- alerting
- metrics
- observability
clawdbot:
emoji: π
displayName: Prometheus
---
## Cardinality Explosions
- Every unique label combination creates a new time series β `user_id` as label kills Prometheus
- Avoid high-cardinality labels: user IDs, email addresses, request IDs, timestamps, UUIDs
- Check cardinality: `prometheus_tsdb_head_series` metric β above 1M series needs attention
- Use histograms for latency, not per-request labels β buckets are fixed cardinality
- Relabeling can drop dangerous labels before ingestion: `labeldrop` in scrape config
## Histogram vs Summary
- Histograms: use for SLOs, aggregatable across instances, buckets defined upfront
- Summaries: use when you need exact percentiles, cannot aggregate across instances
- Histogram bucket boundaries must be defined before data arrives β wrong buckets = wrong percentiles
- Default buckets (.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10) assume HTTP latency β adjust for your use case
## Rate and Increase
- `rate()` requires range selector at least 4x scrape interval β `rate(metric[1m])` with 30s scrape misses data
- `rate()` is per-second, `increase()` is total over range β don't confuse them
- Counter resets on restart β `rate()` handles this, raw delta doesn't
- `irate()` uses only last two samples β too spiky for alerting, use `rate()` for alerts
## Alerting Mistakes
- Alert on symptoms, not causes β "high latency" not "high CPU"
- `for` clause prevents flapping: `for: 5m` means condition must hold 5 minutes before firing
- Missing `for` clause = fires immediately on first match = noisy
- Alerts need `runbook_url` label β on-call needs to know what to do, not just that something's wrong
- Test alerts with `promtool check rules` β syntax errors discovered at 3am are bad
## PromQL Traps
- `and` is intersection by labels, not boolean AND β results must have matching label sets
- `or` fills in missing series, doesn't do boolean OR on values
- `{}` without metric name is expensive β scans all metrics
- `offset` goes back in time: `metric offset 1h` is value from 1 hour ago
- Comparison operators filter series: `http_requests > 100` drops series below 100, doesn't return boolean
## Scrape Configuration
- `honor_labels: true` trusts source labels β use only when source is authoritative (e.g., Pushgateway)
- `scrape_timeout` must be less than `scrape_interval` β otherwise overlapping scrapes
- Static configs don't reload without restart β use file_sd or service discovery for dynamic targets
- TLS verification disabled (`insecure_skip_verify`) should be temporary, never permanent
## Pushgateway Pitfalls
- Pushgateway is for batch jobs, not services β services should expose /metrics
- Metrics persist until deleted β stale metrics from dead jobs confuse dashboards
- Add job and instance labels to distinguish sources β default grouping hides failures
- Delete metrics when job completes: `curl -X DELETE http://pushgateway/metrics/job/myjob`
## Recording Rules
- Pre-compute expensive queries: `record: job:request_duration_seconds:rate5m`
- Naming convention: `level:metric:operations` β helps identify what rules produce
- Recording rules update every evaluation interval β not instant, plan for slight delay
- Reduce cardinality with recording rules: aggregate away labels you don't need for alerting
## Federation and Remote Write
- Federation for pulling from other Prometheus β use sparingly, adds latency
- Remote write for long-term storage β Prometheus local storage is not durable
- Remote write can buffer during outages β but buffer is finite, data loss on extended outages
- Prometheus is not highly available by default β run two instances scraping same targets
## Common Operational Issues
- TSDB corruption on unclean shutdown β use `--storage.tsdb.wal-compression` and monitor disk space
- Memory grows with series count β each series costs ~3KB RAM
- Compaction pauses during high load β leave 40% disk headroom
- Scrape targets stuck "Unknown" β check network, firewall, target actually exposing /metrics
## Label Best Practices
- Use labels for dimensions you'll filter/aggregate by β environment, service, instance
- Keep label values low-cardinality β tens or hundreds, not thousands
- Consistent naming: `snake_case`, prefix with domain: `http_requests_total`, `node_cpu_seconds_total`
- `le` label is reserved for histogram buckets β don't use for other purposes
Imported from the listed AgentSkill.sh category. Complete supplied package files and notices are retained. Required external tools and credentials are not installed. No bundled code was executed during import. Individual agent task behavior has not been tested.