端口分配說明:
node-exporter 9100
alertmanager 9093
prometheus 9090
Grafana 3000
1.首先安裝docker:
安裝教程如下:
http://www.reibang.com/p/e73ccf24c04d
安裝完成后, 使用 docker 分別拉取 node-exporter,prometheus,grafana最新版鏡像
sudo docker pull prom/node-exporter
sudo docker pull prom/prometheus
sudo docker pull grafana/grafana
sudo docker pull prom/alertmanager
2.運(yùn)行 node-exporter
指定端口為9100 , --net=host言疗,這樣該容器就會(huì)使用主機(jī)的網(wǎng)卡,而不會(huì)生成自己的虛擬網(wǎng)卡, Prometheus Server 可以直接與 Node Exporter 通信
sudo docker run -d -p 9100:9100 \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
--net=host \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
輸入 docker ps 查看 node-exporter 已經(jīng)載運(yùn)行了
打開瀏覽器 http://localhost:9100/metrics 查看到 metrics 輸出
3.運(yùn)行 Prometheus Server
在 home 目錄下新建文件夾來存放配置文件
cd /home/你的個(gè)人文件夾 (非root權(quán)限的)
mkdir prometheus
cd prometheus
新建 prometheus.yml 配置文件 :
# Prometheus全局配置項(xiàng)
global:
scrape_interval: 15s # 設(shè)定抓取數(shù)據(jù)的周期晴圾,默認(rèn)為1min
evaluation_interval: 15s # 設(shè)定更新rules文件的周期,默認(rèn)為1min
scrape_timeout: 15s # 設(shè)定抓取數(shù)據(jù)的超時(shí)時(shí)間噪奄,默認(rèn)為10s
external_labels: # 額外的屬性死姚,會(huì)添加到拉取得數(shù)據(jù)并存到數(shù)據(jù)庫中
monitor: 'codelab_monitor'
# Alertmanager配置
alerting:
alertmanagers:
- static_configs:
- targets: ["localhost:9093"] # 設(shè)定alertmanager和prometheus交互的接口,即alertmanager監(jiān)聽的ip地址和端口
# rule配置勤篮,首次讀取默認(rèn)加載都毒,之后根據(jù)evaluation_interval設(shè)定的周期加載
rule_files:
- "alertmanager_rules.yml"
- "prometheus_rules.yml"
# scape配置
scrape_configs:
- job_name: 'prometheus' # job_name默認(rèn)寫入timeseries的labels中,可以用于查詢使用
scrape_interval: 15s # 抓取周期碰缔,默認(rèn)采用global配置
static_configs: # 靜態(tài)配置
- targets: ['localhost:9100'] # prometheus所要抓取數(shù)據(jù)的地址账劲,即instance實(shí)例項(xiàng)
- job_name: 'example-random' #個(gè)人測(cè)試用接口
static_configs:
- targets: ['localhost:8080']
新建報(bào)警規(guī)則文件 alertmanager_rules.yml和 prometheus_rules.yml
alertmanager_rules.yml
groups:
- name: test-rules
rules:
- alert: InstanceDown # 告警名稱
expr: up == 0 # 告警的判定條件,參考Prometheus高級(jí)查詢來設(shè)定
for: 2m # 滿足告警條件持續(xù)時(shí)間多久后,才會(huì)發(fā)送告警
labels: #標(biāo)簽項(xiàng)
team: node
annotations: # 解析項(xiàng)瀑焦,詳細(xì)解釋告警信息
summary: "{{$labels.instance}}: has been down"
description: "{{$labels.instance}}: job {{$labels.job}} has been down "
value: {{$value}}
prometheus_rules.yml
groups:
- name: example #報(bào)警規(guī)則的名字
rules:
# Alert for any instance that is unreachable for >5 minutes.
- alert: InstanceDown #檢測(cè)job的狀態(tài)腌且,持續(xù)1分鐘metrices不能訪問會(huì)發(fā)給altermanager進(jìn)行報(bào)警
expr: up == 0
for: 1m #持續(xù)時(shí)間
labels:
serverity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
- alert: "it's has problem" #報(bào)警的名字
expr: "test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} - test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} offset 1w > 5" # 這個(gè)意思是監(jiān)控該表達(dá)式查詢出來的值與一周前的值進(jìn)行比較,大于5且持續(xù)10m鐘就發(fā)送給altermanager進(jìn)行報(bào)警
for: 1m #持續(xù)時(shí)間
labels:
serverity: warning
annotations:
summary: "{{ $labels.type }}趨勢(shì)增高"
description: "機(jī)器:{{ $labels.host }} tomcat_id:{{ $labels.id }} 類型:{{ $labels.type }} 與一周前的差值大于5,當(dāng)前的差值為:{{ $value }}" #自定義的報(bào)警內(nèi)容
運(yùn)行普羅米休斯:
sudo docker run -d -p 9090:9090 --name prometheus --net=host -v /home/你的文件夾/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
打開 http://localhost:9090/graph
運(yùn)行成功!
3.運(yùn)行 Alertmanager :
安裝golang:
sudo apt-get install golang-go
關(guān)于Alertmanager 查看: http://www.reibang.com/p/239b145e2acc
在當(dāng)前目錄下新建 alertmanager 存放Alertmanager的配置文件:
mkdir alertmanager
cd alertmanager
新建 alertmanager.yml 配置文件:
郵箱配置改為自己的.
# 全局配置項(xiàng)
global:
resolve_timeout: 5m #處理超時(shí)時(shí)間榛瓮,默認(rèn)為5min
smtp_smarthost: 'smtp.sina.com:25' # 郵箱smtp服務(wù)器代理
smtp_from: '******@sina.com' # 發(fā)送郵箱名稱
smtp_auth_username: '******@sina.com' # 郵箱名稱
smtp_auth_password: '******' # 郵箱密碼或授權(quán)碼
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企業(yè)微信地址
# 定義模板信心
templates:
- 'template/*.tmpl'
# 定義路由樹信息
route:
group_by: ['alertname'] # 報(bào)警分組依據(jù)
group_wait: 10s # 最初即第一次等待多久時(shí)間發(fā)送一組警報(bào)的通知
group_interval: 10s # 在發(fā)送新警報(bào)前的等待時(shí)間
repeat_interval: 1m # 發(fā)送重復(fù)警報(bào)的周期 對(duì)于email配置中铺董,此項(xiàng)不可以設(shè)置過低,否則將會(huì)由于郵件發(fā)送太多頻繁榆芦,被smtp服務(wù)器拒絕
receiver: 'email' # 發(fā)送警報(bào)的接收者的名稱柄粹,以下receivers name的名稱
# 定義警報(bào)接收者信息
receivers:
- name: 'email' # 警報(bào)
email_configs: # 郵箱配置
- to: '******@163.com' # 接收警報(bào)的email配置
html: '{{ template "test.html" . }}' # 設(shè)定郵箱的內(nèi)容模板
headers: { Subject: "[WARN] 報(bào)警郵件"} # 接收郵件的標(biāo)題
# 第三方開發(fā)配置
#webhook_configs: # webhook配置
#- url: 'http://127.0.0.1:5001'
#send_resolved: true
#wechat_configs: # 企業(yè)微信報(bào)警配置
#- send_resolved: true
#to_party: '1' # 接收組的id
#agent_id: '1000002' # (企業(yè)微信-->自定應(yīng)用-->AgentId)
#corp_id: '******' # 企業(yè)信息(我的企業(yè)-->CorpId[在底部])
#api_secret: '******' # 企業(yè)微信(企業(yè)微信-->自定應(yīng)用-->Secret)
#message: '{{ template "test_wechat.html" . }}' # 發(fā)送消息模板的設(shè)定
# 一個(gè)inhibition規(guī)則是在與另一組匹配器匹配的警報(bào)存在的條件下,使匹配一組匹配器的警報(bào)失效的規(guī)則匆绣。兩個(gè)警報(bào)必須具有一組相同的標(biāo)簽驻右。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
注:
1)repeat_interval配置項(xiàng),對(duì)于email來說崎淳,此項(xiàng)不可以設(shè)置過低堪夭,否則將會(huì)由于郵件發(fā)送太多頻繁,被smtp服務(wù)器拒絕
.tmpl模板的配置:
新建template文件夾存放模板:
mkdir template
cd template
新建發(fā)送郵件模板 test.tmpl:
{{ define "test.html" }}
<table border="1">
<tr>
<td>報(bào)警項(xiàng)</td>
<td>實(shí)例</td>
<td>報(bào)警閥值</td>
<td>開始時(shí)間</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項(xiàng)拣凹,表示prometheus里面的可選label項(xiàng)森爽。annotation項(xiàng)表示報(bào)警規(guī)則中定義的annotation項(xiàng)的內(nèi)容。
告警信息生命周期的3中狀態(tài)
1)inactive:表示當(dāng)前報(bào)警信息即不是firing狀態(tài)也不是pending狀態(tài)
2)pending:表示在設(shè)置的閾值時(shí)間范圍內(nèi)被激活的
3)firing:表示超過設(shè)置的閾值時(shí)間被激活的
運(yùn)行 alertmanager:
sudo docker run -d -p 9093:9093 --net=host -v /home/你的文件夾/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/config.yml --name alertmanager prom/alertmanager
打開 http://localhost:9093/#/alerts
運(yùn)行成功!
4.運(yùn)行 Grafana
sudo docker run -d -i -p 3000:3000 \
-e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
-e "GF_SECURITY_ADMIN_PASSWORD=admin" \
--net=host \
grafana/grafana
-e "GF_SECURITY_ADMIN_PASSWORD=secret 指定了 Grafana admin用戶密碼 admin嚣镜。
打開 http://localhost:3000
輸入用戶名 admin 密碼 admin
登錄后爬迟,Grafana 將引導(dǎo)我們配置 Data Source。
添加一個(gè)數(shù)據(jù)源菊匿,將Grafana和Prometheus關(guān)聯(lián)起來
回到首頁,接下來需要添加一個(gè) dashboard