架構圖html
prometheus server組件java
數據採集和存儲時序數據node
client libraries組件linux
用於採集應用程序代碼庫git
pushgateway組件github
支持短時間jobs,由job推送到Pushgateway,再經過Pushgateway暴露給Prometheusweb
exporters組件正則表達式
用於暴露第三方服務採集指標spring
alertmanager組件shell
對prometheus告警進行分組、抑制、靜默等功能
服務發現
經過服務發現,自動發現監控目標
其餘組件
grafana、api clients
指標名稱和標籤
每一條時間序列由指標名稱(Metrics Name)以及一組標籤(鍵值對)惟一標識。其中指標的名稱(metric name)能夠反映被監控樣本的含義 經過使用標籤,Prometheus 開啓了強大的多維數據模型:對於相同的指標名稱,經過不一樣標籤列表的集合,會造成特定的度量維度實例。該查詢語言在這些指標和標籤列表的基礎上進行過濾和聚合。改變任何度量指標上的任何標籤值(包括添加或刪除指標),都會建立新的時間序列。
樣本
在時間序列中的每個點稱爲一個樣本(sample),樣本由如下三部分組成: 指標(metric):指標名稱和描述當前樣本特徵的 labelsets; 時間戳(timestamp):一個精確到毫秒的時間戳; 樣本值(value): 一個 folat64 的浮點型數據表示當前樣本的值。
表達方式
# 經過以下表達方式表示指定指標名稱和指定標籤集合的時間序列: <metric name>{<label name>=<label value>, ...} # 示例 api_http_requests_total{method="POST", handler="/messages"}
Counter計數器
Counter 類型表明一種樣本數據單調遞增的指標,即只增不減,除非監控系統發生了重置。
Guage儀表盤
Guage 類型表明一種樣本數據能夠任意變化的指標,便可增可減。guage 一般用於像溫度或者內存使用率這種指標數據,也能夠表示能隨時增長或減小的「總數」,例如:當前併發請求的數量。
Histogram直方圖
Histogram 在一段時間範圍內對數據進行採樣(一般是請求持續時間或響應大小等),並將其計入可配置的存儲桶(bucket)中,後續可經過指定區間篩選樣本,也能夠統計樣本總數,最後通常將數據展現爲直方圖。 Histogram 類型的樣本會提供三種指標: 1. 樣本的值分佈在 bucket 中的數量,命名爲 <basename>_bucket{le="<上邊界>"}。(指標值小於等於上邊界的全部樣本數量) 2. 全部樣本值的大小總和,命名爲 <basename>_sum。 3. 樣本總數,命名爲 <basename>_count。值和 <basename>_bucket{le="+Inf"} 相同。
Summary摘要
與 Histogram 類型相似,用於表示一段時間內的數據採樣結果(一般是請求持續時間或響應大小等),但它直接存儲了分位數(經過客戶端計算,而後展現出來),而不是經過區間來計算。 Summary 類型的樣本也會提供三種指標: 1. 樣本值的分位數分佈狀況,命名爲 <basename>{quantile="<φ>"}。 2. 全部樣本值的大小總和,命名爲 <basename>_sum。 3. 樣本總數,命名爲 <basename>_count。
下載
# https://prometheus.io/download/ wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz
解壓
tar -zxvf prometheus-2.23.0.linux-amd64.tar.gz -C /opt/ && mv /opt/prometheus-2.23.0.linux-amd64 /opt/prometheus
建立用戶、目錄
# 建立用戶 useradd prometheus -s /sbin/nologin -M # 數據目錄 mkdir -pv /data/prometheus # 受權 chown -R prometheus.prometheus /data/prometheus/
配置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
參數說明
# 指定配置文件地址 --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=
啓動
# 啓動 systemctl start prometheus # 狀態 systemctl status prometheus # 中止 systemctl stop prometheus # 重啓 systemctl restart prometheus # 重載 systemctl reload prometheus # 開機自啓動 systemctl enable prometheus # 關閉自啓動 systemctl disable prometheus
訪問
# web訪問地址 http://localhost:9090 # metrics訪問地址 http://localhost:9090/metrics
下載
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
解壓
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
建立用戶和目錄
# 建立用戶 useradd node_exporter -s /sbin/nologin -M # 數據目錄 mkdir -pv /data/node_exporter # 受權 chown -R node_exporter.node_exporter /data/node_exporter/
配置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
啓動服務
# 啓動 systemctl start node_exporter # 狀態 systemctl status node_exporter # 中止 systemctl stop node_exporter # 重啓 systemctl restart node_exporter # 開機自啓動 systemctl enable node_exporter # 關閉自啓動 systemctl disable node_exporter
訪問
# metrics訪問 http://localhost:9100/metrics
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
驗證
# 訪問targets,查看job狀態是否"OK" http://localhost:9090/targets # 查詢收集數據 http://localhost:9090/graph # 查詢條件 # 查看系統信息 node_uname_info
下載
wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.3.6-1.x86_64.rpm
安裝
yum localinstall grafana-7.3.6-1.x86_64.rpm -y
啓動服務
# 啓動 systemctl start grafana-server # 開機自啓動 systemctl enable grafana-server
配置
#訪問地址 默認用戶:密碼(admin:admin) http://localhost:3000 # 新增datasources,配置Prometheus # HTTP中url http://localhost:9090
儀表盤
# 導入node_exporter儀表盤 https://grafana.com/grafana/dashboards/8919 # dashboards => Manage => import => 8919 => Load
下載
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
解壓
tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /opt/ && mv /opt/alertmanager-0.21.0.linux-amd64 /opt/alertmanager
建立用戶和目錄
# 建立用戶 useradd alertmanager -s /sbin/nologin -M # 數據目錄 mkdir -pv /data/alertmanager # 受權 chown -R alertmanager.alertmanager /data/alertmanager/
配置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
參數說明
# 配置文件路徑 --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/
啓動服務
# 啓動 systemctl start alertmanager # 開機自啓動 systemctl enable alertmanager
prometheus集成alertmanager
# 修改prometheus.yml vim /opt/prometheus/prometheus.yml alerting: alertmanagers: - static_configs: - targets: - localhost:9093 # 重載prometheus服務 systemctl reload prometheus
訪問
# 訪問地址 http://localhost:9093 # 告警頁 http://localhost:9093/#/alerts # 靜默頁 http://localhost:9093/#/silences # 狀態頁 http://localhost:9093/#/status
下載
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
解壓
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
建立用戶
# 建立用戶 useradd webhook-dingtalk -s /sbin/nologin -M
配置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
建立釘釘機器人
#【電腦釘釘 】-【羣聊】-【羣設置】-【智能羣助手】-【添加更多】-【添加機器人】-【自定義】-【添加】 # webhook地址 https://oapi.dingtalk.com/robot/send?access_token=xxx # 安全設置 # 例如:自定義關鍵字 告警
配置文件
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
配置模板
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 }}
啓動服務
# 啓動 systemctl start prometheus-webhook-dingtalk # 開機自啓動 systemctl enable prometheus-webhook-dingtalk # 狀態 systemctl status prometheus-webhook-dingtalk
集成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
開啓規則配置
# 修改配置文件 # vim /opt/prometheus/prometheus.yml rule_files: - "rules/*.yml" # 建立規則目錄 mkdir -pv /opt/prometheus/rules
配置規則文件
# 新增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
測試驗證告警
# 中止/啓動目標服務 systemctl stop node_exporter systemctl start node_exporter # 驗證alerts狀態 http://localhost:9090/alerts # 查看釘釘羣告警/恢復消息
示例
global: scrape_interval: 15s scrape_timeout: 10s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: - localhost:9093 rule_files: - "rules/*.yml"
配置說明
# 抓取目標的頻率,默認1m scrape_interval # 抓取請求超時時間,默認10s scrape_timeout # 評估告警規則的頻率,默認1m evaluation_interval # alertmanagers組件地址 alerting: alert_relabel_configs: [ - <relabel_config> ... ] alertmanagers: [ - <alertmanager_config> ... ] # 規則文件 rule_files: [ - <filepath_glob> ... ]
示例
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
基於static_configs靜態配置
# 靜態配置指定的目標 targets: [ - '<host>' ] # 自定義標籤 labels: [ <labelname>: <labelvalue> ... ]
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
基於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
基於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 示例從新標記以僅獲取應用程序所需的單個端口
示例
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)"
groups
groups: [ - <rule_group> ]
rule_group
# 組名,值惟一 name: <string> # 評估規則的頻率,默認爲全局配置evaluation_interval的值 [ interval: <duration> | default = global.evaluation_interval ] rules: [ - <rule> ... ]
rule
# 告警名 alert: <string> # PromQL表達式 # 掛起/觸發告警 expr: <string> # 持續時間後觸發告警 [ for: <duration> | default = 0s ] # 標籤 labels: [ <labelname>: <tmpl_string> ] # 備註 annotations: [ <labelname>: <tmpl_string> ]
示例
# 遠程存儲 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"
remote_write
# 遠程地址 url: <string> # 其餘參數參考地址 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
remote_read
# 遠程地址 url: <string> # 其餘參數參考地址 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
示例
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']
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 ]
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 }}
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> ... ]
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>, ... ]
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 ]
inhibit_rules抑制規則配置
# 告警在匹配器中將被靜默 target_match: [ <labelname>: <labelvalue>, ... ] # 告警在正則表達式匹配器中將被靜默 target_match_re: [ <labelname>: <regex>, ... ] # 必須有一組等於匹配器,抑制才能生效 source_match: [ <labelname>: <labelvalue>, ... ] # 必須知足一組正則表達式匹配器,抑制纔是生效 source_match_re: [ <labelname>: <regex>, ... ] # 只有源和目標中的值必須相等的標籤,抑制才能生效 [ equal: '[' <labelname>, ... ']' ]
介紹
Prometheus 提供了一種功能表達式語言 PromQL,容許用戶實時選擇和匯聚時間序列數據。表達式的結果能夠在瀏覽器中顯示爲圖形,也能夠顯示爲表格數據,或者由外部系統經過 HTTP API 調用。
示例
http_requests_total http_requests_total{job="apiserver", handler="/api/comments"} http_requests_total{job="apiserver", handler="/api/comments"}[5m]
瞬時向量
一組時間序列,每一個時間序列包含單個樣本,它們共享相同的時間戳。
區間向量
一組時間序列,每一個時間序列包含一段時間範圍內的樣本數據。
標量
一個浮點型的數據值。
字符串
一個簡單的字符串值。
字符串
1. 字符串能夠用單引號、雙引號或反引號指定爲文字常量。 2. PromQL 遵循與 Go 相同的轉義規則。在單引號或雙引號中,用反斜槓來表示轉義序列,後面能夠跟 a, b, f, n, r, t, v 或 \。特殊字符可使用八進制(\nnn)或者十六進制(\xnn,\unnnn 和 \Unnnnnnnn)。 3. 與 Go 不一樣,Prometheus 不會對反引號內的換行符進行轉義。
標量
標量浮點值能夠字面上寫成 [-](digits)[.(digits)] 的形式。
瞬時向量過濾器
1. 瞬時向量過濾器容許在指定的時間戳內選擇一組時間序列和每一個時間序列的單個樣本值。 2. 能夠經過向花括號({})裏附加一組標籤來進一步過濾時間序列。 3. PromQL 還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配和正則匹配。總共有如下幾種標籤匹配運算符: = 徹底相同 != 不相同 =~ 相匹配 !~ 不匹配 4. 沒有指定標籤的標籤過濾器會選擇該指標名稱的全部時間序列。 5. 全部的 PromQL 表達式必須至少包含一個指標名稱,或者一個不會匹配到空字符串的標籤({job=~".*"})過濾器。
區間向量過濾器
1. 區間向量與瞬時向量的工做方式相似,惟一的差別在於在區間向量表達式中咱們須要定義時間選擇的範圍,時間範圍經過時間範圍選擇器 [] 進行定義,以指定應爲每一個返回的區間向量樣本值中提取多長的時間範圍。 2. 時間範圍經過數字來表示,單位可使用如下其中之一的時間單位: s 秒 m 分鐘 h 小時 d 天 w 周 y 年 3. 示例 # 5分鐘內http_requests_total指標,job標籤值爲prometheus的全部時間序列 http_requests_total{job="prometheus"}[5m]
時間位移操做
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. 算數運算 + - * / % ^ 等 2. 布爾運算 == != > < >= <= 3. 邏輯運算 and or unless 4. 運算符優先級,從高到底: ^, *, /, %, + , - , ==, !=, <=, <, >=, > , and, unless , or
匹配模式
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>
聚合操做
sum (求和) min (最小值) max (最大值) avg (平均值) stddev (標準差) stdvar (標準差別) count (計數) count_values (對 value 進行計數) bottomk (樣本值最小的 k 個元素) topk (樣本值最大的k個元素) quantile (分佈統計)
irate()
1. 用於計算區間向量的增加率。可是其反應出的是瞬時增加率。irate 函數是經過區間向量中最後兩個兩本數據來計算區間向量的增加速率,它會在單調性發生變化時(如因爲採樣目標重啓引發的計數器復位)自動中斷。 2. 示例 # 區間向量中每一個時間序列過去 5 分鐘內最後兩個樣本數據的 HTTP 請求數的增加率 irate(http_requests_total{job="api-server"}[5m])
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")
rate()
1. rate(v range-vector) 函數能夠直接計算區間向量 v 在時間窗口內平均增加速率,它會在單調性發生變化時(如因爲採樣目標重啓引發的計數器復位)自動中斷。該函數的返回結果不帶有度量指標,只有標籤列表。 2. rate() 函數返回值類型只能用計數器,在長期趨勢分析或者告警中推薦使用這個函數。 3. 示例 # 區間向量中每一個時間序列過去 5 分鐘內 HTTP 請求數的每秒增加率 rate(http_requests_total[5m])
sort()/sort_desc()
sort(v instant-vector) 函數對向量按元素的值進行升序排序 sort_desc(v instant-vector) 函數對向量按元素的值進行降序排序
其餘函數
1. abs() 絕對值 2. absent() 若是傳遞給它的向量參數具備樣本數據,則返回空向量;若是傳遞的向量參數沒有樣本數據,則返回不帶度量指標名稱且帶有標籤的時間序列,且樣本值爲1。 3. ceil() 全部元素的樣本值向上四捨五入到最接近的整數 4. floor() 與 ceil() 函數相反,將 v 中全部元素的樣本值向下四捨五入到最接近的整數。