어떤 메트릭이 있다.
cpu{hostname="myserver"} 150
이 값이 200이 넘으면 경보를 띄우고 싶은데, 오전 11시부터 새벽1시까지만 감시를 하고 그 외의 시간에는 무시하고 싶다.
다음 두 링크를 참고:
1) 일단 해당 시간 범위를 UTC 기준으로 바꾸면 02:00~16:00
2) time()
함수는 현재 시각을 EPOCH 초로 표시한다. (hour()를 쓰면 아주 조금 더 편해지지만, 나는 실제로 저 감시할 시간 범위가 hh:mm 형태로 분 단위까지 따져야 해서 그냥 time()을 썼음) 이걸 86400으로 나눈 나머지를 구하면 자정부터 몇 초나 지났는지 나온다.
time()%86400 scalar 24140 (UTC 기준 06:42:20, 한국시각 15:42:20)
3) time() 결과는 스칼라라서, 이걸 vector()
로 변환
vector(time()%86400) {} 24140
4) 현재 시각이 02:00(7200초)~16:00(57600초) 사이인지 검사
vector(time()%86400)>=7200 <=57600 {} 24140 no data <= 만일 해당 시간대가 아니었다면
5) 이제 이걸 우리가 감시하려는 메트릭과 AND
로 연결을 하면
cpu{hostname="myserver"} AND ( vector(time()%86400)>=7200 <=57600 ) no data <= ???
6) ON()
연산자를 써서 비교할 라벨을 한정지어줄 수 있다. 시간 쪽 벡터에 아무 라벨이 없기 때문에 ON에도 아무 라벨도 적용하지 않는다.
cpu{hostname="myserver"} AND ON() ( vector(time()%86400)>=7200 <=57600 ) cpu{hostname="myserver"} 150 <= 해당 시간대에 실행 no data <= 해당 시간대 외
7) 이제 prometheus의 alert.rule 파일에 적어줄 식이 나왔다.
expr: ( cpu{hostname="myserver"} AND ON() ( vector(time()%86400)>=7200 <=57600 ) ) > 200
8) 만일 모니터링하려는 시간대가 06:00~21:00 이라고 한다면, 이걸 UTC 기준으로 고치면 "전날21:00~12:00"가 되어서 조건이 다음과 같이 절대 참이 될 수 없게 된다.
vector(time()%86400)>=75600 <=43200
뭐 둘로 나눠서 or 로 연결해도 되겠지만...
이 경우는 "검사를 하지 않을 시간대"를 조건으로 삼고
vector(time()%86400)>43200 <75600 {} 46800 <= 예를 들어 UTC 13:00 (한국 22시) no data <= 예를 들어 UTC 03:00 (한국 12시)
여기에 absent()
를 적용하면 데이터가 없을 때는 값이 1인 원소 1개짜리 벡터가 나오고, 데이터가 있을 때는 값이 없다. 즉 결과가 나올 때와 아닐 때가 반전된다.
absent( vector(time()%86400)>43200 <75600 ) no data <= 예를 들어 UTC 13:00 (한국 22시) {} 1 <= 예를 들어 UTC 03:00 (한국 12시)
이제 위 식을 AND ON() 뒤에 연결
up{job="jobname"} < 1 # 일시적인 수집 실패에도 반응할 수 있음 # 타겟이 사라졌다 나타날 때마다 for 절이 리셋되므로 경보가 울려야 될 때 울리지 않을 수도 있음 # 대신 다음과 같이 하는 걸 추천 # (이 경우 for 구문은 어떻게 써야할지 모르겠다) avg_over_time(up{job="jobname"} [5m]) < 0.9
# 샘플 데이터 x{l="foo"} 2 x{l="bar"} 4
count(x) {}:2 count by (l)(x) {l="bar"}:1 {l="foo"}:1 count by (l)(x>3) # 조건에 맞지 않는 샘플을 필터링한 후에 카운트 {l="bar"}:1 count by (l)(x>5) # x>5 조건에 맞는 샘플이 하나도 없는 상태이므로 빈 벡터가 나오고 따라서 count의 결과도 빈 인스턴스 벡터 # bool modifier를 사용 x > bool 3 x{l="bar"}:1 x{l="foo"}:0 sum by (l)(x > bool 3) {l="bar"}:1 {l="foo"}:0 sum(x > bool 5) {}:0
# 서비스가 다운되거나 하여 아예 메트릭 수집이 안 되면 # avg by (job)(up) < 0.5 # 와 같은 aggregator들도 출력이 없어서 경보가 작동하지 않는다 # absent(...) 매치되는 메트릭이 전혀 없을 때에 # 셀렉터의 라벨 중 =로 비교한 라벨을 포함하고 값이 1인 벡터를 반환 absent(x{lable="foo",job=~"test"}) {lable="foo"}:1 # 이를 이용한 경보 예제 groups: - name: example rules: - alert: MyJobMissing expr: absent(up{job="myjob"}) for: 10m
# 2.7 이후에는 크기와 기간 둘 다 명시하고 둘 중 먼저 해당하는 쪽을 따름 --storage.tsdb.retention.size=1TB --storage.tsdb.retention.time=1y # 2.6 이전에는 기간만 명시 가능 # 2.7 이후에도 이 옵션은 유효하지만 --storage.tsdb.retention.time가 있으면 후자가 우선 --storage.tsdb.retention=1y