一、prometheus基本架構
Prometheus 是一套開源的系統監控報警框架。它啟發於 Google 的 borgmon 監控系統,由工作在 SoundCloud 的 google 前員工在 2012 年創建,作為社區開源項目進行開發,並於 2015 年正式發布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成為受歡迎度僅次於 Kubernetes 的項目。作為新一代的監控框架,Prometheus 具有以下特點:
- 多維數據模型(時序列數據由metric名和一組key/value組成)
- 在多維度上靈活的查詢語言(PromQl)
- 不依賴分布式存儲,單主節點工作.
- 通過基於HTTP的pull方式采集時序數據
- 可以通過push gateway進行時序列數據推送(pushing)
- 可以通過服務發現或者靜態配置去獲取要采集的目標服務器
- 多種可視化圖表及儀表盤支持
- Prometheus server 主要負責數據采集和存儲,定期從靜態配置的 targets 或者服務發現(主要是DNS、consul、k8s、mesos等)的 targets 拉取數據,提供PromQL查詢語言的支持
- 客戶端sdk 官方提供的客戶端類庫有go、java、scala、python、ruby,其他還有很多第三方開發的類庫,支持nodejs、php、erlang等
- Push Gateway 支持臨時性Job主動推送指標的中間網關
-
exporters 支持其他數據源的指標導入到Prometheus,支持數據庫、硬件、消息中間件、存儲系統、http服務器、jmx等
-
alertmanager 實驗性組件、用來進行報警
- 主要通過grafana來實現webui展示
二、手動實驗
環境准備:172.16.101.250、172.16.101.251 都已安裝了docker和docker-compose服務,需要機器連網,要不然docker鏡像不能自動下載。
部署規划:
機器 | 部署服務 |
172.16.101.250 | prometheus cAdvisor Node Exporter grafana |
172.16.101.251 | cAdvisor Node Exporter |
1、在2台機器上部署Node Exporter和cAdvisor
-
Node Exporter,負責收集 host 硬件和操作系統數據。它將以容器方式運行在所有 host 上。
-
cAdvisor,負責收集容器數據。它將以容器方式運行在所有 host 上。
1)新建 /opt/container-monitor/nodeexporter-cadvisor/docker-compose.yml
version: '2.1' services: node-exporter: image: prom/node-exporter container_name: prometheus_node-exporter restart: always logging: driver: "json-file" options: max-size: "10m" max-file: "5" ports: - 9100:9100 volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/devicemapper|rootfs/var/lib/docker/aufs)($$|/)' cadvisor: image: google/cadvisor container_name: prometheus_cadvisor restart: always logging: driver: "json-file" options: max-size: "10m" max-file: "5" ports: - 9101:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro
2) 運行容器
cd /opt/container-monitor/nodeexporter-cadvisor
docker-compose up -d
瀏覽器輸入:http://172.16.101.250:9100/metrics 可以看到node exporter采集的host的數據
瀏覽器輸入:http://172.16.101.250:9101/metrics 可以看到cAdvisor采集的container的數據
2、只在172.16.101.250機器上部署alertmanager
Alertmanager處理由類似Prometheus服務器等客戶端發來的警報,之后需要刪除重復、分組,並將它們通過路由發送到正確的接收器,比如電子郵件、Slack等。Alertmanager還支持沉默和警報抑制的機制。
1)新建 /opt/container-monitor/alertmanager/config.yml
# 全局配置項 global: resolve_timeout: 5m #處理超時時間,默認為5min smtp_smarthost: 'smtp.163.com:25' # 郵箱smtp服務器代理 smtp_from: 'xxx@163.com' # 發送郵箱名稱 smtp_auth_username: 'xxx@163.com' # 郵箱名稱 smtp_auth_password: 'xxx' #郵箱密碼 # 定義模板信心 templates: - '/etc/alertmanager/templates/*.html' # 定義路由樹信息 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: 'xxxx@qq.com' # 接收警報的email配置 html: '{{ template "test.html" . }}' # 設定郵箱的內容模板 headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題 webhook_configs: # webhook配置 - url: 'http://127.0.0.1:5001'
2)新建 /opt/container-monitor/alertmanager/docker-compose.yml
version: '2.1' services: alertmanager: image: prom/alertmanager container_name: alertmanager restart: always network_mode: "host" ports: - 9093:9093 logging: driver: "json-file" options: max-size: "10m" max-file: "5" volumes: - ./config.yml:/etc/alertmanager/config.yml - ./test.html:/etc/alertmanager/templates/test.html command: - '--config.file=/etc/alertmanager/config.yml' - '--storage.path=/alertmanager' - '--log.level=debug'
3)新建 /opt/container-monitor/alertmanager/test.html
{{ 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 "description" }}</td> <td>{{ $alert.StartsAt }}</td> </tr> {{ end }} </table> {{ end }}
test.html是用來展示,告警消息的界面,展示在接收的郵箱上。
4)運行alertmanager容器
cd /opt/container-monitor/alertmanager
docker-compose up -d
3、只在172.16.101.250機器上部署prometheus
1)新建 /opt/container-monitor/prometheus/running-rule.yml ,該配置文件是prometheus中觸發告警的配置文件
groups: - name: test-rule rules: - alert: "服務運行" expr: container_tasks_state{name="mysql",state="running"} == 0 for: 1m labels: severity: warning annotations: summary: "服務名:{{$labels.alertname}}" description: "容器: {{ $labels.name }} 處於運行中"
2)新建 /opt/container-monitor/prometheus/prometheus.yml,prometheus的主配置文件
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. external_labels: monitor: 'codelab-monitor' # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - 172.16.101.250:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - running-rule.yml # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['172.16.101.250:9090','172.16.101.250:9100','172.16.101.250:9101','172.16.101.251:9100','172.16.101.251:9101']
上面紅色的部分:指定從哪些 exporter 抓取數據。這里指定了兩台 host 上的 Node Exporter 和 cAdvisor。開頭的 172.16.101.251:9090 表示會收集自己的監控數據
更多的配置可以看: https://prometheus.io/docs/prometheus/latest/configuration/configuration/
3)新建 /opt/container-monitor/prometheus/docker-compose.yml
version: '2.1' services: prometheus: image: prom/prometheus container_name: prometheus restart: always network_mode: "host" logging: driver: "json-file" options: max-size: "10m" max-file: "5" volumes: - ./running-rule.yml:/etc/prometheus/running-rule.yml:z - ./prometheus.yml:/etc/prometheus/prometheus.yml:z
4)運行prometheus容器
cd /opt/container-monitor/prometheus
docker-compose up -d
瀏覽輸入: http://172.16.101.250:9090,可以看到promethues的數據
打開"Alerts",告警觸發前:
打開"Alerts",告警觸發后:
查看接收告警消息的qq郵箱:
4、只在172.16.101.250機器上部署grafana
Grafana是一個開源的度量分析與可視化套件。經常被用作基礎設施的時間序列數據和應用程序分析的可視化,它在其他領域也被廣泛的使用包括工業傳感器、家庭自動化、天氣和過程控制等。
Grafana支持許多不同的數據源。每個數據源都有一個特定的查詢編輯器,該編輯器定制的特性和功能是公開的特定數據來源。
官方支持以下數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。
每個數據源的查詢語言和能力都是不同的。你可以把來自多個數據源的數據組合到一個儀表板,但每一個面板被綁定到一個特定的數據源,它就屬於一個特定的組織。
1)新建 /opt/container-monitor/grafana/docker-compose.yml
version: '2.1' services: grafana: image: grafana/grafana container_name: grafana restart: always logging: driver: "json-file" options: max-size: "10m" max-file: "5" ports: - 3000:3000 environment: - GF_SERVER_ROOT_URL=http://grafana.server.name - GF_SECURITY_ADMIN_PASSWORD=123456
其中:GF_SECURITY_ADMIN_PASSWORD=secret 指定了admin用戶的密碼為123456
2)運行grafana容器
cd /opt/container-monitor/grafana
docker-compose up -d
瀏覽輸入: http://172.16.101.250:3000,可以看到grafana登錄界面,輸入admin/123456
3) 在grafana中添加prometheus數據源
( 注意:經過多次測試發現,name如果寫成其他的好像不行,必須寫Prometheus才能顯示,不知道是不是一個BUG)
4) 定制用於顯示prometheus監控數據的dashboard,Grafana 是通過 Dashboard 展示數據的,在 Dashboard 中需要定義:
-
展示 Prometheus 的哪些多維數據?需要給出具體的查詢語言表達式。
-
用什么形式展示,比如二維線性圖,儀表圖,各種坐標的含義等。
可以從:https://grafana.com/dashboards?dataSource=prometheus&search=docker 下載官網定制好的一些dashboard
點擊:Download JSON 可以下載到一個 docker-prometheus-monitoring_rev7.json 文件。下面將該json導入dashboard
最終效果如下圖所示,分為Host Info 和Container Performance