메트릭 컬렉션: Prometheus, Grafana
메트릭 컬렉션: Prometheus, Grafana
1) 목적과 프레임
메트릭 루프의 작업은 시계열을 안정적으로 수집 및 저장하고 RCA, SLO 경고 및 이해할 수있는 대시 보드에 대해 빠른 PromQL을 제공하는 것입니다. 기본 쌍: Prometheus (scrape → store → query) 및 Grafana (시각화, 경고, 릴리스 주석). 긴 저장 및 전역 쿼리-Thanos/Cortex/Mimir.
2) 데이터 모델 및 의미론
시리즈 = 메트릭 이름 + 레이블 세트 (키 = 값).
유형: 카운터, 게이지, 히스토그램, 요약 (prod-더 자주 히스토그램).
- RED (API): 'rate', 'orm', 'kimmunity' (histograms).
- 사용하기 (рес계수): 활용, 포화, 오류 (CPU/RAM/디스크/넷).
- 명명: '네임 스페이스 _ subsystem _ metric _ unit' (예: 'http _ server _ insers _ total', 'db _ consults _ current').
카디널리티 방지: 다른 레이블 값을 최소화합니다 (라벨에 사용자 _ id 요청 _ id 없음).
3) 노출 및 서비스 발견
수출자: node _ extrater, kube-state-metrics, cAdvisor, DB/Queues (postgres _ extrater, redis _ extrater, kafka _ extrater).
기본 서비스: 클라이언트 라이브러리 (Go/Java/Node/Python) → '/metrics '.
서비스 발견: Kubernetes, EC2/ASG, 영사, 정적 파일.
yaml global:
scrape_interval: 15s evaluation_interval: 15s scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs: [{ role: node }]
relabel_configs:
- action: labelmap regex: __meta_kubernetes_node_label_(.+)
- job_name: 'apps'
kubernetes_sd_configs: [{ role: pod }]
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep regex: "true"
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
target_label: __metrics_path__
regex: (.+)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
target_label: __address__
regex: (.+)
replacement: $1
포드의 주석:
yaml prometheus. io/scrape: "true"
prometheus. io/path: /metrics prometheus. io/port: "8080"
4) 히스토그램과 대기 시간
SLO에 노골적인 버킷을 사용하십시오:- 웹/API: '[10m, 25,50,100,200,400,800,1600]'
- 지불/지불: 꼬리를 5-10에 추가하십시오.
promql histogram_quantile(0. 95,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)
Exemplars를 사용하여 (활성화 된 경우):
promql histogram_quantile(0. 95,
sum by (le, route) (rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m]))
)
5) 기록 규칙
무거운 요청을 줄이고 SLI를 표준화하십시오.
yaml groups:
- name: api_sli interval: 30s rules:
- record: job:http:success_ratio:rate5m expr: sum(rate(http_requests_total{status!~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
- record: job:http:duration_p95:5m expr: histogram_quantile(0. 95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
6) SLO 및 경고 (다중 창 화상)
SLO 99. 9% 성공적인 요청/30d.
yaml groups:
- name: slo_burn rules:
- alert: ErrorBudgetBurnHighShort expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 14 for: 5m labels: { severity: critical }
annotations: { summary: "Fast burn >14x for 5m" }
- alert: ErrorBudgetBurnHighLong expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 6 for: 1h labels: { severity: critical }
annotations: { summary: "Long burn >6x for 1h" }
Alertmanner (단순화):
yaml route:
receiver: pager group_by: ["service"]
receivers:
- name: pager slack_configs:
- channel: "#oncall"
send_resolved: true
7) 라벨 위생 및 경제
라벨 이름은 '서비스', 'env', '지역', '경로', '코드', '버전' 과 같이 안정적이고 표준화되어 있습니다.
카디널리티 제한: '경로' 가있는 메트릭은 'http' 패턴을 사용해야합니다. (PHP 3 = 3.0.6, PHP 4)
논리 샘플링 - 흔적; 메트릭스-사용자 _ id 없음.
릴리스 속성 ('서비스. 버전 ') 은 이전 버전/새 버전을 비교하는 데 유용합니다.
8) 스케일링 및 HA
프로 메테우스-수직 및 긁힘 대상:- 두 개의 Prometheus (A/B) 가 동일한 대상을 긁습니다 (HA → 경고가 복제됨).
- Thanos: 각 Prometheus의 사이드카, 글로벌 쿼리 및 장기 스토리지 (S3/GCS) 에 대한 스토어 + 쿼리.
- 대체: Cortex/Mimir (원격 쓰기, 다중 테넌시, 수평 스케일링).
yaml remote_write:
- url: https://mimir. example. com/api/v1/push basic_auth: { username: tenantA, password: $MIMIR_TOKEN }
지역 TSDB 유지:
yaml
--storage. tsdb. retention. time=15d
--storage. tsdb. max-block-duration=2h
9) Grafana: 대시 보드, 경고, 주석
표준 대시 보드:1. 플랫폼 개요 (SLO/RED, 오류 예산).
2. Route 별 API (RPS/5xx/p95, 비교 '버전').
3. K8 클러스터/노드 (제어면, 채도).
4. DB/캐시/대기열 (지연/잠금/적중 비율/백 로그).
5. 출시당 (CI 주석 전/후 릴리스).
Grafana Alerting: PromQL 트리거, 통화 중 회전, 음소거 시간 "릴리스 창".
주석: CI는 '커밋', 이미지가 포함 된 릴리스 이벤트를 추가합니다. 파이프 라인에 대한 참조 태그 '.
10) Kubernetes: 측정 대상
제어 평면: 'apiserver _ 요청 _ total', etcd 리더/fsync, 스케줄러 대기 시간.
워크로드: 재시작, '컨테이너 _ cpu _ cfs _ throttled _ seconds _ total', OOM, Pending/Evicted, PDB 위반.
네트워크: 드롭, 커넥트랙, 'kube-proxy' 오류.
쿼터/제한: 요청 대 한계, HPA/VPA, 노드 채도.
11) DB/캐시/큐: 키 신호
PostgreSQL/MySQL: '연결', '잠금', '교착 상태 _ total', 'xact _ cump/rolback', 복제 지연.
Redis: 적중률, '퇴거', 대기 시간 '순간 _ ops _ per _ sec'.
Kafka/RabbitMQ: 소비자 지연, 포장 해제, ISR, 디스크 사용.
promql
Queue backlog sum by (topic) (kafka_consumergroup_lag)> 1000
Postgres replication lag max(pg_replication_lag_seconds) > 2
12) 안전 및 다중 임대
RBAC to Prometheus/Grafana, dats.com.permishens
구성 요소 간의 진입/구성 요소의 SL/mSL 체인.
세입자 격리: Cortex/Mimir에서 별도의 Prometheus 또는 세입자 라벨; 시리즈 및 요청 제한.
경고/알림의 비밀-금지 (PII가 아닌 티켓 ID 사용).
13) 릴리스 및 자동 롤백과의 통합
SLO 규칙 → 분석 템플릿 (Argo Rollout) 또는 CI 게이트.
화상 경보가 발생하면-일시 정지/롤백 카나리아; 로그/주석에서-릴리스에 대한 링크.
레이블 '버전' 을 통한 안정 및 카나리아 버전 비교
14) 전형적인 오류 (패턴 방지)
레이블의 제어되지 않은 카디널리티 (user _ id, ull). 완전하고 동적 인 키).
'env' 라벨없이 동일한 클러스터에서 혼합 및 스테이지.
RED/USE가없는 게이지 만; p95/p99 히스토그램이 없습니다.
SLO → 노이즈에 바인딩되지 않은 하드웨어 경고.
기록 규칙 부족 → 생산 사고에서 "무거운" 요청.
릴리스 주석이 없습니다 → 변경 및 저하를 비교하기가 어렵습니다.
15) 구현 점검표 (0-45 일)
0-10 일
노드/쿠브 상태/cAdvisor 수출 업체; 서비스의 '/메트릭 '.
기본 RED/USE 대시 보드; 표준 히스토그램 버킷.
CI의 주석을 포함하십시오.
11-25 일
SLI 기록 규칙; 다중 창 화상 경고.
HA Prometheus (이중 긁힘), GitOps 구성 요소의 백업.
경고 관리자: 경로/조용한 모드/통화 중 회전.
26-45 일
Thanos/Cortex/Mimir, 장기 스토리지에서 원격 쓰기.
카디널리티 최적화, 시리즈 제한, 요청.
SLO 게이팅 릴리스 및 자동 롤백 통합.
16) 성숙도 지표
주요 서비스에 대한 RED/USE 적용 범위는 95% 이상입니다
기록 규칙으로 인해 "무거운" PromQL <2 (p95) 를 수행하는 평균 시간.
유용한/잡음 알림의 비율은> 3: 1입니다.
제어중인 카디널리티: 클러스터 당 <10M 활성 배치, 스파이크 없음.
릴리스의 100% 는 Grafana 및 이전/이후의 상관 메트릭에 주석이 달려 있습니다.
17) 유용한 스 니펫
버전별로 안정적인 vs 카나리아 비교
promql histogram_quantile(0. 95,
sum by (le, version) (rate(http_request_duration_seconds_bucket{version=~"stable canary"}[5m]))
)
경로 별 <> 5xx 오류
promql topk(5,
sum by (route) (rate(http_requests_total{status=~"5.."}[5m]))
)
컨테이너 CPU 채도
promql rate(container_cpu_cfs_throttled_seconds_total[5m]) > 0. 1
트랙과 메트릭 관계 (Exemplars 활성화)
promql sum (rate (http_request_duration_seconds_bucket[5m])) by (le) # clickable to the track
18) 결론
Prometheus + Grafana는 사실상 지표의 표준입니다. 시맨틱 및 징계 승리: RED/USE, 깔끔한 라벨, SLO 히스토그램, 기록 규칙 및 SLO 경고. HA 및 장기 스토리지 추가, 주석 해제 및 자동 롤백과의 통합-빠르고 확장 가능하며 경제적 인 메트릭 루프가있어 판매 결정을 내릴 수 있습니다.