정보
이 스킬은 중앙 집중식 메트릭 수집을 위한 프로덕션 환경에 적합한 Prometheus 배포를 구성합니다. 스크레이프 설정, 서비스 디스커버리, 기록 규칙 및 다중 클러스터 환경을 위한 연합 기능을 설정합니다. 마이크로서비스에 대한 시계열 모니터링을 구현하거나 SLO 추적 및 경고 시스템의 기반을 구축할 때 사용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/setup-prometheus-monitoringClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
Setup Prometheus Monitoring
Configure prod-ready Prometheus deployment with scrape targets, recording rules, federation.
When Use
- Set up centralized metrics collection for microservices or distributed systems
- Implement time-series monitoring for app + infra metrics
- Establish foundation for SLO/SLI tracking + alerting
- Consolidate metrics from multiple Prometheus instances via federation
- Migrate from legacy monitoring to modern observability stack
Inputs
- Required: List of scrape targets (services, exporters, endpoints)
- Required: Retention period + storage requirements
- Optional: Existing service discovery (Kubernetes, Consul, EC2)
- Optional: Recording rules for pre-aggregated metrics
- Optional: Federation hierarchy for multi-cluster setups
Steps
Step 1: Install and Configure Prometheus
Make base Prometheus config with global settings + scrape intervals.
# Create Prometheus directory structure
mkdir -p /etc/prometheus/{rules,file_sd}
mkdir -p /var/lib/prometheus
# Download Prometheus (adjust version as needed)
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
sudo cp prometheus-2.48.0.linux-amd64/{prometheus,promtool} /usr/local/bin/
Create /etc/prometheus/prometheus.yml.
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
external_labels:
cluster: 'production'
region: 'us-east-1'
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# Load recording and alerting rules
rule_files:
- "rules/*.yml"
# Scrape configurations
scrape_configs:
# Prometheus self-monitoring
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
labels:
env: 'production'
# Node exporter for host metrics
- job_name: 'node'
static_configs:
- targets:
- 'node1:9100'
- 'node2:9100'
labels:
env: 'production'
# Application metrics with file-based service discovery
- job_name: 'app-services'
file_sd_configs:
- files:
- '/etc/prometheus/file_sd/services.json'
refresh_interval: 30s
relabel_configs:
- source_labels: [__address__]
target_label: instance
- source_labels: [env]
target_label: environment
Got: Prometheus starts successfully, web UI accessible at http://localhost:9090, targets listed under Status > Targets.
If fail:
- Check syntax with
promtool check config /etc/prometheus/prometheus.yml - Verify file perms:
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus - Check logs:
journalctl -u prometheus -f
Step 2: Configure Service Discovery
Set up dynamic target discovery to avoid manual target management.
For Kubernetes envs, add to scrape_configs.
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# Only scrape pods with prometheus.io/scrape annotation
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# Use custom port if specified
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
# Add namespace as label
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
# Add pod name as label
- source_labels: [__meta_kubernetes_pod_name]
target_label: kubernetes_pod_name
For file-based service discovery, create /etc/prometheus/file_sd/services.json.
[
{
"targets": ["web-app-1:8080", "web-app-2:8080"],
"labels": {
"job": "web-app",
"env": "production",
"team": "platform"
}
},
{
"targets": ["api-service-1:9090", "api-service-2:9090"],
"labels": {
"job": "api-service",
"env": "production",
"team": "backend"
}
}
]
For Consul service discovery.
- job_name: 'consul-services'
consul_sd_configs:
- server: 'consul.example.com:8500'
services: [] # Empty list means discover all services
relabel_configs:
- source_labels: [__meta_consul_service]
target_label: job
- source_labels: [__meta_consul_tags]
regex: '.*,monitoring,.*'
action: keep
Got: Dynamic targets appear in Prometheus UI, auto updated when services scale or change.
If fail:
- Kubernetes: Verify RBAC perms with
kubectl auth can-i list pods --as=system:serviceaccount:monitoring:prometheus - File SD: Validate JSON syntax with
python -m json.tool /etc/prometheus/file_sd/services.json - Consul: Test connectivity with
curl http://consul.example.com:8500/v1/catalog/services
Step 3: Create Recording Rules
Pre-aggregate expensive queries for dashboard performance + alerting efficiency.
Create /etc/prometheus/rules/recording_rules.yml.
groups:
- name: api_aggregations
interval: 30s
rules:
# Calculate request rate per endpoint (5m window)
- record: job:http_requests:rate5m
expr: |
sum by (job, endpoint, method) (
rate(http_requests_total[5m])
)
# Calculate error rate percentage
- record: job:http_errors:rate5m
expr: |
sum by (job) (
rate(http_requests_total{status=~"5.."}[5m])
) / sum by (job) (
rate(http_requests_total[5m])
) * 100
# P95 latency by endpoint
- record: job:http_request_duration_seconds:p95
expr: |
histogram_quantile(0.95,
sum by (job, endpoint, le) (
rate(http_request_duration_seconds_bucket[5m])
)
)
- name: resource_aggregations
interval: 1m
rules:
# CPU usage by instance
- record: instance:cpu_usage:ratio
expr: |
1 - avg by (instance) (
rate(node_cpu_seconds_total{mode="idle"}[5m])
)
# Memory usage percentage
- record: instance:memory_usage:ratio
expr: |
1 - (
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
)
# Disk usage by mount point
- record: instance:disk_usage:ratio
expr: |
1 - (
node_filesystem_avail_bytes{fstype!~"tmpfs|fuse.*"}
/ node_filesystem_size_bytes{fstype!~"tmpfs|fuse.*"}
)
Validate + reload.
# Validate rules syntax
promtool check rules /etc/prometheus/rules/recording_rules.yml
# Reload Prometheus configuration (without restart)
curl -X POST http://localhost:9090/-/reload
# Or send SIGHUP signal
sudo killall -HUP prometheus
Got: Recording rules evaluate successfully, new metrics visible in Prometheus with job: prefix, query performance improved for dashboards.
If fail:
- Check rule syntax with
promtool check rules - Verify evaluation interval matches data availability
- Check for missing source metrics:
curl http://localhost:9090/api/v1/targets - Review logs for evaluation errors:
journalctl -u prometheus | grep -i error
Step 4: Configure Storage and Retention
Optimize storage for retention requirements + query performance.
Edit /etc/systemd/system/prometheus.service.
[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.time=30d \
--storage.tsdb.retention.size=50GB \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=:9090 \
--web.enable-lifecycle \
--web.enable-admin-api
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
Key storage flags.
--storage.tsdb.retention.time=30d: Keep 30 days of data--storage.tsdb.retention.size=50GB: Limit storage to 50GB (whichever limit hits first)--storage.tsdb.wal-compression: Enable WAL compression (reduces disk I/O)--web.enable-lifecycle: Allow config reload via HTTP POST--web.enable-admin-api: Enable snapshot + delete APIs
Enable + start.
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus
Got: Prometheus retains metrics by policy, disk usage stays within limits, old data auto pruned.
If fail:
- Monitor disk usage:
du -sh /var/lib/prometheus - Check TSDB stats:
curl http://localhost:9090/api/v1/status/tsdb - Verify retention settings:
curl http://localhost:9090/api/v1/status/runtimeinfo | jq .data.storageRetention - Force cleanup:
curl -X POST http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]={__name__=~".+"}
Step 5: Set Up Federation (Multi-Cluster)
Configure hierarchical Prometheus for aggregating metrics across clusters.
On edge Prometheus instances (per cluster), ensure external labels set.
global:
external_labels:
cluster: 'production-east'
datacenter: 'us-east-1'
On central Prometheus instance, add federation scrape config.
scrape_configs:
- job_name: 'federate-production'
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
# Aggregate only pre-computed recording rules
- '{__name__=~"job:.*"}'
# Include alert states
- '{__name__=~"ALERTS.*"}'
# Include critical infrastructure metrics
- 'up{job=~".*"}'
static_configs:
- targets:
- 'prometheus-east.example.com:9090'
- 'prometheus-west.example.com:9090'
labels:
env: 'production'
relabel_configs:
- source_labels: [__address__]
target_label: instance
- source_labels: [__address__]
regex: 'prometheus-(.*).example.com.*'
target_label: cluster
replacement: '$1'
Federation best practices.
- Use
honor_labels: trueto preserve original labels - Federate only recording rules + aggregates (not raw metrics)
- Set appropriate scrape intervals (longer than edge Prometheus evaluation)
- Use
match[]to filter metrics (avoid federating everything)
Got: Central Prometheus shows federated metrics from all clusters, queries can span multiple regions, minimal data duplication.
If fail:
- Verify federation endpoint accessibility:
curl http://prometheus-east.example.com:9090/federate?match[]={__name__=~"job:.*"} | head -20 - Check for label conflicts (central vs edge external labels)
- Monitor federation lag: compare timestamp differences
- Review match patterns:
curl http://localhost:9090/api/v1/label/__name__/values | jq .data | grep "job:"
Step 6: Implement High Availability (Optional)
Deploy redundant Prometheus instances with identical configs for failover.
Use Thanos or Cortex for true HA, or simple load-balanced setup.
# prometheus-1.yml and prometheus-2.yml (identical configs)
global:
scrape_interval: 15s
external_labels:
prometheus: 'prometheus-1' # Different per instance
replica: 'A'
# Use --web.external-url flag for each instance
# prometheus-1: --web.external-url=http://prometheus-1.example.com:9090
# prometheus-2: --web.external-url=http://prometheus-2.example.com:9090
Configure Grafana to query both instances.
{
"name": "Prometheus-HA",
"type": "prometheus",
"url": "http://prometheus-lb.example.com",
"jsonData": {
"httpMethod": "POST",
"timeInterval": "15s"
}
}
Use HAProxy or nginx for load balancing.
upstream prometheus_backend {
server prometheus-1.example.com:9090 max_fails=3 fail_timeout=30s;
server prometheus-2.example.com:9090 max_fails=3 fail_timeout=30s;
}
server {
listen 9090;
location / {
proxy_pass http://prometheus_backend;
proxy_set_header Host $host;
}
}
Got: Query requests balanced across instances, auto failover if one instance down, no data loss during single instance failure.
If fail:
- Verify both instances scraping same targets (slight time skew acceptable)
- Check for config drift between instances
- Monitor deduplication in queries (Grafana shows duplicate series)
- Review load balancer health checks
Checks
- Prometheus web UI accessible at expected endpoint
- All configured scrape targets showing as UP in Status > Targets
- Service discovery dynamically adding/removing targets as expected
- Recording rules evaluating successfully (no errors in logs)
- Metrics retention matches configured time/size limits
- Federation (if configured) pulling metrics from edge instances
- Queries return expected metric cardinality (not excessive)
- Disk usage stable + within allocated storage budget
- Configuration reload working via HTTP endpoint or SIGHUP
- Prometheus self-monitoring metrics available (up, scrape duration, etc.)
Pitfalls
- High cardinality metrics: Avoid labels with unbounded values (user IDs, timestamps, UUIDs). Use recording rules to aggregate before storage.
- Scrape interval mismatch: Recording rules should evaluate at intervals equal to or greater than scrape intervals to avoid gaps.
- Federation overload: Federating all metrics creates massive data duplication. Only federate aggregated recording rules.
- Missing relabel configs: Without proper relabeling, service discovery can create confusing or duplicate labels.
- Retention too short: Set retention longer than your longest dashboard time window to avoid "no data" gaps.
- No resource limits: Prometheus can consume excessive memory with high cardinality. Set
--storage.tsdb.max-block-duration, monitor heap usage. - Disabled lifecycle endpoint: Without
--web.enable-lifecycle, config reloads need full restarts causing scrape gaps.
See Also
configure-alerting-rules- Define alerting rules based on Prometheus metrics, route to Alertmanagerbuild-grafana-dashboards- Visualize Prometheus metrics with Grafana dashboards + panelsdefine-slo-sli-sla- Establish SLO/SLI targets using Prometheus recording rules + error budget trackinginstrument-distributed-tracing- Complement metrics with distributed tracing for deeper observability
GitHub 저장소
Frequently asked questions
What is the setup-prometheus-monitoring skill?
setup-prometheus-monitoring is a Claude Skill by pjt222. Skills package instructions and resources that Claude loads on demand, so Claude can perform setup-prometheus-monitoring-related tasks without extra prompting.
How do I install setup-prometheus-monitoring?
Use the install commands on this page: add setup-prometheus-monitoring to Claude Code as a plugin, or clone its repository into your skills directory, then restart Claude so it picks up the skill.
What category does setup-prometheus-monitoring belong to?
setup-prometheus-monitoring is in the Other category, tagged general.
Is setup-prometheus-monitoring free to use?
Yes. setup-prometheus-monitoring is listed on AIMCP and free to install. It runs inside Claude, so no separate service account is required to use the skill itself.
연관 스킬
LlamaGuard는 폭력 및 혐오 발언 등 6가지 안전 범주에서 LLM 입력과 출력을 조정하기 위한 Meta의 70-80억 파라미터 모델입니다. 94-95% 정확도를 제공하며 vLLM, Hugging Face 또는 Amazon SageMaker를 사용해 배포할 수 있습니다. 이 기술을 사용하여 AI 애플리케이션에 콘텐츠 필터링 및 안전 가드레일을 손쉽게 통합하세요.
이 Claude Skill은 리소스 적정화, 태깅 전략, 지출 분석을 통해 개발자들이 클라우드 비용을 최적화할 수 있도록 지원합니다. AWS, Azure, GCP에서 클라우드 비용을 절감하고 비용 거버넌스를 구현하기 위한 프레임워크를 제공합니다. 인프라 비용을 분석하거나, 리소스를 적정화하거나, 예산 제약을 충족해야 할 때 사용하세요.
이 Claude Skill은 스프레드, 오버/언더, 프로프 베트를 포함한 스포츠 베팅 시장을 분석합니다. 역사적 추이와 상황별 통계를 검토하여 가치 베트를 발견하고, 교육적 목적으로 실행 가능한 권장 사항이 담긴 구조화된 마크다운 결과를 제공합니다. 개발자는 이 기능을 스포츠 베팅 분석 도구에 활용할 수 있으며, 단순히 엔터테인먼트/교육 목적으로만 설계되었음을 유의해야 합니다.
이 스킬은 bitsandbytes를 사용하여 LLM을 8비트 또는 4비트 정밀도로 양자화하며, 최소한의 정확도 손실로 50-75%의 메모리 감소를 달성합니다. 제한된 GPU 메모리에서 더 큰 모델을 실행하거나 추론을 가속화하는 데 이상적이며, INT8, NF4, FP4와 같은 형식을 지원합니다. 이 스킬은 HuggingFace Transformers와 통합되어 QLoRA 학습 및 8비트 옵티마이저를 가능하게 합니다.
