prometheus에서 알림 및 복구 시 알림 내용 간 전환

TL;DR


  • 복구시 slack 통지 text가 경고시와 같아서 힘들다
  • slack 통지에 labels가 전부 들어가는 것도 힘들다
  • alert rule의 ANNOTATION에 좋아하는 프로퍼티 들어가므로, alertmanager의 text에 if 써서 그 프로퍼티를 호출했다

  • 소개



    경고 알림에 경고 이름뿐만 아니라 조금 자세한 정보와 문장을 추가하고 싶어집니다.

    그것에는 alert rule의 ANNOTATIONS 로 지정한 summary라든지가 text: '{{ .CommonAnnotations.summary }}' 처럼 지정하면 slack에 흘릴 수 있는 것을 알 수 있다.

    또, send_resolved: true 를 alertmanager 설정으로 지정하면 경고로부터 복구했을 때는 slack 로 통지해 준다.

    Alerting rules | Prometheus
    구성 | Prometheus
    Custom Alertmanager Templates | Prometheus

    alert.rule
    ALERT hoge_alert
      IF hoge_metrics == 0
      FOR 1s
      LABELS {
        severity="critical",
      }
      ANNOTATIONS {
        summary = "hoge of {{ $labels.host_name }} is NG.",
      }
    
    

    alertmanager.yml
    ...
    receivers:
    - name: 'slack'
      slack_configs:
        - api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
          channel: '#alerting-test'
          text: "{{ .CommonAnnotations.summary }}"
          send_resolved: true
    ...
    
    



    하지만 보시다시피 통지 하단의 문장이 NG 그대로 기분 나쁘다.

    그래서 alert rule 마다 지정한 경고시 문언, 복구시 문언을 나누도록 해 보았다.

    또, slack의 title 상당한 곳에 label이 어긋나 늘어서 있지만 엉망이 되고 있다.

    경고 규칙에 복구 시 메시지 정의



    ANNOTATIONS내는 좋아하는 프로퍼티를 정의할 수 있으므로 이하와 같이 써 보자.

    alert.rule
    ALERT hoge_alert
      IF hoge_metrics == 0
      FOR 1s
      LABELS {
        severity="critical",
      }
      ANNOTATIONS {
        firing_text = "hoge of {{ $labels.host_name }} is NG.",
        resolved_text = "hoge of {{ $labels.host_name }} is OK.",
      }
    
    

    alertmanager로 경고 시간과 복구 시간 내용 간 전환


    title: 는 경고명이 {{ .GroupLabels.alertname }} 로 취해지지만, 선두에 [FIRING], [RESOLVED]는 넣고 싶기 때문에 if로 조건 분기.
    text: 뿐만 아니라 {{ .CommonAnnotations.firing_text }}{{ .CommonAnnotations.resolved_text }} 에서 alert rule의 ANNOTATIONS를 호출합니다.

    alertmanager.yml
    ...
    receivers:
    - name: 'slack'
      slack_configs:
        - api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
          channel: '#alerting-test'
          title: '{{ if eq .Status "firing" }}[FIRING]{{else}}[RESOLVED]{{end}} {{ .GroupLabels.alertname }}'
          text: '{{ if eq .Status "firing" }}{{ .CommonAnnotations.firing_text }}{{else}}{{ .CommonAnnotations.resolved_text }}{{end}}'
          send_resolved: true
    ...
    
    

    동작 확인 : 경고 소리



    이런 식으로.
    prometheus에서 테스트 경고 by pushgateway - Qiita



    할 수 있었다!
    label이 사라졌고, 문언도 경고시와 복구시에 바뀔 수 있다.

    요약


  • 통지 내용을 alert 내용으로부터 저것 이것 커스텀 할 수 있게 된 것은 좋았다
  • 본래는 제대로 template 쓰레기 쓴다고 할까, default의 template가 큰데 너무 괴롭고 싶지 않은 느낌
  • alertmanager/default.tmpl at master · prometheus/alertmanager

  • alertmanager의 group_by로 grouping 한 값 (이번에는 host_name)도 title:에 있어도 좋았을지도

  • 하지만 힘든 일
  • prometheus의 rule과 alertmanager의 yml도 사용할 변수를 모르기 때문에 꽤 가발 (어떤 github 이슈에 있었던 것처럼)
  • alert rule의 ANNOTATIONS에 label뿐만 아니라 그 때의 value도 넣으려고 하는 것. 의미를 알지 못했거나 경고 할 때 metrics가 아니라 ALERT라는 metrics의 값이 될 수 있습니까?


  • 이상.

    좋은 웹페이지 즐겨찾기