一、環(huán)境搭建
1、安裝Node?exporter
1)?a穆壕、mac 安裝?brew install node_exporter
b待牵、啟動?node_exporter
node_exporter --web.listen-address=":9600" --web.telemetry-path="/node_metrics"
c、訪問啟動頁面
node_boot_time:系統(tǒng)啟動時間
node_cpu:系統(tǒng)CPU使用量
nodedisk*:磁盤IO
nodefilesystem*:文件系統(tǒng)用量
node_load1:系統(tǒng)負載
nodememeory*:內(nèi)存使用量
nodenetwork*:網(wǎng)絡(luò)帶寬
node_time:當(dāng)前系統(tǒng)時間
go_*:node exporter中g(shù)o相關(guān)指標
process_*:node exporter 自身進程相關(guān)運行指標
2) docker啟動
a喇勋、docker pull prom/node-exporter
b、docker run -d --name=node? -p 9100:9100 prom/node-exporter:latest
c偎行、驗證啟動結(jié)果
2川背、安裝Prometheus
1)?docker pull prom/prometheus
2)啟動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']? # 本機 node_exporter 的 endpoint 這里若配置成127.0.0.1 會出現(xiàn)gramtheus訪問node不通問題
b熄云、prometheus_rules.yml?
(base) mengfaniaodeMBP:prometheus mengfanxiao$ cat prometheus_rules.yml?
groups:
- name: example ? #報警規(guī)則的名字
? rules:
? # Alert for any instance that is unreachable for >5 minutes.
? - alert: InstanceDown ? ? #檢測job的狀態(tài),持續(xù)1分鐘metrices不能訪問會發(fā)給altermanager進行報警
? ? expr: up == 0
? ? for: 1m? ? #持續(xù)時間
? ? 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"? #報警的名字
? ? 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" ? # 這個意思是監(jiān)控該表達式查詢出來的值與一周前的值進行比較妙真,大于5且持續(xù)10m鐘就發(fā)送給altermanager進行報警
? ? for: 1m? #持續(xù)時間
? ? labels:
? ? ? serverity: warning
? ? annotations:
? ? ? summary: "{{ $labels.type }}趨勢增高"
? ? ? description: "機器:{{ $labels.host }} tomcat_id:{{ $labels.id }} 類型:{{ $labels.type }} 與一周前的差值大于5,當(dāng)前的差值為:{{ $value }}"? ? #自定義的報警內(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高級查詢來設(shè)定
?? ? for: 2m # 滿足告警條件持續(xù)時間多久后珍德,才會發(fā)送告警
?? ? labels: #標簽項
? ? ? team: node
?? ? annotations: # 解析項练般,詳細解釋告警信息
? ? ? 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高級查詢來設(shè)定
?? ? for: 2m # 滿足告警條件持續(xù)時間多久后锈候,才會發(fā)送告警
?? ? labels: #標簽項
? ? ? team: node
?? ? annotations: # 解析項薄料,詳細解釋告警信息
? ? ? summary: "{{$labels.instance}}: has been down"
? ? ? description: "{{$labels.instance}}: job {{$labels.job}} has been down "
? ? ? value: {{$value}}
3)
a、驗證是否啟動成功
b泵琳、prometheus的數(shù)據(jù)
c摄职、看配置的2個數(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是可以的
原因是:
容器具有單獨的網(wǎng)絡(luò)名稱空間,這意味著容器中的127.0.0.1在主機上不是127.0.0.1获列。
您應(yīng)該使用主機的IP或使用--network = host啟動容器谷市。
host模式下使用-p或者-P會出現(xiàn)WARNING: Published ports are discarded when using host network mode 當(dāng)你是host模式的時候,主機會自動把他上面的端口分配給容器击孩,這個時候使用-p或者-P是無用的迫悠。但是還是可以在Dockerfile中聲明EXPOSE端口?后續(xù)文章再詳談
3、安裝grafana
1)docker pull grafana/grafana
2)查看下載情況
docker images|grep grafana/grafana
3)創(chuàng)建一個grafana/grafana容器并啟動
docker run -d --name=grafana -p 3000:3000 grafana/grafana
4)訪問啟動頁面
默認賬號admin/admin
5)登陸了之后 配置數(shù)據(jù)源
數(shù)據(jù)源配置好之后 創(chuàng)建儀表盤用于顯示數(shù)據(jù)源的數(shù)據(jù)
選擇配置好的這個數(shù)據(jù)源
這里選擇具體的數(shù)據(jù)指標儀表盤中就會畫出對應(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?
# 全局配置項
global:?
? resolve_timeout: 5m #處理超時時間,默認為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'] # 報警分組依據(jù)
? group_wait: 10s # 最初即第一次等待多久時間發(fā)送一組警報的通知
? group_interval: 10s # 在發(fā)送新警報前的等待時間
? repeat_interval: 1m # 發(fā)送重復(fù)警報的周期 對于email配置中且改,此項不可以設(shè)置過低验烧,否則將會由于郵件發(fā)送太多頻繁,被smtp服務(wù)器拒絕
? receiver: 'email' # 發(fā)送警報的接收者的名稱又跛,以下receivers name的名稱
# 定義警報接收者信息
receivers:
? - name: 'email' # 警報
? ? email_configs: # 郵箱配置
? ? - to: '******@163.com'? # 接收警報的email配置
? ? ? html: '{{ template "test.html" . }}' # 設(shè)定郵箱的內(nèi)容模板
? ? ? headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題
? ? # 第三方開發(fā)配置
?? ? #webhook_configs: # webhook配置
? ? #- url: 'http://127.0.0.1:5001'
? ? #send_resolved: true
? ? #wechat_configs: # 企業(yè)微信報警配置
? ? #- 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è)定
# 一個inhibition規(guī)則是在與另一組匹配器匹配的警報存在的條件下碍拆,使匹配一組匹配器的警報失效的規(guī)則。兩個警報必須具有一組相同的標簽。?
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>報警項</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 }}
3) 驗證啟動結(jié)果
這里可看到 Prometheus sever 端發(fā)過來的 alerts端幼,并可做 alerts 搜索,分組弧满,靜音等操作
二婆跑、遺留問題下次解析
1、告警相關(guān)
a庭呜、promtheus的alert頁面沒有顯示告警配置?
b滑进、node正常運行的時候?promtheus的alert頁面沒有顯示
c、node停止運行時?promtheus的alert頁面沒有顯示且alertmanage沒有收到告警
d募谎、alertmanager還沒有配置receiver信息
2扶关、簡述各個組件是干什么的
3、簡述原理及應(yīng)用場景
a数冬、簡述原理
b节槐、應(yī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.reibang.com/p/7f586b482c44?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com