prometheus監控使用

1、基本介紹


(一)、簡述

  1. Prometheus是一套開源的系統監控和報警框架,Prometheus在2016年加入了 Cloud Native Computing Foundation,這是繼Kubernetes以後的第二個託管項目。
  2. 普羅米修斯

(二)、監控目的

  1. 系統指標變化趨勢分析
  2. 保證業務持續性運行
  3. 及時告警
  4. 故障分析和定位
  5. 數據可視化

(三)、特徵

  1. 多維數據模型,其中包含經過度量標準名稱和鍵/值對標識的時間序列數據
  2. 靈活的查詢語言,PromQL
  3. 不依賴分佈式存儲,可單節點部署
  4. 數據採集經過HTTP協議,使用pull模式拉取數據
  5. 能夠經過pushgateway組件使用push模式推送數據
  6. 經過服務發現或者靜態配置發現目標
  7. 多種圖形和儀表盤支持

(四)、架構和組件

  1. 架構圖html

  2. prometheus server組件java

    ​ 數據採集和存儲時序數據node

  3. client libraries組件linux

    ​ 用於採集應用程序代碼庫git

  4. pushgateway組件github

    ​ 支持短時間jobs,由job推送到Pushgateway,再經過Pushgateway暴露給Prometheusweb

  5. exporters組件正則表達式

    ​ 用於暴露第三方服務採集指標spring

  6. alertmanager組件shell

    ​ 對prometheus告警進行分組、抑制、靜默等功能

  7. 服務發現

    ​ 經過服務發現,自動發現監控目標

  8. 其餘組件

    ​ grafana、api clients

(五)、使用場景

  1. prometheus很是適合記錄任何純數字時間序列。它既適合以機器爲中心的監視,也適合於高度動態的面向服務的體系結構的監視。在微服務世界中,其對多維數據收集和查詢的支持是一種特別的優點。
  2. 不適合100%準確性的要求,例如按請求計費

2、基本概念


(一)、數據模型

  1. 指標名稱和標籤

    每一條時間序列由指標名稱(Metrics Name)以及一組標籤(鍵值對)惟一標識。其中指標的名稱(metric name)能夠反映被監控樣本的含義
    經過使用標籤,Prometheus 開啓了強大的多維數據模型:對於相同的指標名稱,經過不一樣標籤列表的集合,會造成特定的度量維度實例。該查詢語言在這些指標和標籤列表的基礎上進行過濾和聚合。改變任何度量指標上的任何標籤值(包括添加或刪除指標),都會建立新的時間序列。
  2. 樣本

    在時間序列中的每個點稱爲一個樣本(sample),樣本由如下三部分組成:
    指標(metric):指標名稱和描述當前樣本特徵的 labelsets;
    時間戳(timestamp):一個精確到毫秒的時間戳;
    樣本值(value): 一個 folat64 的浮點型數據表示當前樣本的值。
  3. 表達方式

    # 經過以下表達方式表示指定指標名稱和指定標籤集合的時間序列:
    <metric name>{<label name>=<label value>, ...}
    # 示例
    api_http_requests_total{method="POST", handler="/messages"}

(二)、指標類型

  1. Counter計數器

    Counter 類型表明一種樣本數據單調遞增的指標,即只增不減,除非監控系統發生了重置。
  2. Guage儀表盤

    Guage 類型表明一種樣本數據能夠任意變化的指標,便可增可減。guage 一般用於像溫度或者內存使用率這種指標數據,也能夠表示能隨時增長或減小的「總數」,例如:當前併發請求的數量。
  3. Histogram直方圖

    Histogram 在一段時間範圍內對數據進行採樣(一般是請求持續時間或響應大小等),並將其計入可配置的存儲桶(bucket)中,後續可經過指定區間篩選樣本,也能夠統計樣本總數,最後通常將數據展現爲直方圖。
    Histogram 類型的樣本會提供三種指標:
    1. 樣本的值分佈在 bucket 中的數量,命名爲 <basename>_bucket{le="<上邊界>"}。(指標值小於等於上邊界的全部樣本數量)
    2. 全部樣本值的大小總和,命名爲 <basename>_sum。
    3. 樣本總數,命名爲 <basename>_count。值和 <basename>_bucket{le="+Inf"} 相同。
  4. Summary摘要

    與 Histogram 類型相似,用於表示一段時間內的數據採樣結果(一般是請求持續時間或響應大小等),但它直接存儲了分位數(經過客戶端計算,而後展現出來),而不是經過區間來計算。
    Summary 類型的樣本也會提供三種指標:
    1. 樣本值的分位數分佈狀況,命名爲 <basename>{quantile="<φ>"}。
    2. 全部樣本值的大小總和,命名爲 <basename>_sum。
    3. 樣本總數,命名爲 <basename>_count。

3、部署安裝


(一)、prometheus

  1. 下載

    # https://prometheus.io/download/
    wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz
  2. 解壓

    tar -zxvf prometheus-2.23.0.linux-amd64.tar.gz -C /opt/ && mv /opt/prometheus-2.23.0.linux-amd64 /opt/prometheus
  3. 建立用戶、目錄

    # 建立用戶
    useradd prometheus -s /sbin/nologin -M
    # 數據目錄
    mkdir -pv /data/prometheus
    # 受權
    chown -R prometheus.prometheus /data/prometheus/
  4. 配置systemd服務

    # 建立prometheus服務
    vi /usr/lib/systemd/system/prometheus.service
    [Unit]
    Description=Prometheus
    After=network.target
    
    [Service]
    Type=simple
    Environment="GOMAXPROCS=8"
    User=prometheus
    Group=prometheus
    ExecReload=/bin/kill -HUP $MAINPID
    ExecStart=/opt/prometheus/prometheus \
      --config.file=/opt/prometheus/prometheus.yml \
      --storage.tsdb.path=/data/prometheus \
      --storage.tsdb.retention.time=30d \
      --storage.tsdb.retention.size=0 \
      --web.console.libraries=/opt/prometheus/console_libraries \
      --web.console.templates=/opt/prometheus/consoles \
      --web.listen-address=0.0.0.0:9090 \
      --web.external-url=
    PrivateTmp=true
    PrivateDevices=true
    ProtectHome=true
    NoNewPrivileges=true
    LimitNOFILE=infinity
    ReadWriteDirectories=/data/prometheus
    ProtectSystem=full
    SyslogIdentifier=prometheus
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
  5. 參數說明

    # 指定配置文件地址
    --config.file=/opt/prometheus/prometheus.yml \
    # 持久化存儲目錄
    --storage.tsdb.path=/data/prometheus \
    # 持久化存儲時間,默認15天
    --storage.tsdb.retention.time=30d \
    # 存儲塊可使用的最大字節數,默認爲0或者禁用
    --storage.tsdb.retention.size=0 \
    # 控制檯庫目錄的路徑
    --web.console.libraries=/opt/prometheus/console_libraries \
    # 控制檯模板目錄的路徑
    --web.console.templates=/opt/prometheus/consoles \
    # 監聽IP和端口
    --web.listen-address=0.0.0.0:9090 \
    # 外部訪問地址,默認爲缺省值組件會自動派生
    --web.external-url=
  6. 啓動

    # 啓動
    systemctl start prometheus
    # 狀態
    systemctl status prometheus
    # 中止
    systemctl stop prometheus
    # 重啓
    systemctl restart prometheus
    # 重載
    systemctl reload prometheus
    # 開機自啓動
    systemctl enable prometheus
    # 關閉自啓動
    systemctl disable prometheus
  7. 訪問

    # web訪問地址
    http://localhost:9090
    # metrics訪問地址
    http://localhost:9090/metrics

(二)、node_exporter

  1. 下載

    wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
  2. 解壓

    tar -zxvf node_exporter-1.0.0.linux-amd64.tar.gz -C /opt/ && mv /opt/node_exporter-1.0.1.linux-amd64 /opt/node_exporter
  3. 建立用戶和目錄

    # 建立用戶
    useradd node_exporter -s /sbin/nologin -M
    # 數據目錄
    mkdir -pv /data/node_exporter
    # 受權
    chown -R node_exporter.node_exporter /data/node_exporter/
  4. 配置systemd服務

    # 建立node_exporter服務
    vi /usr/lib/systemd/system/node_exporter.service
    [Unit]
    Description=Prometheus Node Exporter
    After=network.target
    
    [Service]
    Type=simple
    User=node_exporter
    Group=node_exporter
    ExecStart=/opt/node_exporter/node_exporter \
        --collector.systemd \
        --collector.textfile \
        --collector.textfile.directory=/data/node_exporter \
        --web.listen-address=0.0.0.0:9100
    SyslogIdentifier=node_exporter
    Restart=always
    PrivateTmp=yes
    ProtectHome=yes
    NoNewPrivileges=yes
    ProtectSystem=full
    
    [Install]
    WantedBy=multi-user.target
  5. 啓動服務

    # 啓動
    systemctl start node_exporter
    # 狀態
    systemctl status node_exporter
    # 中止
    systemctl stop node_exporter
    # 重啓
    systemctl restart node_exporter
    # 開機自啓動
    systemctl enable node_exporter
    # 關閉自啓動
    systemctl disable node_exporter
  6. 訪問

    # metrics訪問
    http://localhost:9100/metrics
  7. prometheus採集node_exporter

    # prometheus.yml配置job_name
    scrape_configs:
      - job_name: 'node_exporter'
        static_configs:
        - targets: ['localhost:9100']
    # 檢驗配置文件
    /opt/prometheus/promtool check config /opt/prometheus/prometheus.yml
    # 重載服務
    systemctl reload prometheus
  8. 驗證

    # 訪問targets,查看job狀態是否"OK"
    http://localhost:9090/targets
    # 查詢收集數據
    http://localhost:9090/graph
    # 查詢條件
    # 查看系統信息
    node_uname_info

(三)、grafana

  1. 下載

    wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.3.6-1.x86_64.rpm
  2. 安裝

    yum localinstall grafana-7.3.6-1.x86_64.rpm -y
  3. 啓動服務

    # 啓動
    systemctl start grafana-server
    # 開機自啓動
    systemctl enable grafana-server
  4. 配置

    #訪問地址 默認用戶:密碼(admin:admin)
    http://localhost:3000
    # 新增datasources,配置Prometheus
    # HTTP中url
    http://localhost:9090
  5. 儀表盤

    # 導入node_exporter儀表盤
    https://grafana.com/grafana/dashboards/8919
    # dashboards => Manage => import => 8919 => Load

(四)、alertmanager

  1. 下載

    wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
  2. 解壓

    tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /opt/ && mv /opt/alertmanager-0.21.0.linux-amd64 /opt/alertmanager
  3. 建立用戶和目錄

    # 建立用戶
    useradd alertmanager -s /sbin/nologin -M
    # 數據目錄
    mkdir -pv /data/alertmanager
    # 受權
    chown -R alertmanager.alertmanager /data/alertmanager/
  4. 配置systemd服務

    vim /usr/lib/systemd/system/alertmanager.service
    [Unit]
    Description=Prometheus Alertmanager
    After=network.target
    
    [Service]
    Type=simple
    User=alertmanager
    Group=alertmanager
    ExecReload=/bin/kill -HUP $MAINPID
    ExecStart=/opt/alertmanager/alertmanager \
      --config.file=/opt/alertmanager/alertmanager.yml \
      --storage.path=/data/alertmanager \
      --web.listen-address=0.0.0.0:9093 \
      --web.external-url=http://0.0.0.0:9093/
    SyslogIdentifier=alertmanager
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
  5. 參數說明

    # 配置文件路徑
      --config.file=/opt/alertmanager/alertmanager.yml \
      # 數據存儲路徑
      --storage.path=/data/alertmanager \
      --web.listen-address=0.0.0.0:9093 \
      --web.external-url=http://0.0.0.0:9093/
  6. 啓動服務

    # 啓動
    systemctl start alertmanager
    # 開機自啓動
    systemctl enable alertmanager
  7. prometheus集成alertmanager

    # 修改prometheus.yml
    vim /opt/prometheus/prometheus.yml
    alerting:
      alertmanagers:
      - static_configs:
        - targets:
           - localhost:9093
           
    # 重載prometheus服務
    systemctl reload prometheus
  8. 訪問

    # 訪問地址
    http://localhost:9093
    # 告警頁
    http://localhost:9093/#/alerts
    # 靜默頁
    http://localhost:9093/#/silences
    # 狀態頁
    http://localhost:9093/#/status

(五)、webhook-dingtalk

  1. 下載

    wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
  2. 解壓

    tar -zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz -C /opt/ && mv /opt/prometheus-webhook-dingtalk-1.4.0.linux-amd64 /opt/prometheus-webhook-dingtalk
  3. 建立用戶

    # 建立用戶
    useradd webhook-dingtalk -s /sbin/nologin -M
  4. 配置systemd服務

    vim /usr/lib/systemd/system/prometheus-webhook-dingtalk.service
    [Unit]
    Description=prometheus-webhook-dingtalk
    After=network-online.target
    
    [Service]
    User=webhook-dingtalk
    Group=webhook-dingtalk
    ExecStart=/opt/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk   --config.file=/opt/prometheus-webhook-dingtalk/config.yml --web.enable-ui
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
  5. 建立釘釘機器人

    #【電腦釘釘 】-【羣聊】-【羣設置】-【智能羣助手】-【添加更多】-【添加機器人】-【自定義】-【添加】
    # webhook地址
    https://oapi.dingtalk.com/robot/send?access_token=xxx
    # 安全設置
    # 例如:自定義關鍵字
    告警
  6. 配置文件

    vim /opt/prometheus-webhook-dingtalk/config.yml
    timeout: 5s
    
    templates:
      - /opt/prometheus-webhook-dingtalk/template.tmpl
    targets:
      webhook1:
        url: https://oapi.dingtalk.com/robot/send?access_token=xxxx
  7. 配置模板

    vim /opt/prometheus-webhook-dingtalk/template.tmpl
    {{ 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 "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
    
    {{ define "default.__text_alert_list" }}{{ range . }}
    **告警級別:** \[{{ .Labels.severity | upper }}\]
    
    **告警部門:** \[{{ .Annotations.department }}\]
    
    **告警目標:** \[{{ .Annotations.summary }}\]
    
    **目標描述:** \[{{ .Annotations.instancedesc }}\]
    
    **告警詳情:** {{ .Annotations.description }}
    
    {{ end }}{{ end }}
    
    {{/* Default */}}
    {{ define "default.title" }}{{ template "__subject" . }}{{ end }}
    {{ define "default.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]**
    {{ if gt (len .Alerts.Firing) 0 -}}
    **告警狀態:** [觸發告警]
    {{ template "default.__text_alert_list" .Alerts.Firing }}
    {{- end }}
    {{ if gt (len .Alerts.Resolved) 0 -}}
    {{ template "default.__text_alert_list" .Alerts.Resolved }}
    **恢復通知:** [<font color="#00dd00">告警已恢復正常</font><br />]
    {{- end }}
    {{- end }}
  8. 啓動服務

    # 啓動
    systemctl start prometheus-webhook-dingtalk
    # 開機自啓動
    systemctl enable prometheus-webhook-dingtalk
    # 狀態
    systemctl status prometheus-webhook-dingtalk
  9. 集成alertmanager組件

    # 修改配置
    # vim /opt/alertmanager/alertmanager.yml
    route:
      group_by: ['alertname']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 1h
      receiver: 'webhook1'
    receivers:
    - name: 'webhook1'
      webhook_configs:
      - url: 'http://localhost:8060/dingtalk/webhook1/send'
        send_resolved: true
    # 檢驗配置文件
    /opt/alertmanager/amtool check-config /opt/alertmanager/alertmanager.yml
    # 重載
    systemctl reload alertmanager

(六)、告警

  1. 開啓規則配置

    # 修改配置文件
    # vim /opt/prometheus/prometheus.yml
    rule_files:
       - "rules/*.yml"
    # 建立規則目錄
    mkdir -pv /opt/prometheus/rules
  2. 配置規則文件

    # 新增global規則文件
    vi /opt/prometheus/rules/general.yml
    groups:
    - name: general.rules
      rules:
      - alert: 服務器宕機告警
        expr: up{job=~"node_exporter|node"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }}"
          department: "{{ $labels.department  }}"
          instancedesc: "{{ $labels.desc }}"
          description: "該服務器已經中止了2分鐘以上,請及時處理。"
    # 驗證配置文件
    /opt/prometheus/promtool check config /opt/prometheus/prometheus.yml
    # 重載服務
    systemctl reload prometheus
  3. 測試驗證告警

    # 中止/啓動目標服務
    systemctl stop node_exporter
    systemctl start node_exporter
    # 驗證alerts狀態
    http://localhost:9090/alerts
    # 查看釘釘羣告警/恢復消息

4、文件配置


(一)、全局配置

  1. 示例

    global:
      scrape_interval:      15s 
      scrape_timeout: 		 10s
      evaluation_interval:  15s
    alerting:
      alertmanagers:
      - static_configs:
        - targets:
           - localhost:9093
    rule_files:
       - "rules/*.yml"
  2. 配置說明

    # 抓取目標的頻率,默認1m 
    scrape_interval
    # 抓取請求超時時間,默認10s
    scrape_timeout
    # 評估告警規則的頻率,默認1m
    evaluation_interval
    
    # alertmanagers組件地址
    alerting:
      alert_relabel_configs:
        [ - <relabel_config> ... ]
      alertmanagers:
        [ - <alertmanager_config> ... ]
        
    # 規則文件
    rule_files:
      [ - <filepath_glob> ... ]

(二)、抓取文件配置

  1. 示例

    scrape_configs:
    	# 靜態配置
      - job_name: 'node_exporter'
        static_configs:
        - targets: ['127.0.0.1:9100']
      # file_sd文件動態配置
      - file_sd_configs:
        - files: ['./file_sd/node/node.yml']
          refresh_interval: 8s
        job_name: 'node'
        metrics_path: /metrics
        relabel_configs:
        - source_labels: [__address__]
          regex: (.*)
          target_label: instance
          replacement: $1
        - source_labels: [__address__]
          regex: (.*)
          target_label: __address__
          replacement: $1:9100
  2. 基於static_configs靜態配置

    # 靜態配置指定的目標
    targets:
      [ - '<host>' ]
    # 自定義標籤
    labels:
      [ <labelname>: <labelvalue> ... ]
  3. relabel_configs自定義標籤

    # 默認標籤
    # targets中配置的值
    __address__
    # 配置中取值,默認值 "/metrics"
    __metrics_path__
    # 配置中取值,默認值 "http"
    __scheme__
    # 重定義標籤__address__
    instance
    # 從已有的標籤選擇值的源標籤組;多個標籤,使用separator分隔;
    # regex匹配源標籤裏的值
    # 動做爲replace, keep, 和 drop
    # 源標籤
    [ source_labels: '[' <labelname> [, ...] ']' ]
    
    # 多個源標準的分割值
    [ separator: <string> | default = ; ]
    
    # 在替換操做中,regex匹配的的值須要寫入結果值的標籤。
    # 對於替換操做是強制性的
    [ target_label: <labelname> ]
    
    # 正則表達式匹配源標籤的值
    [ regex: <regex> | default = (.*) ]
    
    # 源標籤取hash的模塊
    [ modulus: <int> ]
    
    # 要替換的匹配分組號和值
    [ replacement: <string> | default = $1 ]
    
    # 基於正則匹配的操做動做
    [ action: <relabel_action> | default = replace ]
    # relabel_action 值
    
    replace: 正則匹配源標籤的值用來替換目標標籤。若是regex不匹配,則不進行替換。
    keep: 若是正則沒有匹配到源標籤,刪除targets 
    drop: 若是正則匹配到源標籤,刪除targets
    hashmod: 設置目標標籤值爲源標籤值的hash值
    labelmap: 正則匹配全部標籤名; 將匹配的標籤的值複製到由replacement提供的標籤名
    labeldrop: 正則匹配全部標籤名;匹配則移除標籤;
    labelkeep: 正則匹配全部標籤名;不匹配的標籤會被移除;
    # node示例
    relabel_configs:
    - source_labels: [__address__]
      regex: (.*)
      target_label: __address__
      replacement: $1:9100
    # java微服務示例
    relabel_configs:
    - source_labels: [contextpath]
      regex: (.*)
      target_label: __metrics_path__
      replacement: $1/actuator/prometheus
  4. 基於file_sd_configs動態配置

    # 獲取目標的文件模式(json/yaml)
    files:
      [ - <filename_pattern> ... ]
    
    # 從新讀取文件的頻率,默認爲5m
    [ refresh_interval: <duration> | default = 5m ]
    # JSON json 文件模式
    [ { "targets": [ "<host>", ... ], "labels": { "<labelname>": "<labelvalue>", ... } }, ... ]
    # YAML yaml 文件模式
    - targets: [ - '<host>' ] labels: [ <labelname>: <labelvalue> ... ]
    # 示例
    - file_sd_configs:
      - files: ['./file_sd/node/node.yml']
        refresh_interval: 8s
      job_name: 'node'
      metrics_path: /metrics
    # 主機node.yml
    - labels:
        desc: testnode
        department: test
      targets:
        - 127.0.0.1
    # java服務app.yml
    - labels:
        contextpath: /demo
        application: demo
        desc: demo
      targets:
        - 127.0.0.1:8055
  5. 基於eureka_sd_configs動態配置

    # eureka服務器地址
    server: <string>
    
    # 從新讀取應用系統的頻率,默認30s
    [ refresh_interval: <duration> | default = 30s ]
    # 示例
    scrape_configs:  
      - job_name: 'test-app'
        eureka_sd_configs:
          - server: http://127.0.0.1:1111/eureka
        relabel_configs:
        - source_labels: [__meta_eureka_app_instance_metadata_prometheus_scrape]
          action: keep
          regex: true
        - source_labels: [__meta_eureka_app_instance_metadata_prometheus_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
          action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          target_label: __address__
    # spring boot配置
    # application.yaml
    eureka:
      instance:
        metadataMap:
          "prometheus.scrape": "true"
          "prometheus.path": "/demo/actuator/prometheus"
          "prometheus.port": "8055"
    # 重定義標籤配置描述
    1. prometheus.scrape
    	 僅從新標記該應用程序示例
    2. prometheus.path
    	 基於應用程序自定義度量路徑的從新標記示例
    3. prometheus.port
    	 示例從新標記以僅獲取應用程序所需的單個端口

(三)、規則文件配置

  1. 示例

    groups:
    - name: example
      rules:
      # 5分鐘實例沒法正常訪問
      - alert: InstanceDown
        expr: 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."
    
      # 10分鐘內請求延遲時間大於1s
      - alert: APIHighRequestLatency
        expr: api_http_request_latencies_second{quantile="0.5"} > 1
        for: 10m
        annotations:
          summary: "High request latency on {{ $labels.instance }}"
          description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
  2. groups

    groups:
      [ - <rule_group> ]
  3. rule_group

    # 組名,值惟一
    name: <string>
    
    # 評估規則的頻率,默認爲全局配置evaluation_interval的值
    [ interval: <duration> | default = global.evaluation_interval ]
    
    rules:
      [ - <rule> ... ]
  4. rule

    # 告警名
    alert: <string>
    
    # PromQL表達式
    # 掛起/觸發告警
    expr: <string>
    
    # 持續時間後觸發告警
    [ for: <duration> | default = 0s ]
    
    # 標籤
    labels:
      [ <labelname>: <tmpl_string> ]
    
    # 備註
    annotations:
      [ <labelname>: <tmpl_string> ]

(四)、遠程讀寫配置

  1. 示例

    # 遠程存儲 influxdb
    remote_write:
      - url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
    remote_read:
      - url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
  2. remote_write

    # 遠程地址
    url: <string>
    # 其餘參數參考地址
    https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
  3. remote_read

    # 遠程地址
    url: <string>
    # 其餘參數參考地址
    https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read

5、告警管理


(一)、用途

  1. 分組告警
  2. 靜默處理
  3. 抑制處理
  4. 發送處理

(二)、配置

  1. 示例

    global: # 全局配置
      resolve_timeout: 5m # 解決報警時間間隔
    # 分發的規則
    route:
      group_by: ['alertname','department']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 40m
      # 默認
      receiver: 'webhook1'
      routes:
      # webhook1
      - receiver: 'webhook1'
        group_wait: 10s
        continue: true
      # webhook2
      - receiver: 'webhook2'
        group_wait: 10s
        # 標籤匹配
        match_re:
          department: demo|demo1
    
    # 接受者,能夠是郵箱,wechat或者web接口等等
    receivers:
     # 釘釘告警
     - name: 'webhook2'
       webhook_configs:
       - url: 'http://localhost:8060/dingtalk/webhook2/send'
         send_resolved: true
     # 默認通知
     - name: 'webhook1'
       webhook_configs:
       - url: 'http://localhost:8060/dingtalk/webhook1/send'
         send_resolved: true
    
    # 抑制的規則
    inhibit_rules:
      - source_match:
          severity: 'critical'
        target_match_re:
          severity: 'warning|major'
        equal: ['alertname', 'dev', 'instance']
  2. global全局配置

    global:
    	# 郵件告警全局配置
      [ smtp_from: <tmpl_string> ]
      [ smtp_smarthost: <string> ]
      [ smtp_hello: <string> | default = "localhost" ]
      [ smtp_auth_username: <string> ]
      [ smtp_auth_password: <secret> ]
      [ smtp_auth_identity: <string> ]
      [ smtp_auth_secret: <secret> ]
      [ smtp_require_tls: <bool> | default = true ]
    	# 微信告警全局配置
      [ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/" ]
      [ wechat_api_secret: <secret> ]
      [ wechat_api_corp_id: <string> ]
      # 解決報警時間間隔
      [ resolve_timeout: <duration> | default = 5m ]
  3. templates消息模板

    {{ define "wps.html" }}
    <table border="1">
        <tr><td>報警項</td>
            <td>地址</td>
            <td>描述</td>
        </tr>
        {{ range $i, $alert := .Alerts }}
            <tr><td>{{ index $alert.Labels "alertname" }}</td>
                <td>{{ index $alert.Labels "instance" }}</td>
                <td>{{ index $alert.Annotations "description" }}</td>
            </tr>
        {{ end }}
    </table>
    {{ end }}
  4. route路由分發規則

    # 默認接收者
    [ receiver: <string> ]
    # 分組依據
    [ group_by: '[' <labelname>, ... ']' ]
    # 是否繼續匹配後續同級節點
    [ continue: <boolean> | default = false ]
    
    # 告警必須一組等於匹配器才能匹配節點
    match:
      [ <labelname>: <labelvalue>, ... ]
    
    # 告警必須知足一組正則表達式匹配器才能匹配節點
    match_re:
      [ <labelname>: <regex>, ... ]
    
    # 發送組通知的初始等待時間,默認30s
    [ group_wait: <duration> | default = 30s ]
    
    # 發送新告警以前須要等待的時間,默認5分鐘
    [ group_interval: <duration> | default = 5m ]
    
    # 發送成功後,重複發送間隔時間,默認4小時
    [ repeat_interval: <duration> | default = 4h ]
    
    # 子路由
    routes:
      [ - <route> ... ]
  5. receivers 消息接收配置

    # 接收者惟一名稱
    name: <string>
    
    # 多個通知的集成配置,推送使用webhook方式
    email_configs:
      [ - <email_config>, ... ]
    pagerduty_configs:
      [ - <pagerduty_config>, ... ]
    pushover_configs:
      [ - <pushover_config>, ... ]
    slack_configs:
      [ - <slack_config>, ... ]
    opsgenie_configs:
      [ - <opsgenie_config>, ... ]
    webhook_configs:
      [ - <webhook_config>, ... ]
    victorops_configs:
      [ - <victorops_config>, ... ]
    wechat_configs:
      [ - <wechat_config>, ... ]
  6. webhook_configs配置

    # 是否通知已處理的告警,默認通知
    [ send_resolved: <boolean> | default = true ]
    
    # webhook的api地址
    url: <string>
    
    # http配置,默認讀取全局http_config配置
    [ http_config: <http_config> | default = global.http_config ]
    
    # 單個webhook的最大告警數
    # 默認爲0,表示發送全部告警
    [ max_alerts: <int> | default = 0 ]
  7. inhibit_rules抑制規則配置

    # 告警在匹配器中將被靜默
    target_match:
      [ <labelname>: <labelvalue>, ... ]
    # 告警在正則表達式匹配器中將被靜默
    target_match_re:
      [ <labelname>: <regex>, ... ]
      
    # 必須有一組等於匹配器,抑制才能生效
    source_match:
      [ <labelname>: <labelvalue>, ... ]
    # 必須知足一組正則表達式匹配器,抑制纔是生效 
    source_match_re:
      [ <labelname>: <regex>, ... ]
      
    # 只有源和目標中的值必須相等的標籤,抑制才能生效
    [ equal: '[' <labelname>, ... ']' ]

6、PromQL


(一)、簡述

  1. 介紹

    Prometheus 提供了一種功能表達式語言 PromQL,容許用戶實時選擇和匯聚時間序列數據。表達式的結果能夠在瀏覽器中顯示爲圖形,也能夠顯示爲表格數據,或者由外部系統經過 HTTP API 調用。
  2. 示例

    http_requests_total
    http_requests_total{job="apiserver", handler="/api/comments"}
    http_requests_total{job="apiserver", handler="/api/comments"}[5m]

(二)、表達式語言數據類型

  1. 瞬時向量

    一組時間序列,每一個時間序列包含單個樣本,它們共享相同的時間戳。

  2. 區間向量

    一組時間序列,每一個時間序列包含一段時間範圍內的樣本數據。

  3. 標量

    一個浮點型的數據值。

  4. 字符串

    一個簡單的字符串值。

(三)、字面量

  1. 字符串

    1. 字符串能夠用單引號、雙引號或反引號指定爲文字常量。
    2. PromQL 遵循與 Go 相同的轉義規則。在單引號或雙引號中,用反斜槓來表示轉義序列,後面能夠跟 a, b, f, n, r, t, v 或 \。特殊字符可使用八進制(\nnn)或者十六進制(\xnn,\unnnn 和 \Unnnnnnnn)。
    3. 與 Go 不一樣,Prometheus 不會對反引號內的換行符進行轉義。
  2. 標量

    標量浮點值能夠字面上寫成 [-](digits)[.(digits)] 的形式。

(四)、時間序列過濾器

  1. 瞬時向量過濾器

    1. 瞬時向量過濾器容許在指定的時間戳內選擇一組時間序列和每一個時間序列的單個樣本值。
    2. 能夠經過向花括號({})裏附加一組標籤來進一步過濾時間序列。
    3. PromQL 還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配和正則匹配。總共有如下幾種標籤匹配運算符:
    	= 徹底相同
      != 不相同
      =~ 相匹配
      !~ 不匹配
    4. 沒有指定標籤的標籤過濾器會選擇該指標名稱的全部時間序列。
    5. 全部的 PromQL 表達式必須至少包含一個指標名稱,或者一個不會匹配到空字符串的標籤({job=~".*"})過濾器。
  2. 區間向量過濾器

    1. 區間向量與瞬時向量的工做方式相似,惟一的差別在於在區間向量表達式中咱們須要定義時間選擇的範圍,時間範圍經過時間範圍選擇器 [] 進行定義,以指定應爲每一個返回的區間向量樣本值中提取多長的時間範圍。
    2. 時間範圍經過數字來表示,單位可使用如下其中之一的時間單位:
    	s 秒
    	m 分鐘
    	h 小時
    	d 天
    	w 周
    	y 年
    3. 示例
    # 5分鐘內http_requests_total指標,job標籤值爲prometheus的全部時間序列
    http_requests_total{job="prometheus"}[5m]
  3. 時間位移操做

    1. 位移操做的關鍵字爲 offset
    2. 示例
    # 瞬時向量-當前查詢時間過去5分鐘的http_requests_total值:
    http_requests_total offset 5m
    # 區間向量-http_requests_total一週前的5分鐘以內的HTTP請求量的增加率:
    rate(http_requests_total[5m] offset 1w)

(五)、操做符

  1. 二元運算符

    1. 算數運算
    + - * / % ^ 等
    2. 布爾運算
    == != > < >= <= 
    3. 邏輯運算
    and or unless
    4. 運算符優先級,從高到底:
    ^, *, /, %, + , - , ==, !=, <=, <, >=, > , and, unless , or
  2. 匹配模式

    1. 描述
    向量與向量之間進行運算操做時會基於默認的匹配規則:依次找到與左邊向量元素匹配(標籤徹底一致)的右邊向量元素進行運算,若是沒找到匹配元素,則直接丟棄。
    2. 一對一匹配
    # 格式
    vector1 <operator> vector2
    # 操做
    # ignoring能夠在匹配時忽略某些便籤
    <vector expr> <bin-op> ignoring(<label list>) <vector expr>
    # on將匹配行爲限定在某些便籤以內
    <vector expr> <bin-op> on(<label list>) <vector expr>
    
    3. 多對一/一對多匹配
    # 修飾符
    <vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
    <vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
    <vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
    <vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
  3. 聚合操做

    sum (求和)
    min (最小值)
    max (最大值)
    avg (平均值)
    stddev (標準差)
    stdvar (標準差別)
    count (計數)
    count_values (對 value 進行計數)
    bottomk (樣本值最小的 k 個元素)
    topk (樣本值最大的k個元素)
    quantile (分佈統計)

(六)、內置函數

  1. irate()

    1. 用於計算區間向量的增加率。可是其反應出的是瞬時增加率。irate 函數是經過區間向量中最後兩個兩本數據來計算區間向量的增加速率,它會在單調性發生變化時(如因爲採樣目標重啓引發的計數器復位)自動中斷。
    2. 示例
    # 區間向量中每一個時間序列過去 5 分鐘內最後兩個樣本數據的 HTTP 請求數的增加率
    irate(http_requests_total{job="api-server"}[5m])
  2. label_join()

    1. label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...) 函數能夠將時間序列 v 中多個標籤 src_label 的值,經過 separator 做爲鏈接符寫入到一個新的標籤 dst_label 中。能夠有多個 src_label 標籤。
    2. 示例(新加foo標籤,標籤值爲"etcd,etcd-k8s")
    label_join(up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}, "foo", ",", "job", "service")
  3. rate()

    1. rate(v range-vector) 函數能夠直接計算區間向量 v 在時間窗口內平均增加速率,它會在單調性發生變化時(如因爲採樣目標重啓引發的計數器復位)自動中斷。該函數的返回結果不帶有度量指標,只有標籤列表。
    2. rate() 函數返回值類型只能用計數器,在長期趨勢分析或者告警中推薦使用這個函數。
    3. 示例
    # 區間向量中每一個時間序列過去 5 分鐘內 HTTP 請求數的每秒增加率
    rate(http_requests_total[5m])
  4. sort()/sort_desc()

    sort(v instant-vector) 函數對向量按元素的值進行升序排序
    sort_desc(v instant-vector) 函數對向量按元素的值進行降序排序
  5. 其餘函數

    1. abs() 絕對值
    2. absent() 若是傳遞給它的向量參數具備樣本數據,則返回空向量;若是傳遞的向量參數沒有樣本數據,則返回不帶度量指標名稱且帶有標籤的時間序列,且樣本值爲1。
    3. ceil() 全部元素的樣本值向上四捨五入到最接近的整數
    4. floor() 與 ceil() 函數相反,將 v 中全部元素的樣本值向下四捨五入到最接近的整數。
相關文章
相關標籤/搜索