搭建監(jiān)控系統(tǒng) (Node exporter、Grafana、Prometheus、Alertmanager)

一、環(huán)境搭建

1、安裝Node?exporter

1)?a、mac 安裝?brew install node_exporter

b、啟動(dòng)?node_exporter

node_exporter --web.listen-address=":9600" --web.telemetry-path="/node_metrics"

c、訪問啟動(dòng)頁面

node_boot_time:系統(tǒng)啟動(dòng)時(shí)間

node_cpu:系統(tǒng)CPU使用量

nodedisk*:磁盤IO

nodefilesystem*:文件系統(tǒng)用量

node_load1:系統(tǒng)負(fù)載

nodememeory*:內(nèi)存使用量

nodenetwork*:網(wǎng)絡(luò)帶寬

node_time:當(dāng)前系統(tǒng)時(shí)間

go_*:node exporter中g(shù)o相關(guān)指標(biāo)

process_*:node exporter 自身進(jìn)程相關(guān)運(yùn)行指標(biāo)

2) docker啟動(dòng)

a、docker pull prom/node-exporter

b、docker run -d --name=node? -p 9100:9100 prom/node-exporter:latest

c、驗(yàn)證啟動(dòng)結(jié)果

2、安裝Prometheus

1)?docker pull prom/prometheus

2)啟動(dòng)prometheus

docker run -d -p 9090:9090 -v /tmp/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml ?prom/prometheus

a、prometheusyml

global: ? ? ? ? ? ? ? ? ?

? scrape_interval: ? ? 15s?


? external_labels:? ?

? ? monitor: 'codelab-monitor'


# Alertmanager配置

alerting:

?alertmanagers:

?- static_configs:

?? - targets: ["192.168.50.100:9093"] # 設(shè)定alertmanager和prometheus交互的接口,即alertmanager監(jiān)聽的ip地址和端口

rule_files:?

? - '/tmp/prometheus/prometheus_rules.yml'

? - '/tmp/prometheus/alertmanager/alertmanager_rules.yml'?

scrape_configs:?

? - job_name: 'prometheus'?


? ? # 覆蓋全局的 scrape_interval

? ? scrape_interval: 5s


? ? static_configs: ?

? ? ? - targets: ['192.168.50.100:9090']


? - job_name: 'node'


? ? scrape_interval: 10s

? ? metrics_path: "/metrics"


? ? static_configs:

? ? ? - targets: ['192.168.50.100:9100']? # 本機(jī) node_exporter 的 endpoint 這里若配置成127.0.0.1 會(huì)出現(xiàn)gramtheus訪問node不通問題

b、prometheus_rules.yml?

(base) mengfaniaodeMBP:prometheus mengfanxiao$ cat 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)容

c、alertmanager_rules.yml?

(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat 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}}

(base) mengfaniaodeMBP:alermanager mengfanxiao$ ls

alertmanager.ymlalertmanager_rules.ymlconfig.ymltemplate

(base) mengfaniaodeMBP:alermanager mengfanxiao$?

(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat 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}}

3)

a、驗(yàn)證是否啟動(dòng)成功

b、prometheus的數(shù)據(jù)

c、看配置的2個(gè)數(shù)據(jù)源是否成功

問題:

Get http://127.0.0.1:9100/metrics: dial tcp 127.0.0.1:9100: connect: connection refused

但telnet?127.0.0.1?9100是可以的

原因是:

容器具有單獨(dú)的網(wǎng)絡(luò)名稱空間,這意味著容器中的127.0.0.1在主機(jī)上不是127.0.0.1。

您應(yīng)該使用主機(jī)的IP或使用--network = host啟動(dòng)容器。

host模式下使用-p或者-P會(huì)出現(xiàn)WARNING: Published ports are discarded when using host network mode 當(dāng)你是host模式的時(shí)候,主機(jī)會(huì)自動(dòng)把他上面的端口分配給容器,這個(gè)時(shí)候使用-p或者-P是無用的。但是還是可以在Dockerfile中聲明EXPOSE端口?后續(xù)文章再詳談

3、安裝grafana

1)docker pull grafana/grafana

2)查看下載情況

docker images|grep grafana/grafana

3)創(chuàng)建一個(gè)grafana/grafana容器并啟動(dòng)

docker run -d --name=grafana -p 3000:3000 grafana/grafana

4)訪問啟動(dòng)頁面

默認(rèn)賬號(hào)admin/admin

5)登陸了之后 配置數(shù)據(jù)源

數(shù)據(jù)源配置好之后 創(chuàng)建儀表盤用于顯示數(shù)據(jù)源的數(shù)據(jù)

選擇配置好的這個(gè)數(shù)據(jù)源

這里選擇具體的數(shù)據(jù)指標(biāo)儀表盤中就會(huì)畫出對(duì)應(yīng)的折線

不同的儀表盤模式供選擇

4、安裝Alertmanager

1)?docker pull docker.io/prom/alertmanager:latest

2)?docker run -d -p 9093:9093 -v /tmp/prometheus/alermanager/alertmanager.yml:/etc/alertmanager/config.yml --name alertmanager docker.io/prom/alertmanager:latest

a、alertmanager.yml?

(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat 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']

b、test.tmpl?

(base) mengfaniaodeMBP:template mengfanxiao$ cat 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 }}

3) 驗(yàn)證啟動(dòng)結(jié)果

這里可看到 Prometheus sever 端發(fā)過來的 alerts,并可做 alerts 搜索,分組,靜音等操作

二、遺留問題下次解析

1、告警相關(guān)

a、promtheus的alert頁面沒有顯示告警配置?

b、node正常運(yùn)行的時(shí)候?promtheus的alert頁面沒有顯示

c、node停止運(yùn)行時(shí)?promtheus的alert頁面沒有顯示且alertmanage沒有收到告警

d、alertmanager還沒有配置receiver信息

2、簡(jiǎn)述各個(gè)組件是干什么的

3、簡(jiǎn)述原理及應(yīng)用場(chǎng)景

a、簡(jiǎn)述原理

b、應(yīng)用場(chǎng)景

4、docker host模式解析

參考資料

1、https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html

2、http://www.itdecent.cn/p/7f586b482c44?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容