• istio prometheus预警Prometheus AlertManager


    1.安装alertmanager

       kubectl create -f 以下文件

             alertmanager-templates.yaml、configmap.yaml、deployment.yaml、service.yaml

    apiVersion: v1
    data:
      default.tmpl: |
        {{ define "__alertmanager" }}AlertManager{{ end }}
        {{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
    
        {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
        {{ define "__description" }}{{ end }}
    
        {{ define "__text_alert_list" }}{{ range . }}Labels:
        {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }}
        {{ end }}Annotations:
        {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }}
        {{ end }}Source: {{ .GeneratorURL }}
        {{ end }}{{ end }}
    
    
        {{ define "slack.default.title" }}{{ template "__subject" . }}{{ end }}
        {{ define "slack.default.username" }}{{ template "__alertmanager" . }}{{ end }}
        {{ define "slack.default.fallback" }}{{ template "slack.default.title" . }} | {{ template "slack.default.titlelink" . }}{{ end }}
        {{ define "slack.default.pretext" }}{{ end }}
        {{ define "slack.default.titlelink" }}{{ template "__alertmanagerURL" . }}{{ end }}
        {{ define "slack.default.iconemoji" }}{{ end }}
        {{ define "slack.default.iconurl" }}{{ end }}
        {{ define "slack.default.text" }}{{ end }}
    
    
        {{ define "hipchat.default.from" }}{{ template "__alertmanager" . }}{{ end }}
        {{ define "hipchat.default.message" }}{{ template "__subject" . }}{{ end }}
    
    
        {{ define "pagerduty.default.description" }}{{ template "__subject" . }}{{ end }}
        {{ define "pagerduty.default.client" }}{{ template "__alertmanager" . }}{{ end }}
        {{ define "pagerduty.default.clientURL" }}{{ template "__alertmanagerURL" . }}{{ end }}
        {{ define "pagerduty.default.instances" }}{{ template "__text_alert_list" . }}{{ end }}
    
    
        {{ define "opsgenie.default.message" }}{{ template "__subject" . }}{{ end }}
        {{ define "opsgenie.default.description" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
        {{ if gt (len .Alerts.Firing) 0 -}}
        Alerts Firing:
        {{ template "__text_alert_list" .Alerts.Firing }}
        {{- end }}
        {{ if gt (len .Alerts.Resolved) 0 -}}
        Alerts Resolved:
        {{ template "__text_alert_list" .Alerts.Resolved }}
        {{- end }}
        {{- end }}
        {{ define "opsgenie.default.source" }}{{ template "__alertmanagerURL" . }}{{ end }}
    
    
        {{ define "victorops.default.message" }}{{ template "__subject" . }} | {{ template "__alertmanagerURL" . }}{{ end }}
        {{ define "victorops.default.from" }}{{ template "__alertmanager" . }}{{ end }}
    
    
        {{ define "email.default.subject" }}{{ template "__subject" . }}{{ end }}
        {{ define "email.default.html" }}
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <!--
        Style and HTML derived from https://github.com/mailgun/transactional-email-templates
    
    
        The MIT License (MIT)
    
        Copyright (c) 2014 Mailgun
    
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
    
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
    
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
        -->
        <html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
        <head style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
        <meta name="viewport" content="width=device-width" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
        <title style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{ template "__subject" . }}</title>
    
        </head>
    
        <body itemscope="" itemtype="http://schema.org/EmailMessage" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; height: 100%; line-height: 1.6em;  100% !important; background-color: #f6f6f6; margin: 0; padding: 0;" bgcolor="#f6f6f6">
    
        <table style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px;  100%; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6">
          <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
            <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"></td>
            <td width="600" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max- 600px !important; clear: both !important;  100% !important; margin: 0 auto; padding: 0;" valign="top">
              <div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; max- 600px; display: block; margin: 0 auto; padding: 0;">
                <table width="100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;" bgcolor="#fff">
                  <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                    <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #E6522C; margin: 0; padding: 20px;" align="center" bgcolor="#E6522C" valign="top">
                      {{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
                        {{ .Name }}={{ .Value }}
                      {{ end }}
                    </td>
                  </tr>
                  <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                    <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 10px;" valign="top">
                      <table width="100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <a href="{{ template "__alertmanagerURL" . }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #348eda; margin: 0; border-color: #348eda; border-style: solid; border- 10px 20px;">View in {{ template "__alertmanager" . }}</a>
                          </td>
                        </tr>
                        {{ if gt (len .Alerts.Firing) 0 }}
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Firing | len }}] Firing</strong>
                          </td>
                        </tr>
                        {{ end }}
                        {{ range .Alerts.Firing }}
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels</strong><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                            {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            {{ if gt (len .Annotations) 0 }}<strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations</strong><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            <a href="{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source</a><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                          </td>
                        </tr>
                        {{ end }}
    
                        {{ if gt (len .Alerts.Resolved) 0 }}
                          {{ if gt (len .Alerts.Firing) 0 }}
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                            <hr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                            <br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                          </td>
                        </tr>
                          {{ end }}
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Resolved | len }}] Resolved</strong>
                          </td>
                        </tr>
                        {{ end }}
                        {{ range .Alerts.Resolved }}
                        <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                          <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
                            <strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels</strong><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                            {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            {{ if gt (len .Annotations) 0 }}<strong style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations</strong><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
                            <a href="{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source</a><br style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
                          </td>
                        </tr>
                        {{ end }}
                      </table>
                    </td>
                  </tr>
                </table>
    
                <div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px;  100%; clear: both; color: #999; margin: 0; padding: 20px;">
                  <table width="100%" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                    <tr style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
                      <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; text-align: center; color: #999; margin: 0; padding: 0 0 20px;" align="center" valign="top"><a href="{{ .ExternalURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;">Sent by {{ template "__alertmanager" . }}</a></td>
                    </tr>
                  </table>
                </div></div>
            </td>
            <td style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"></td>
          </tr>
        </table>
    
        </body>
        </html>
    
        {{ end }}
    
        {{ define "pushover.default.title" }}{{ template "__subject" . }}{{ end }}
        {{ define "pushover.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
        {{ if gt (len .Alerts.Firing) 0 }}
        Alerts Firing:
        {{ template "__text_alert_list" .Alerts.Firing }}
        {{ end }}
        {{ if gt (len .Alerts.Resolved) 0 }}
        Alerts Resolved:
        {{ template "__text_alert_list" .Alerts.Resolved }}
        {{ end }}
        {{ end }}
        {{ define "pushover.default.url" }}{{ template "__alertmanagerURL" . }}{{ end }}
      slack.tmpl: |
        {{ define "slack.devops.text" }}
        {{range .Alerts}}{{.Annotations.DESCRIPTION}}
        {{end}}
        {{ end }}
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: alertmanager-templates
      namespace: monitoring
    alertmanager-templates.yaml
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: alertmanager
      namespace: monitoring
    data:
      config.yml: |-
        global:
          # ResolveTimeout is the time after which an alert is declared resolved
          # if it has not been updated.
          resolve_timeout: 5m
    
          # The smarthost and SMTP sender used for mail notifications.
          smtp_smarthost: 'smtp.126.com:25'
          smtp_from: 'xxx@126.com'
          smtp_auth_username: 'xxx@126.com'
          smtp_auth_password: 'xxx'
    
          # The API URL to use for Slack notifications.
          slack_api_url: 'https://hooks.slack.com/services/some/api/token'
    
        # # The directory from which notification templates are read.
        templates:
        - '/etc/alertmanager-templates/*.tmpl'
    
        # The root route on which each incoming alert enters.
        route:
    
          # The labels by which incoming alerts are grouped together. For example,
          # multiple alerts coming in for cluster=A and alertname=LatencyHigh would
          # be batched into a single group.
    
          group_by: ['alertname', 'cluster', 'service']
    
          # When a new group of alerts is created by an incoming alert, wait at
          # least 'group_wait' to send the initial notification.
          # This way ensures that you get multiple alerts for the same group that start
          # firing shortly after another are batched together on the first
          # notification.
    
          group_wait: 30s
    
          # When the first notification was sent, wait 'group_interval' to send a batch
          # of new alerts that started firing for that group.
    
          group_interval: 5m
    
          # If an alert has successfully been sent, wait 'repeat_interval' to
          # resend them.
    
          #repeat_interval: 1m
          repeat_interval: 15m
    
          # A default receiver
    
          # If an alert isn't caught by a route, send it to default.
          receiver: default
    
          # All the above attributes are inherited by all child routes and can
          # overwritten on each.
    
          # The child route trees.
          routes:
          # Send severity=slack alerts to slack.
          # - match:
          #     severity: slack
          #   receiver: slack_alert
          - match:
              severity: email
            receiver: email_alert
    
        receivers:
        - name: 'default'
          slack_configs:
          - channel: '#alertmanager-test'
            text: '<!channel>{{ template "slack.devops.text" . }}'
            send_resolved: true
    
        - name: 'slack_alert'
          slack_configs:
          - channel: '#alertmanager-test'
            send_resolved: true
        - name: live-monitoring
          email_configs:
          - to: xxx@ultrapower.com.cn #接收邮箱地址
    configmap.yaml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: alertmanager
      namespace: monitoring
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: alertmanager
      template:
        metadata:
          name: alertmanager
          labels:
            app: alertmanager
        spec:
          containers:
          - name: alertmanager
            image: quay.io/prometheus/alertmanager:v0.7.1
            args:
              - '-config.file=/etc/alertmanager/config.yml'
              - '-storage.path=/alertmanager'
            ports:
            - name: alertmanager
              containerPort: 9093
            volumeMounts:
            - name: config-volume
              mountPath: /etc/alertmanager
            - name: templates-volume
              mountPath: /etc/alertmanager-templates
            - name: alertmanager
              mountPath: /alertmanager
          volumes:
          - name: config-volume
            configMap:
              name: alertmanager
          - name: templates-volume
            configMap:
              name: alertmanager-templates
          - name: alertmanager
            emptyDir: {}
    deployment.yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/path: '/metrics'
      labels:
        name: alertmanager
      name: alertmanager
      namespace: monitoring
    spec:
      selector:
        app: alertmanager
      type: NodePort
      ports:
      - name: alertmanager
        protocol: TCP
        port: 9093
        targetPort: 9093
    service.yaml

    2.配置prometheus对alertmanager的链接

    编辑prometheus.yaml文件,新增

    alerting:
          alertmanagers:
          - static_configs:
            - targets:
              - alertmanager:9093

     

    3.配置预警rules

     编辑prometheus.yaml文件,新增以下代码

     rule_files:
        - "/data/istio/prometheus-rules/*.rules.yml"

    挂载规则文件:

    根据文件生成configMap:

     kubectl create configmap prometheus-rules --from-file=prometheus-rules -o yaml --namespace=istio-system

    注意:rules文件夹名称为prometheus-rules,rules文件为yml格式,如:

    test.rules.yml

    groups:
    - name: my-group-name
      interval: 30s   # defaults to global interval
      rules:
      - record: instance:errors:rate5m
        expr: rate(errors_total[5m])
      - record: instance:requests:rate5m
        expr: rate(requests_total[5m])
      - alert: HighErrors
        # Expressions remain PromQL as before and can be spread over
        # multiple lines via YAML’s multi-line strings.
        expr: |
          sum without(instance) (instance:errors:rate5m)
          /
          sum without(instance) (instance:requests:rate5m)
        for: 5m
        labels:
          severity: critical
        annotations:
          description: "stuff's happening with {{ $labels.service }}"
  • 相关阅读:
    Jmeter之CSV文件读取
    性能计数器及性能分析方法
    性能测试的应用领域
    动态加载JS文件方法总结
    handler method 参数绑定常用注解
    A4纸网页打印
    page-break-before和page-break-after 实现分页打印
    $.ajax 中的contentType
    @Controller和@RestController的区别?
    web页面内容打印总结
  • 原文地址:https://www.cnblogs.com/jiuchongxiao/p/9016212.html
Copyright © 2020-2023  润新知