Prometheus Alertmanager 경고 구성 요소

14233 단어

Prometheus Alertmanager


개요


Alertmanager와 Prometheus는 서로 분리된 두 구성 요소입니다.Prometheus 서버는 경보 규칙에 따라 경보를 Alert 관리자에게 보내고 Alert 관리자는 silencing,inhibition,aggregation 등 메시지를 이메일, Paper Duty,HipChat로 통지합니다.
경고 및 알림을 설정하는 주요 단계:
  • 구성 Alertmanager 설치
  • -alertmanager를 통해 Prometheus를 구성합니다.url 로고는 Alertmanager와 통신합니다
  • Prometheus에서 경고 규칙을 작성합니다

  • Alertmanager 소개 및 메커니즘


    Alertmanager는 Prometheus 서버와 같은 클라이언트가 보낸 경고를 처리합니다.그것은 중복 데이터를 삭제하고 그룹을 나누며 경보를 루트를 통해 정확한 수신기, 예를 들어 전자메일, Slack 등으로 보내는 것을 책임진다.Alert 관리자는 그룹, silencing, 경보 억제 메커니즘도 지원한다.

    그룹화


    그룹화는 동일한 유형의 경보를 단일 알림으로 분류하는 것을 말한다.많은 시스템이 동시에 다운될 때, 수백 수천 개의 경보가 동시에 생성될 가능성이 높으며, 이런 메커니즘은 특히 유용하다.예를 들어 수십 개 또는 수백 개의 서비스의 실례가 실행되고 네트워크가 고장날 때 절반의 서비스 실례가 데이터베이스에 접근하지 못할 수도 있다.prometheus 경고 규칙에 모든 서비스 실례에 경보를 보내는 것으로 설정되면 수백 개의 경보가 Alert 관리자로 전송됩니다.
    그러나 사용자로서 단일한 경보 페이지만 보고 싶을 뿐만 아니라 어떤 실례가 영향을 받는지 똑똑히 볼 수 있기 때문에 Alert 관리자를 설정하여 경보를 그룹으로 나누어 포장하고 상대적으로 치밀하게 보이는 알림을 보낼 수 있다.
    그룹 경보, 경보 시간, 그리고 경보를 수신하는receiver는alert 관리자 프로필에서 루트 트리를 통해 설정됩니다.

    억제(Inhibition)


    억제란 경보가 발령되면 이 경보가 다른 오류를 일으키는 경보를 중복 발송하지 않는 메커니즘을 말한다.(예를 들어 네트워크가 연결되지 않아 다른 서비스 연결 관련 경보가 발생)
    예를 들어 전체 집단 네트워크가 도달할 수 없을 때 경보가 울리면 Alert 관리자가 이 경보가 울리면 발생하는 모든 다른 경보를 무시할 수 있도록 미리 설정할 수 있다. 이것은 이 문제와 관련이 없는 수백 또는 수천 개의 다른 경보를 방지할 수 있다.
    억제 메커니즘도 Alertmanager의 프로필을 통해 설정됩니다.

    침묵(Silences)


    Silences는 간단한 특정 시간에 경고하지 않는 메커니즘입니다.silences 경고는 루트 트리처럼 매칭기 (matchers) 를 통해 설정됩니다.전송된 경고는 RE와 일치하며 일치하는 경우 이 경고에 대한 알림이 전송되지 않습니다.
    이 시각화 편집기는 루트 트리를 구축하는 데 도움을 줄 수 있다.
    silences 경보 메커니즘은 Alertmanager의 웹 페이지를 통해 설정할 수 있습니다.

    Alermanager 구성


    Alertmanager는 명령줄 flag와 프로필을 통해 구성됩니다.명령줄flag는 변하지 않는 시스템 매개 변수, 프로필 정의의 억제 (inhibition) 규칙, 알림 루트와 알림 수신기를 설정합니다.
    사용 가능한 모든 명령줄flag를 보려면alertmanager-h를 실행하십시오.Alertmanager는 실행할 때 설정을 불러옵니다. 새 설정 문법 형식이 올바르지 않으면 변경 사항이 적용되지 않고 문법 오류를 기록합니다.이 프로세스에 SIGHUP를 보내거나/-/reload 노드에 HTTP POST 요청을 보내서 핫로드 구성을 트리거합니다.

    프로파일


    불러오는 프로필을 지정하려면 -config를 사용해야 합니다.file 로고.이 파일은 YAML을 사용하여 다음 설명을 통해 정의됩니다.괄호가 있는 매개변수는 선택 사항이며 목록이 아닌 매개변수의 값은 지정된 기본값으로 설정됩니다.
    일반 자리 표시자 정의 설명:
  • : 정규 표현식과 일치하는 지속 시간 값, [0-9]+(ms|[smhdwy])
  • : 정규 표현식과 일치하는 문자열, [a-zA-Z_][a-zA-Z0-9_]*
  • : 유니코드 문자열
  • : 유효한 파일 경로입니다
  • : boolean 유형,true 또는false
  • : 문자열
  • : 템플릿 변수 문자열

  • 글로벌 전역 프로필 파라미터는 모든 프로필 상하문에서 적용됩니다. 다른 프로필 항목의 기본값으로 덮어쓸 수 있습니다.
    global:
      # ResolveTimeout is the time after which an alert is declared resolved
      # if it has not been updated.
      # 
      [ resolve_timeout:  | default = 5m ]
    
      # The default SMTP From header field.
      [ smtp_from:  ]
      # The default SMTP smarthost used for sending emails.
      [ smtp_smarthost:  ]
      # SMTP authentication information.
      [ smtp_auth_username:  ]
      [ smtp_auth_password:  ]
      [ smtp_auth_secret:  ]
      # The default SMTP TLS requirement.
      [ smtp_require_tls:  | default = true ]
    
      # The API URL to use for Slack notifications.
      [ slack_api_url:  ]
    
      [ pagerduty_url:  | default = "https://events.pagerduty.com/generic/2010-04-15/create_event.json" ]
      [ opsgenie_api_host:  | default = "https://api.opsgenie.com/" ]
    
    # Files from which custom notification template definitions are read.
    # The last component may use a wildcard matcher, e.g. 'templates/*.tmpl'.
    templates:
      [ -  ... ]
    
    # The root node of the routing tree.
    route: 
    
    # A list of notification receivers.
    receivers:
      -  ...
    
    # A list of inhibition rules.
    inhibit_rules:
      [ -  ... ]
    

    라우팅(route)


    라우팅 블록은 라우팅 트리와 하위 노드를 정의합니다.설정이 없으면 하위 노드의 선택적 구성 파라미터가 부모 노드에서 상속됩니다.
    모든 경고는 설정된 최상위 루트에서 루트 트리로 들어가며, 이 루트 트리는 모든 경고와 일치해야 합니다(즉, 설정된 일치기가 없습니다).그리고 하위 노드를 두루 돌아다녔다.만약continue의 값이false로 설정되면 첫 번째 일치하는 하위 노드 다음에 멈춥니다.continue 값이true이면 경보는 다음 하위 노드의 일치를 계속합니다.경고가 일치하지 않는 하위 노드 (일치하는 하위 노드가 없거나 존재하지 않는 경우) 는 현재 노드의 구성 처리를 기반으로 합니다.
    라우팅 구성 형식
    # 
    [ receiver:  ]
    
    # 
    [ group_by: '[' , ... ']' ]
    
    # Whether an alert should continue matching subsequent sibling nodes.
    [ continue:  | default = false ]
    
    # A set of equality matchers an alert has to fulfill to match the node.
    # , 
    match:
      [ : , ... ]
    
    # A set of regex-matchers an alert has to fulfill to match the node.
    match_re:
    # , 
      [ : , ... ]
    
    # How long to initially wait to send a notification for a group
    # of alerts. Allows to wait for an inhibiting alert to arrive or collect
    # more initial alerts for the same group. (Usually ~0s to few minutes.)
    [ group_wait:  ]
    
    # How long to wait before sending notification about new alerts that are
    # in are added to a group of alerts for which an initial notification
    # has already been sent. (Usually ~5min or more.)
    [ group_interval:  ]
    
    # How long to wait before sending a notification again if it has already
    # been sent successfully for an alert. (Usually ~3h or more).
    [ repeat_interval:  ]
    
    # Zero or more child routes.
    routes:
      [ -  ... ]
    

    예:
    # The root route with all parameters, which are inherited by the child
    # routes if they are not overwritten.
    route:
      receiver: 'default-receiver'
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 4h
      group_by: [cluster, alertname]
      # All alerts that do not match the following child routes
      # will remain at the root node and be dispatched to 'default-receiver'.
      routes:
      # All alerts with service=mysql or service=cassandra
      # are dispatched to the database pager.
      - receiver: 'database-pager'
        group_wait: 10s
        match_re:
          service: mysql|cassandra
      # All alerts with the team=frontend label match this sub-route.
      # They are grouped by product and environment rather than cluster
      # and alertname.
      - receiver: 'frontend-pager'
        group_by: [product, environment]
        match:
          team: frontend
    

    억제 규칙 inhibit_rule


    억제 규칙은 다른 정합기가 일치하는 상황에서 다른 경보를 일으키는 규칙을 정음시키는 것이다.이 두 개의 경보는 반드시 같은 라벨 그룹이 있어야 한다.
    구성 형식 억제
    # Matchers that have to be fulfilled in the alerts to be muted.
    ## 
    target_match:
      [ : , ... ]
    target_match_re:
      [ : , ... ]
    
    # Matchers for which one or more alerts have to exist for the
    # inhibition to take effect.
    # 。
    source_match:
      [ : , ... ]
    source_match_re:
      [ : , ... ]
    
    # Labels that must have an equal value in the source and target
    # alert for the inhibition to take effect.
    # 
    [ equal: '[' , ... ']' ]
    

    수신기(receiver)


    말 그대로 경보 수신의 설정이다.
    일반 구성 형식
    # The unique name of the receiver.
    name: 
    
    # Configurations for several notification integrations.
    email_configs:
      [ - , ... ]
    pagerduty_configs:
      [ - , ... ]
    slack_config:
      [ - , ... ]
    opsgenie_configs:
      [ - , ... ]
    webhook_configs:
      [ - , ... ]
    

    메일 수신기 이메일_config
    # Whether or not to notify about resolved alerts.
    # 
    [ send_resolved:  | default = false ]
    
    # The email address to send notifications to.
    to: 
    # The sender address.
    [ from:  | default = global.smtp_from ]
    # The SMTP host through which emails are sent.
    [ smarthost:  | default = global.smtp_smarthost ]
    
    # The HTML body of the email notification.
    [ html:  | default = '{{ template "email.default.html" . }}' ] 
    
    # Further headers email header key/value pairs. Overrides any headers
    # previously set by the notification implementation.
    [ headers: { : , ... } ]
    
    

    Slcack 수신기 slack_config
    # Whether or not to notify about resolved alerts.
    [ send_resolved:  | default = true ]
    
    # The Slack webhook URL.
    [ api_url:  | default = global.slack_api_url ]
    
    # The channel or user to send notifications to.
    channel: 
    
    # API request data as defined by the Slack webhook API.
    [ color:  | default = '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}' ]
    [ username:  | default = '{{ template "slack.default.username" . }}'
    [ title:  | default = '{{ template "slack.default.title" . }}' ]
    [ title_link:  | default = '{{ template "slack.default.titlelink" . }}' ]
    [ pretext:  | default = '{{ template "slack.default.pretext" . }}' ]
    [ text:  | default = '{{ template "slack.default.text" . }}' ]
    [ fallback:  | default = '{{ template "slack.default.fallback" . }}' ]
    

    Webhook 수신기 webhook_config
     # Whether or not to notify about resolved alerts.
    [ send_resolved:  | default = true ]
    
     # The endpoint to send HTTP POST requests to.
    url: 
    

    Alertmanager는 다음과 같은 형식으로 구성 끝에 HTTP POST 요청을 보냅니다.
    {
      "version": "3",
      "groupKey":      // key identifying the group of alerts (e.g. to deduplicate)
      "status": "",
      "receiver": ,
      "groupLabels": ,
      "commonLabels": ,
      "commonAnnotations": ,
      "externalURL": ,  // backling to the Alertmanager.
      "alerts": [
        {
          "labels": ,
          "annotations": ,
          "startsAt": "",
          "endsAt": ""
        },
        ...
      ]
    }
    

    못박기 웹훅을 추가할 수 있습니다. 못박기를 통해 경보를 할 수 있습니다. POST 데이터가 필요하기 때문에 데이터 전송 스크립트를 간단하게 실현할 수 있습니다.
    from flask import Flask
    from flask import request
    import json
    
    app = Flask(__name__)
    
    @app.route('/',methods=['POST'])
    def send():
        if request.method == 'POST':
            post_data = request.get_data()
            alert_data(post_data)
        return
    def alert_data(data):
        from urllib2 import Request,urlopen
        url = 'https://oapi.dingtalk.com/robot/send?access_token=xxxx'
        send_data = '{"msgtype": "text","text": {"content": %s}}' %(data)
        request = Request(url, send_data)
        request.add_header('Content-Type','application/json')
        return urlopen(request).read()
    if __name__ == '__main__':
        app.run(host='0.0.0.0')
    
    

    경보 규칙


    경보 규칙은 Prometheus 표현식 언어를 기반으로 하는 경보 조건을 정의하고 외부 서비스에 경보 알림을 보낼 수 있습니다

    경고 규칙 정의


    경고 규칙은 다음 형식으로 정의됩니다.
    ALERT 
      IF 
      [ FOR  ]
      [ LABELS 
  • FOR 문구를 선택하여 Prometheus가 표현식으로 출력하는 벡터 요소(예를 들어 HTTP 오류율이 높은 실례) 사이를 한동안 기다리며 경보 계수를 트리거로 합니다.원소가 active이지만 Firing이 없으면pending 상태입니다.
  • LABELS(레이블) 문구는 레이블 그룹 추가 경고를 지정할 수 있습니다.기존 충돌의 모든 레이블을 덮어쓰고 레이블 값도 템플릿화할 수 있습니다
  • ANNOTATIONS(주석)는 경고 설명이나 링크와 같은 더 긴 다른 정보를 저장하는 데 사용되며, 주석 값도 템플릿화할 수 있습니다
  • Templating(템플릿) 레이블과 주석 값은 콘솔 템플릿을 사용하여 템플릿화할 수 있습니다. $labels 변수는 경보 실례의 탭 키/값을 저장하고, $value는 경보 실례의 평가 값을 저장합니다..
    # To insert a firing element's label values:
    {{ $labels. }}
    # To insert the numeric expression value of the firing element:
    {{ $value }}
    

  • 경고 규칙의 예:
    # Alert for any instance that is unreachable for >5 minutes.
    ALERT InstanceDown
      IF up == 0
      FOR 5m
      LABELS { severity = "page" }
      ANNOTATIONS {
        summary = "Instance {{ $labels.instance }} down",
        description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
      }
    
    # Alert for any instance that have a median request latency >1s.
    ALERT APIHighRequestLatency
      IF api_http_request_latencies_second{quantile="0.5"} > 1
      FOR 1m
      ANNOTATIONS {
        summary = "High request latency on {{ $labels.instance }}",
        description = "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)",
      }
    

    런타임 경고 확인


    active 상태 (pending 또는firing) 에 대한 경보를 수동으로 확인하려면 Prometheus 실례 웹 내비게이션 창의 "alert"옵션 카드에서 볼 수 있습니다.
    For pending and firing alerts, Prometheus also stores synthetic time series of the form ALERTS{alertname="", alertstate="pending|firing", }. The sample value is set to 1 as long as the alert is in the indicated active (pending or firing) state, and a single 0 value gets written out when an alert transitions from active to inactive state. Once inactive, the time series does not get further updates.

    경보 알림 보내기


    Prometheus의 경보 rules는 현재의 고장 상황을 잘 알 수 있지만, 아직 완전한 알림 해결 방안은 아니다.간단한 경보 정의에 있어서 경보 집합, 통지 속도 제한, silences 등 rules를 바탕으로 프로메테우스 생태계에서 Alert 관리자가 이러한 역할을 발휘했다.따라서 Prometheus는 경보 상태에 대한 정보를 주기적으로 Alert 관리자의 실례에 보내고 Alert 관리자는 정확한 알림을 보낼 수 있다.이 Alertmanager는 -alertmanager를 통해 사용할 수 있습니다.url 명령줄 flag를 설정합니다.

    좋은 웹페이지 즐겨찾기