昔日教人類用火的prometheus,現在在努力報警

原創:小姐姐味道(微信公衆號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
複製代碼

2.一、配置server

在安裝目下編輯配置文件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 &
複製代碼

2.二、報警配置

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能夠很容易的接入如下的系統:

  1. springboot。 參見 yq.aliyun.com/articles/27…

2) canal接入。在canal.properties 中添加

canal.metrics.pull.port=11112
複製代碼

注意:canal版本必須canal 1.1.x系列以上

End

一個監控系統,主要的難點是生態。prometheus最近幾年發展迅速,很是多的組件都對其進行了集成,這對咱們來講是比較大的福音。可是,它的配置文件仍是有點複雜,尤爲是在管理大型機器羣的時候,須要頻繁的更改配置文件,並不可以作到自動發現。

因此,一般使用prometheus的時候,會配合不少內部系統,寫不少的shell腳本,自動更改這些配置進行重啓,儘可能作到自動化。

因爲涉及的配置文件,實在是太多,且配置有相對的難度。我將這些信息,放在了倉庫裏。有須要的,自行參考。

https://github.com/xjjdog/prometheus-cnf-pro
複製代碼

清單: 一、prometheus配置,規則配置 (11個) 二、alertmanager配置 (1個) 三、telegraf (2個) 四、grafana(5個)

做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,​進一步交流。​

相關文章
相關標籤/搜索