Prometheus 모니터링 - Alertmanager 경고 모듈

18524 단어 monitoring

Overview


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


    Alertmanager는 Prometheus 서버 등 클라이언트가 보낸 경보를 처리한 후에 중복, 그룹을 삭제하고 루트를 통해 정확한 수신기, 예를 들어 전자메일, Slack 등으로 보내야 한다.Alertmanager는 또한 침묵과 경보 억제 메커니즘을 지원합니다.

    그룹화


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

    억제


    억제란 경보가 발령되면 이 경보가 다른 오류를 일으키는 경보를 중복 발송하지 않는 메커니즘을 말한다.
    예를 들어 경보가 울리면 전체 그룹에 도달할 수 없음을 알릴 수 있습니다. 이 경보가 울리면 발생하는 모든 다른 경보를 무시하도록 설정할 수 있습니다. 이것은 이 문제와 관련이 없는 수백 또는 수천 개의 다른 경보를 방지할 수 있습니다.
    억제 메커니즘은 Alertmanager의 구성 파일을 통해 구성할 수 있습니다.

    침묵


    침묵은 간단한 특정 시간의 음소거 알림의 메커니즘이다.일종의 침묵은 루트 트리처럼 매칭기를 통해 설정된다.전송된 경고는 RE와 일치하며 일치하는 경우 이 경고에 대한 알림이 전송되지 않습니다.
    침묵 메커니즘은 Alertmanager의 웹 페이지를 통해 구성할 수 있습니다.

    Alertmanager 구성


    Alertmanager는 명령줄 flag와 프로필을 통해 구성됩니다.명령줄flag는 변하지 않는 시스템 매개 변수, 프로필에 정의된 금지 규칙, 알림 루트와 알림 수신기를 설정합니다.
    사용 가능한 모든 명령줄 flag를 보려면 실행 alertmanager -h 하십시오.
    Alertmanager가 실행할 때 설정을 불러옵니다. 새로운 설정을 잘 만들지 못하면 변경 사항이 적용되지 않고 오류가 기록됩니다.

    프로파일


    로드된 구성 파일을 지정하려면 -config.file 플래그를 사용해야 합니다.이 파일은 YAML을 사용하여 다음 설명을 통해 정의됩니다.괄호 내의 매개변수는 선택 사항이며 목록이 아닌 매개변수의 값은 지정된 기본값으로 설정됩니다.
    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:  ]
    
      # 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:
      [ -  ... ]

    라우팅 라우팅


    라우팅 블록은 라우팅 트리와 하위 노드를 정의합니다.설정이 없으면 하위 노드의 선택적 구성 파라미터가 부모 노드에서 상속됩니다.
    각 경고는 구성된 라우팅 트리의 최상위 경로로 들어가며, 최상위 경로는 모든 경고와 일치해야 합니다(즉, 일치하는 형식이 없습니다).그리고 하위 노드를 맞추세요.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: <string> | 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: { <string>: , ... } ]

    Slack 수신기 slack_config

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

    Webhook 수신기 webhook_config

    # Whether or not to notify about resolved alerts.
    [ send_resolved: <boolean> | default = true ]
    
    # The endpoint to send HTTP POST requests to.
    url: <string>

    Alertmanager는 다음과 같은 형식으로 구성 끝에 HTTP POST 요청을 보냅니다.
    {
      "version": "2",
      "status": "",
      "alerts": [
        {
          "labels": ,
          "annotations": ,
          "startsAt": "",
          "endsAt": ""
        },
        ...
      ]
    } 
      

    경보 규칙

    Prometheus , 。

    경고 규칙 정의

    ALERT 
      IF 
      [ FOR  ]
      [ LABELS <label set> ]
      [ ANNOTATIONS <label set> ]

    FOR 자구는 Prometheus가 첫 번째로 들어오는 벡터 요소(예를 들어 HTTP 오류가 높은 실례)를 기다리고 경보를 계산하도록 합니다.원소가 active이지만 Firing이 없으면pending 상태입니다.
    LABELS(레이블) 자문은 경고에 추가 레이블 세트를 지정할 수 있습니다.기존의 모든 탭은 덮어쓰고 탭 값은 템플릿화할 수 있습니다.
    ANNOTATIONS(주석) 자구는 경보 설명이나 링크와 같은 더 긴 다른 정보를 저장하는 데 사용되는 경보 실례가 밝혀지지 않은 다른 탭을 지정합니다. 주석 값은 템플릿화할 수 있습니다.

    경고 규칙 예

    # 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)",
      }

    경고 알림 보내기


    Prometheus는 경보 상태에 대한 정보를 주기적으로 Alert 관리자의 실례로 보내고 Alert 관리자가 정확한 알림을 보낼 수 있도록 스케줄링할 수 있습니다.이 Alertmanager는 -alertmanager.url 명령줄 flag를 통해 구성할 수 있습니다.

    좋은 웹페이지 즐겨찾기