TIL

5장 지표 모니터링 및 경보 시스템

1단계: 문제 이해 및 설계 범위 확정

2단계: 계략적 설계안 제시 및 동의 구하기

데이터 모델

이름 자료형
지표 이름 문자열
태그/레이블 집합 <키:값> 쌍의 리스트(List)
지표 값 및 그 타임스탬프의 배열 <값, 타임스탬프> 쌍의 배열(Array
metric_name cpu.load
labels host:i631,env:prod
timestamp 1613707265
value 0.29

데이터 저장소 시스템

계략적 설계안

graph
    A[지표 출처] --> B[지표 수집기] --> C[(시계열 데이터베이스)]
    D[질의 시스템] --> C
    E[시각화 시스템] -->|질의 전송| D
    F[경보 시스템] -->|질의 전송| D
    F --> G[이메일]
    F --> H[단문 메시지]
    F --> I[페이지듀티]
    F --> J[HTTPS 서비스 엔드포인트]

3단계: 상세 설계

지표 수집

  풀 모델 푸시 모델
손쉬운 디버깅 애플리케이션 서버에 /metrics 엔드포인트를 두도록 강제하므로 언제든 지표 데이터를 볼 수 있다. 풀 모델이 디버깅엔 더 낫다.  
상태 진단 애플리케이션 서버가 풀 요청에 응답하지 않으면 장애로 진단할 수 있어 풀 모델 쪽이 더 쉽다. 지표 수집기가 지표를 받지 못하면 네트워크 장애인지, 서버 장애인지 판단하기 어렵다.
생존 기간이 짧은 프로세스 생명 주기가 짧은 일괄 작업 프로세스의 경우 지표를 끌어가기도(pull) 전에 작업이 종료되어 유실될 수 있다. 풀 모델의 단점 때문에 푸시 모델이 더 낫지만 풀 모델도 푸시 게이트웨이를 도입하면 해당 문제를 해결할 수 있다.
방화벽 등의 복잡한 네트워크 구성 데이터가 풀 되려면 /metrics 엔드포인트가 모두 접근 가능해야하기에 세심한 네트워크 인프라 설계가 필요하다. 지표 수집기가 자동 확장되는 구조라면 어디서 오는 지표라도 수집 가능하기에 푸시 모델이 더 낫다.
성능 일반적으로 TCP를 사용 일반적으로 UDP를 사용하기에 전송 지연이 더 낮다.
데이터 신빙성 지표 데이터를 가져올 애플리케이션 서버 목록이 이미 정의되었기에 신뢰할 수 있다. 아무나 지표 수집기에 데이터를 보낼 수 있기에 인증을 강제해야 한다.

지표 전송 파이프라인의 규모 확장

graph LR
   B[지표 수집기] --> C[[카프카]]
    C --> D[(시계열 데이터베이스)]
    

데이터 집계 지점

질의 서비스

from(db:"telegraf")
	|> range(start:-1h)
	|> filter(fn: (r) => r._measurement == "foo")
	|> exponentialMovingAverage(size:-10s)

저장소 계층

경보 시스템

graph LR
  A[규칙 설정 파일] -->|1| B[(캐시)]
  B <-->|2| C[경보 관리자]
  D[(경보 저장소)] <-->|4| C
  C <-->|3| E[질의 서비스]
  C -->|5| F[[카프카]]
  F -->|6| G[경보 소비자]
  G -->|7| H[이메일]
  G -->|7| I[단문 메시지]
  G -->|7| J[페이지듀티]
  G -->|7| K[HTTPS 엔드포인트]
  
  1. 설정 파일을 가져와 캐시 서버에 보관한다. (규칙 정의에는 yaml이 널리 사용된다)
  2. 경보 관리자는 경보 설정 내역을 캐시에서 가져온다.
  3. 규칙에 근거하여 경보 관리자는 질의 서비스를 호출하여 임계값에 따라 이벤트를 생성한다.
  4. 경보 저장소는 카산드라 같은 키-값 저장소이며 알림이 적어도 한 번 이상 전달되도록 보장한다.
  5. 경보 이벤트를 카프카에 전달한다.
  6. 경보 소비자는 카프카에서 경보 이벤트를 읽는다.
  7. 경보 소비자는 카프카에서 읽은 경보 이벤트를 처리하여 다양한 채널로 알림을 전송한다.

시각화 시스템