Prometheus 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: Prometheus 는 읽기 전용 페이지입니다.
== # 특정 시간대에만 모니터링 하기 == 어떤 메트릭이 있다. {{{ cpu{hostname="myserver"} 150 }}} 이 값이 200이 넘으면 경보를 띄우고 싶은데, 오전 11시부터 새벽1시까지만 감시를 하고 그 외의 시간에는 무시하고 싶다. 다음 두 링크를 참고: * https://prometheus.io/docs/prometheus/latest/querying/operators/ - Prometheus 쿼리 연산자 * https://prometheus.io/docs/prometheus/latest/querying/functions/ - Prometheus 쿼리 함수 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 <= ??? }}} * AND 좌우 메트릭의 라벨이 서로 다르기 때문에 AND로 결과가 나오지 않는다. 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() 뒤에 연결 == # 잡다한 내용 == * https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 (2018/02/12) {{{#!vim up{job="jobname"} < 1 # 일시적인 수집 실패에도 반응할 수 있음 # 타겟이 사라졌다 나타날 때마다 for 절이 리셋되므로 경보가 울려야 될 때 울리지 않을 수도 있음 # 대신 다음과 같이 하는 걸 추천 # (이 경우 for 구문은 어떻게 써야할지 모르겠다) avg_over_time(up{job="jobname"} [5m]) < 0.9 }}} * https://www.robustperception.io/why-can-countx-5-not-return-0 (2018/04/23) {{{#!vim # 샘플 데이터 x{l="foo"} 2 x{l="bar"} 4 }}} {{{#!vim 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 }}} * https://www.robustperception.io/absent-alerting-for-jobs (2018/07/16) {{{#!vim # 서비스가 다운되거나 하여 아예 메트릭 수집이 안 되면 # 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 }}} * https://www.robustperception.io/absent-alerting-for-scraped-metrics (2018/07/23) * https://www.robustperception.io/configuring-prometheus-storage-retention (2019/04/08) ** Prometheus 의 시계열 데이터 저장기한은 디폴트로 15일 ** 늘리고 싶으면 명령행 인자로 지정 {{{#!vim # 2.7 이후에는 크기와 기간 둘 다 명시하고 둘 중 먼저 해당하는 쪽을 따름 --storage.tsdb.retention.size=1TB --storage.tsdb.retention.time=1y # 2.6 이전에는 기간만 명시 가능 # 2.7 이후에도 이 옵션은 유효하지만 --storage.tsdb.retention.time가 있으면 후자가 우선 --storage.tsdb.retention=1y }}}
---- [[컴퓨터분류]]
Prometheus
페이지로 돌아가기 |
다른 수정본 보기