[첫화면으로]Prometheus

마지막으로 [b]

1. 특정 시간대에만 모니터링 하기

어떤 메트릭이 있다.
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() 뒤에 연결

2. 잡다한 내용

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

이름:  
Homepage:
내용:
 

컴퓨터분류

마지막 편집일: 2024-9-1 10:20 pm (변경사항 [d])
998 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기