原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。python
像我這麼熱愛野外生活的人,初冬時節,還找了個隱蔽的地方去野炊。如今的社會,爲了找找到這麼一個靜謐的存在,我可謂煞費苦心。linux
初冬的夜,連蟲鳴聲都沒有,星空高而深遠。蜷縮在篝火旁邊,我想起了普羅米修斯。在希臘神話中,他教會人類學會使用火,完全告別了茹毛飲血的年代。git
早在2012年,還有一部叫作《普羅米修斯》的電影上演,它是《異行》的前傳,其壯麗宏大的場景讓人印象深入。程序員
在這無盡的時空和未知的領域面前,我一個小小程序員,真是連屁都不如。比我強大的比我用功,好比立下flag學python的潘總
,他應該能勉強算得上個屁。github
普羅米修斯的英文是prometheus
,從這拗口的名字就能夠看出,它是個舶來品。prometheus是google內部監控報警系統的開源版本,如今很是流行。web
監控系統是老生常談的問題了,xjjdog在之前也專門總結過。《這麼多監控組件,總有一款適合你》,這篇長文,從多個維度上介紹了監控體系,而prometheus面向的就是metric
類型的數據監控。spring
今天,咱們要着重介紹的,就是prometheus。來勢洶洶,大有一統天下的架勢。本篇文章主要是爲了引發你的興趣,並提供了不少實踐過的配置文件。說了這麼多廢話,就讓咱們正式開始吧。shell
你在使用一些相似於grafana的展現組件時,可以發現底層的數據存儲,可以使用Prometheus,而這兩個東西明顯沒有血緣關係。在享受grafana至高無上的美麗時,應該認識到一個現實:如今的監控系統,都拆分紅了很是具體的細小模塊,讓你能夠根據經驗和習慣進行精細化選擇。數據庫
Prometheus生態系統由多個組件組成,其中一些是可選的。多數Prometheus組件由Go語言編寫,使這些組件很容易編譯和部署。網上不少文章翻譯的晦澀難懂,xjjdog在這裏便使用人話描述。json
注:敲黑板,帶★是重點,要考 。不學無法用
★1)Prometheus Server
:主要負責數據採集
和存儲
,提供PromQL查詢語言
的支持。注意,它同時是一個存儲!
2)客戶端SDK:支持很是多語言的類庫,越多越好。
3)Push Gateway
:Prometheus獲取監控數據的主要方式是拉取
模式,但總有一些瞬時發生的監控項,這種信息沒法pull。因此這個組件是爲了支持一些存活時間很短的事件,把這些信息進行緩衝。
4)PromDash
:使用Rails開發可視化的Dashboard,用於可視化指標數據
★5)Exporter
:數據採集組件,也就是一些agent。負責從目標處蒐集數據,並將其轉化爲Prometheus支持的格式
★6)Alertmanager
:報警管理器,用於發送到正確的邏輯分組。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等
7)prometheus_cli
:命令行工具
8)其餘輔助性工具:多種導出工具,能夠支持Prometheus存儲數據轉化爲HAProxy、StatsD、Graphite等工具所須要的數據存儲格式
長篇大論的扯了一通,仍是逃脫不了收集、處理、展現三大部件。看了以上的介紹,你應該可以看懂這張官方圖。看那些大框框,不要關注細節。
咱們來抽取一下比較特殊的要點。
1)它獲取監控數值的方式是拉模式 2)它有一個存儲數據的時序數據庫,查詢語言靈活,但不是SQL 3)有SDK、Agent、中間網關三種數據彙總方式 4)可使用grafana代替它自帶的醜八怪界面 5)可以細粒度配置報警,統一管理
瞭解了上面的組件,安裝配置就順利的多。先把Prometheus下載下來,而後解壓。
cd /opt
wget -c https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
tar zxvf prometheus-2.14.0.linux-amd64.tar.gz
複製代碼
在安裝目下編輯配置文件prometheus.yml
,咱們解釋比較重要的部分。不少時候,咱們須要監控很是多的組件,好比系統狀態、canal、kafka、jvm等等,若是將全部的配置文件都放在這裏,勢必會又臭又長,因此通常採用子配置文件的方式。注意,配置文件分了兩部分,上面的是觸發規則,下面的是主機名稱,注意區別。
各個被監控的組件,須要自行部署Exporter,而後把http接口暴露出來。
alerting:
alertmanagers:
- static_configs:
- targets: ["10.81.28.227:9093"]
# 分文件配置,咱們以sys系統參數爲例說明
rule_files:
- "sys_monit.yml"
- "kafka_monit.yml"
# 抓取配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
labels:
group: "監控服務端"
- job_name: 'system'
#經過文件去動態發現配置
file_sd_configs:
- refresh_interval: 1m
files:
- sys.yml #配置文件路徑
- job_name: 'kafka'
file_sd_configs:
- refresh_interval: 1m
files:
- kafka.yml
複製代碼
再來看一下其中一個子配置文件sys.yml
,它定義了一批要監控的機器。也就是到什麼地方去找數據。
[
{
"labels": {
"job": "shop001.web.pub.pro.ali.dc",
"instance": "system"
},
"targets": [
"10.174.88.9:9100"
]
}
]
複製代碼
而後咱們啓動Prometheus:
nohup ./prometheus &
複製代碼
alertmanager須要單獨下載,這種方式真是腦回路驚奇。
https://github.com/prometheus/alertmanager/releases
複製代碼
報警的配置文件分爲兩部分,其中一部分,放在上面的prometheus.yml
文件中rule_files模塊,用來指定匹配規則;另一部分,放在alertmanager.yml中,用來指定報警的去向。
好比,我想要把報警發送到臭名昭著的dingding,就能夠這麼寫。
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: 'pro'
routes:
- receiver: 'canal'
match:
alertname: 'canal 延遲'
receivers:
- name: 'sys'
webhook_configs:
- url: 'http://10.81.28.227:8060/dingtalk/pro/send'
- name: 'canal'
webhook_configs:
- url: 'http://10.81.28.227:8060/dingtalk/canal/send'
複製代碼
接下來看一下規則部分,好比sys_monit.yml,你應該看到這個過程是怎麼運轉起來的了。
roups:
- name: netstat_tcp_time_wait
rules:
- alert: 主機鏈接數 time_wait
expr: netstat_tcp_time_wait > 60000
for: 5m
labels:
status: warning
annotations:
summary: "{{$labels.job}}"
description: "{{ $labels.instance }} time_wait > 60k(當前值:{{ $value}})"
複製代碼
若是你安裝了dashboard的話,應該能看到這些信息了。可是,每次更改閾值,都須要重啓server,這一部分,作的不是很好。另外,yml深層的嵌套信息,在配置繁多的時候,顯得比較雜亂。從上面的配置文件就能夠看出,這些配置文件的解析,使用的是簡單的佔位符的方式。在設計報警以前,你須要知道每個監控項的名稱,以及意義。
telegraf是比較好用的數據收集agent。一般,它是經過push的方式彙報監控數據,可是經過加入幾行配置,能夠把push變成pull(暴露一個專用接口)。主要的配置文件以下:
[[outputs.prometheus_client]]
listen = "0.0.0.0:9100"
複製代碼
如下是一個grafana主機監控的效果圖。因爲它的顏值比prometheus自帶的高,因此通常都使用grafana。
可是自帶的UI也不是一無可取,好比下面查看整個系統機器狀態的頁面。
用於調試查詢語句的界面等。 另外,prometheus能夠很容易的接入如下的系統:2) canal接入。在canal.properties 中添加
canal.metrics.pull.port=11112
複製代碼
注意:canal版本必須canal 1.1.x系列以上
一個監控系統,主要的難點是生態。prometheus最近幾年發展迅速,很是多的組件都對其進行了集成,這對咱們來講是比較大的福音。可是,它的配置文件仍是有點複雜,尤爲是在管理大型機器羣的時候,須要頻繁的更改配置文件,並不可以作到自動發現。
因此,一般使用prometheus的時候,會配合不少內部系統,寫不少的shell腳本,自動更改這些配置進行重啓,儘可能作到自動化。
因爲涉及的配置文件,實在是太多,且配置有相對的難度。我將這些信息,放在了倉庫裏。有須要的,自行參考。
https://github.com/xjjdog/prometheus-cnf-pro
複製代碼
清單: 一、prometheus配置,規則配置 (11個) 二、alertmanager配置 (1個) 三、telegraf (2個) 四、grafana(5個)
做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,進一步交流。