Prometheus+Grafana+Altermanager搭建監控系統


基本概念

Prometheus

時間序列化數據庫,我的理解就是將數據打上標簽,以時間維度存儲。后面有機會在深入研究。

Prometheus架構如下:

Grafana

Prometheus中存儲的數據,通過Grafana進行圖形化呈現。

Alertmanager 

Alertmanager 主要用於接收 Prometheus 發送的告警信息,它支持豐富的告警通知渠道,而且很容易做到告警信息進行去重,降噪,分組,策略路由,是一款前衛的告警通知系統。

軟件安裝

一.Prometheus安裝

1.1 Prometheus安裝

1)普通安裝:

prometheus安裝包最新版本下載地址:

 https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.linux-amd64.tar.gz

解壓:tar txvf prometheus-2.3.2.linux-amd64.tar.gz

切換目錄:cd prometheus-2.3.2.linux-amd64
啟動:./prometheus --config.file=prometheus.yml

注:通過執行

./prometheus -h

可以查看具體得執行參數,參數后面可以查看默認得參數。如下圖所示。

2)docker 方式安裝(前提docker已經安裝完畢)

創建目錄和prometheus配置文件

mkdir /prometheus
vim /prometheus/prometheus.yml

注:對於prometheus.yml文件的配置,稍后詳細介紹。

拉取prometheus鏡像

docker pull prom/prometheus

啟動prometheus

docker run -d -p 9090:9090 --name prometheus -v /prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml

注:參數的簡要說明

a、-d選項啟動獨立模式下的prometheus容器,這意味着容器將在后台啟動,這種情況下只有stop docker才可以關閉prometheus,而不能執行ctrl+c

b、-p選擇指定端口號映射,通過訪問本機的9090端口,即可訪問prometheus容器的9090端口

c、--name指定容器的名稱

d、-v選項建立本機文件和docker內文件的映射

e、--config.file指定運行docker內prometheus的配置文件

1.2 prometheus配置文件的設定

prometheus的配置文件采用的是yaml文件,yaml文件書寫的要求如下:

大小寫敏感
使用縮進表示層級關系
縮進時不允許使用Tab鍵,只允許使用空格。
縮進的空格數目不重要,只要相同層級的元素左側對齊即可

prometheus.yml的樣例

復制代碼

# Prometheus全局配置項
global:
  scrape_interval:     15s # 設定抓取數據的周期,默認為1min
  evaluation_interval: 15s # 設定更新rules文件的周期,默認為1min
  scrape_timeout: 15s # 設定抓取數據的超時時間,默認為10s
  external_labels: # 額外的屬性,會添加到拉取得數據並存到數據庫中
   monitor: 'codelab_monitor'

# Alertmanager配置
alerting:
 alertmanagers:
 - static_configs:
   - targets: ["localhost:9093"] # 設定alertmanager和prometheus交互的接口,即alertmanager監聽的ip地址和端口
     
# rule配置,首次讀取默認加載,之后根據evaluation_interval設定的周期加載
rule_files:
 - "alertmanager_rules.yml"
 - "prometheus_rules.yml"

# scape配置
scrape_configs:
- job_name: 'prometheus' # job_name默認寫入timeseries的labels中,可以用於查詢使用
  scrape_interval: 15s # 抓取周期,默認采用global配置
  static_configs: # 靜態配置
  - targets: ['localdns:9090'] # prometheus所要抓取數據的地址,即instance實例項

- job_name: 'example-random'
  static_configs:
  - targets: ['localhost:8080']

1.3. 通過localhost:9090端口訪問,如下圖所示: 

安裝exporter
prometheus可以理解為一個數據庫+數據抓取工具,工具從各處抓來統一的數據,放入prometheus這一個時間序列數據庫中。那如何保證各處的數據格式是統一的呢?就是通過這個exporter。exporter也是用GO寫的程序,它開放一個http接口,對外提供格式化的數據。所以在不同的環境下,需要編寫不同的exporter。好在已經有很多寫好的exporter,我們可以直接使用(https://github.com/prometheus這里可以找到很多exporter)我們這里直接使用mysqld_exporter(prometheus.io/download/#mysqld_exporter)。當然也要下載對應系統的版本。

下載地址可參考:

window版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.windows-amd64.tar.gz

Linux版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz

解壓后的內容類似如下圖:

這里的mysqld_exporter是啟動文件,.my.cnf是配置文件。想要正確的導出mysql的狀態數據,必須在配置文件中正確的配置mysql的連接信息。我的配置如下: 

配置好了,就可以啟動了。成功如下所示:

通過localhost:9104,就可以看到exporter導出的數據: 

 

 

在Prometheus中配置mysqld_exporter

exporter啟動了,需要在Prometheus中正確的配置。修改prometheus目錄中的prometheus.yml,增加配置如下:

重啟prometheus,點擊導航欄中的status->targets可以看到,mysql的exporter已經集成。 

二.安裝Grafana

2.1.安裝Grafana

下載Grafana安裝包:https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.3.linux-amd64.tar.gz

tar zxvf grafana-5.2.3.linux-amd64.tar.gz cd grafana-5.2.3.linux-amd64.tar.gz bin/grafana-server web

Grafana默認服務端口號為3000,通過瀏覽器對Grafana進行訪問。

http://localdns:3000

默認登錄名密碼為"admin/admin"。

 2.2 配置數據源

首先,你要添加一個數據源,將Grafana和Prometheus關聯起來。點擊Add data source,如下填寫數據保存即可: 

操作步驟如下:

1 在左側工具欄中,點擊"Configuration"菜單。
2 點擊"Data Sources"。
3 點擊"Add data source"。
4 數據源Type選擇“Prometheus”。
5 設置Prometheus服務訪問地址(例如:http://localhost:9090)。
6 調整其他想要的設置(例如:關閉代理訪問)。
7 點擊“Add”按鈕,保存這個新數據源。

看到如下的提示,說明你的prometheus工作是正常的:

2.3 配置dashboard

接着回到首頁,你需要添加一個dashboard,如下圖進入dashboard導入頁面:

這里你需要從https://github.com/percona/grafana-dashboards項目中的dashboards下載MySQL_Overview.json,然后通過上面頁面的Upload .json File按鈕上傳上去,導入即可

下載地址:https://github.com/percona/grafana-dashboards/blob/master/dashboards/MySQL_Overview.json

導入成功后,你將看到監控頁面。

 三、Alertmanager(email報警)

Alertmanager簡介及機制
Alertmanager處理由類似Prometheus服務器等客戶端發來的警報,之后需要刪除重復、分組,並將它們通過路由發送到正確的接收器,比如電子郵件、Slack等。Alertmanager還支持沉默和警報抑制的機制。

分組
分組是指當出現問題時,Alertmanager會收到一個單一的通知,而當系統宕機時,很有可能成百上千的警報會同時生成,這種機制在較大的中斷中特別有用。

例如,當數十或數百個服務的實例在運行,網絡發生故障時,有可能服務實例的一半不可達數據庫。在告警規則中配置為每一個服務實例都發送警報的話,那么結果是數百警報被發送至Alertmanager。

但是作為用戶只想看到單一的報警頁面,同時仍然能夠清楚的看到哪些實例受到影響,因此,人們通過配置Alertmanager將警報分組打包,並發送一個相對看起來緊湊的通知。

分組警報、警報時間,以及接收警報的receiver是在配置文件中通過路由樹配置的。

抑制
抑制是指當警報發出后,停止重復發送由此警報引發其他錯誤的警報的機制。

例如,當警報被觸發,通知整個集群不可達,可以配置Alertmanager忽略由該警報觸發而產生的所有其他警報,這可以防止通知數百或數千與此問題不相關的其他警報。

抑制機制可以通過Alertmanager的配置文件來配置。

沉默
沉默是一種簡單的特定時間靜音提醒的機制。一種沉默是通過匹配器來配置,就像路由樹一樣。傳入的警報會匹配RE,如果匹配,將不會為此警報發送通知。

沉默機制可以通過Alertmanager的Web頁面進行配置。

3.1 Alertmanager安裝

下載地址:https://github.com/prometheus/alertmanager/releases/download/v0.15.3/alertmanager-0.15.3.linux-amd64.tar.gz

tar -zxvf alertmanager-0.15.3.linux-amd64.tar.gz

cd alertmanager-0.15.3.linux-amd64

執行命令 mv simple.yml alertmanager.yml,並修改 alertmanager.yml 配置:

啟動 ./alertmanager-config.file= alertmanager.yml #默認配置項為alertmanager.yml

 注:alertmanager.yml配置文件,默認是不存在的,需要新建。

3.2 alertmanager.yml的配置

# 全局配置項
global: 
  resolve_timeout: 5m #處理超時時間,默認為5min
  smtp_smarthost: 'smtp.sina.com:25' # 郵箱smtp服務器代理
  smtp_from: '******@sina.com' # 發送郵箱名稱
  smtp_auth_username: '******@sina.com' # 郵箱名稱
  smtp_auth_password: '******' # 郵箱密碼或授權碼
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企業微信地址


# 定義模板信心
templates:
  - 'template/*.tmpl'

# 定義路由樹信息
route:
  group_by: ['alertname'] # 報警分組依據
  group_wait: 10s # 最初即第一次等待多久時間發送一組警報的通知
  group_interval: 10s # 在發送新警報前的等待時間
  repeat_interval: 1m # 發送重復警報的周期 對於email配置中,此項不可以設置過低,否則將會由於郵件發送太多頻繁,被smtp服務器拒絕
  receiver: 'email' # 發送警報的接收者的名稱,以下receivers name的名稱

# 定義警報接收者信息
receivers:
  - name: 'email' # 警報
    email_configs: # 郵箱配置
    - to: '******@163.com'  # 接收警報的email配置
      html: '{{ template "test.html" . }}' # 設定郵箱的內容模板
      headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題
    webhook_configs: # webhook配置
    - url: 'http://127.0.0.1:5001'
    send_resolved: true
    wechat_configs: # 企業微信報警配置
    - send_resolved: true
      to_party: '1' # 接收組的id
      agent_id: '1000002' # (企業微信-->自定應用-->AgentId)
      corp_id: '******' # 企業信息(我的企業-->CorpId[在底部])
      api_secret: '******' # 企業微信(企業微信-->自定應用-->Secret)
      message: '{{ template "test_wechat.html" . }}' # 發送消息模板的設定
# 一個inhibition規則是在與另一組匹配器匹配的警報存在的條件下,使匹配一組匹配器的警報失效的規則。兩個警報必須具有一組相同的標簽。 
inhibit_rules: 
  - source_match: 
     severity: 'critical' 
    target_match: 
     severity: 'warning' 
    equal: ['alertname', 'dev', 'instance']

注:

1)repeat_interval配置項,對於email來說,此項不可以設置過低,否則將會由於郵件發送太多頻繁,被smtp服務器拒絕

2)企業微信注冊地址:https://work.weixin.qq.com

上述配置的email、webhook和wechat三種報警方式。目前Alertmanager所有的報警方式有以下幾個方面:

復制代碼

email_config
hipchat_config
pagerduty_config
pushover_config
slack_config
opsgenie_config
victorops_config

復制代碼

3.3.tmpl模板的配置

1)test.tmpl

復制代碼

{{ define "test.html" }}
<table border="1">
        <tr>
                <td>報警項</td>
                <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 "value" }}</td>
                        <td>{{ $alert.StartsAt }}</td>
                </tr>
        {{ end }}
</table>
{{ end }}

復制代碼

注:上述Labels項,表示prometheus里面的可選label項。annotation項表示報警規則中定義的annotation項的內容。

2)test_wechat.tmpl

復制代碼

{{ define "cdn_live_wechat.html" }}
  {{ range $i, $alert := .Alerts.Firing }}
    [報警項]:{{ index $alert.Labels "alertname" }}
    [實例]:{{ index $alert.Labels "instance" }}
    [報警閥值]:{{ index $alert.Annotations "value" }}
    [開始時間]:{{ $alert.StartsAt }}
  {{ end }}
{{ end }}

復制代碼

注:此處range遍歷項與email模板中略有不同,只遍歷當前沒有處理的報警(Firing)。此項如果不設置,則在Alert中已經Resolved的報警項,也會被發送到企業微信。

3.4、在Prometheus模塊定義告警規則

alertmanager_rules.yml樣例配置文件(與prometheus同目錄下)

復制代碼

groups:
 - name: test-rules
   rules:
   - alert: InstanceDown # 告警名稱
     expr: up == 0 # 告警的判定條件,參考Prometheus高級查詢來設定
     for: 2m # 滿足告警條件持續時間多久后,才會發送告警
     labels: #標簽項
      team: node
     annotations: # 解析項,詳細解釋告警信息
      summary: "{{$labels.instance}}: has been down"
      description: "{{$labels.instance}}: job {{$labels.job}} has been down "
      value: {{$value}}

groups:

- name: test-rule
  rules:
  - alert: "內存報警"
    expr: 100 - ((node_memory_MemAvailable * 100) / node_memory_MemTotal) > 10
    for: 1s
    labels:
       severity: warning
    annotations:
       summary: "服務名:{{$labels.alertname}}"
       description: "業務500報警: {{ $value }}"
       value: "{{ $value }}"


- name: test-rule2
  rules:
  - alert: "內存報警"
    expr: 100 - ((node_memory_MemAvailable * 100) / node_memory_MemTotal) > 40
    for: 1s
    labels:
       severity: test
    annotations:
       summary: "服務名:{{$labels.alertname}}"
       description: "業務500報警: {{ $value }}"
       value: "{{ $value }}"

3.5、告警信息生命周期的3中狀態

1)inactive:表示當前報警信息即不是firing狀態也不是pending狀態

2)pending:表示在設置的閾值時間范圍內被激活的

3)firing:表示超過設置的閾值時間被激活的

3.6、結果展示

啟動prometheus和alertmanager,滿足報警條件后,就可以收到報警郵件了。

1. 瀏覽器界面化告警展示

在瀏覽器輸入alertmanager的配置地址,即可查看所監控到的報警信息

http://localdns:9093/#/alerts

如圖所示:

2 . 郵箱告警展示

   1)原始郵箱告警展示

 2)模板郵箱告警展示

 3、企業微信告警展示

四. Prometheus與其他模塊對接

  由於Prometheus靈活的接口配置和數據獲取方式,可以很靈活的與其他模塊進行對接,用於實時監控多個模塊。

包括以下常用模塊:

1.node_exporter

用戶監控節點虛擬機的指標信息。

下載地址:https://github.com/prometheus/node_exporter/releases/download/v0.17.0-rc.0/node_exporter-0.17.0-rc.0.linux-386.tar.gz

2.jmx_exporter

下載地址:https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

3.elasticsearch_exporter

下載地址:https://github.com/justwatchcom/elasticsearch_exporter/releases/download/v1.0.4rc1/elasticsearch_exporter-1.0.4rc1.linux-386.tar.gz

4.redis_exporter

下載地址:https://github.com/oliver006/redis_exporter/releases/download/v0.22.0/redis_exporter-v0.22.0.linux-386.tar.gz

5.mysqld_exporter

下載地址;https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-386.tar.gz

6.postgres_exporter

下載地址:https://github.com/wrouesnel/postgres_exporter/releases/download/v0.4.7/postgres_exporter_v0.4.7_linux-amd64.tar.gz

7.mongodb_exporter

下載地址:https://github.com/dcu/mongodb_exporter/releases/download/v1.0.0/mongodb_exporter-linux-amd64

8.statsd_exporter

下載地址:https://github.com/prometheus/statsd_exporter/releases/download/v0.8.0/statsd_exporter-0.8.0.linux-amd64.tar.gz

9.mesos_exporter

下載地址:https://github.com/mesos/mesos_exporter/releases/download/v1.1.1/mesos_exporter-1.1.1.linux-arm64.tar.gz

10.apache_exporter

下載地址:https://github.com/Lusitaniae/apache_exporter/releases/download/v0.5.0/apache_exporter-0.5.0.linux-amd64.tar.gz

11.hadoop_exporter

下載地址:https://github.com/wyukawa/hadoop_exporter

12.logstash_exporter

下載地址:https://github.com/BonnierNews/logstash_exporter/archive/v0.1.2.tar.gz

13.sql_exporter

下載地址:https://github.com/justwatchcom/sql_exporter/releases/download/v0.2.0/sql_exporter-0.2.0.linux-amd64.tar.gz

14.oracle_exporter

下載地址:https://github.com/iamseth/oracledb_exporter/releases/download/0.0.8/oracledb_exporter.linux-amd64

15.zookeeper_exporter

下載地址1:https://github.com/carlpett/zookeeper_exporter/releases/download/v1.0.1/zookeeper_exporter-1.0.1.linux-amd64.tar.gz

下載地址2:https://github.com/carlpett/zookeeper_exporter/releases/download/v1.0.2/zookeeper_exporter

16.influxdb_exporter

下載地址:https://github.com/prometheus/influxdb_exporter/releases/download/v0.1.0/influxdb_exporter-0.1.0.linux-amd64.tar.gz

17.zabbix_exporter

下載地址:https://github.com/MyBook/zabbix-exporter/archive/1.0.2.tar.gz

18.opentsdb_exporter

下載地址:https://github.com/cloudflare/opentsdb_exporter/archive/0.0.3.tar.gz

19.grafana_exporter

下載地址:https://github.com/frodenas/grafana_exporter/releases/download/v0.1.0/grafana_exporter-0.1.0.linux-amd64.tar.gz

20.json_exporter

下載地址:https://github.com/sciffer/json_exporter

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM