天天看點

Prometheus 介紹詳解

Prometheus 介紹

  Prometheus(普羅米修斯)是一個最初在SoundCloud上建構的監控系統。自2012年成為社群開源項目,擁有非常活躍的開發人員和使用者社群。為強調開源及獨立維護,Prometheus于2016年加入雲原生雲計算基金會(CNCF),成為繼Kubernetes之後的第二個托管項目。

  • 官方網站:https://prometheus.io
  • 項目托管:https://github.com/prometheus

Prometheus 特點

作為新一代的監控架構,Prometheus 具有以下特點:

1、多元資料模型:由度量名稱和鍵值對辨別的時間序列資料

2、PromSQL:一種靈活的查詢語言,可以利用多元資料完成複雜的查詢

3、不依賴分布式存儲,單個伺服器節點可直接工作

4、基于HTTP的pull方式采集時間序列資料

5、推送時間序列資料通過PushGateway元件支援

6、通過服務發現或靜态配置發現目标

7、多種圖形模式及儀表盤支援(grafana)

8、适用于以機器為中心的監控以及高度動态面向服務架構的監控

Prometheus 組織架構

Prometheus 由多個元件組成,但是其中許多元件是可選的:

  • Prometheus Server:用于收集名額和存儲時間序列資料,并提供查詢接口
  • client Library:用戶端庫(例如Go,Python,Java等),為需要監控的服務産生相應的/metrics并暴露給Prometheus Server。目前已經有很多的軟體原生就支援Prometheus,提供/metrics,可以直接使用。對于像作業系統已經不提供/metrics,可以使用exporter,或者自己開發exporter來提供/metrics服務。
  • push gateway:主要用于臨時性的 jobs。由于這類 jobs 存在時間較短,可能在 Prometheus 來 pull 之前就消失了。對此Jobs定時将名額push到pushgateway,再由Prometheus Server從Pushgateway上pull。

這種方式主要用于服務層面的 metrics:

  • exporter:用于暴露已有的第三方服務的 metrics 給 Prometheus。
  • alertmanager:從 Prometheus server 端接收到 alerts 後,會進行去除重複資料,分組,并路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。
  • Web UI:Prometheus内置一個簡單的Web控制台,可以查詢名額,檢視配置資訊或者Service Discovery等,實際工作中,檢視名額或者建立儀表盤通常使用Grafana,Prometheus作為Grafana的資料源;

注:大多數 Prometheus 元件都是用 Go 編寫的,是以很容易建構和部署為靜态的二進制檔案。

Prometheus 介紹詳解

Prometheus 資料模型

 Prometheus将所有資料存儲為時間序列;具有相同度量名稱以及标簽屬于同一個名額。

每個時間序列都由度量标準名稱和一組鍵值對(也成為标簽)唯一辨別。

時間序列格式:

<metric name>{<label name>=<label value>, ...}      

示例:

api_http_requests_total{method="POST", handler="/messages"}      

度量名稱{标簽名=值}值

HELP 說明名額是幹什麼的

TYPE 名額類型,這個資料的名額類型

注:度量名通常是一英文命名清晰。标簽名英文、值推薦英文。

Prometheus 名額類型

• Counter:遞增的計數器

  适合:API 接口請求次數,重試次數。

• Gauge:可以任意變化的數值

  适合:cpu變化,類似波浪線不均勻。

• Histogram:對一段時間範圍内資料進行采樣,并對所有數值求和與統計數量、柱狀圖

  适合:将web 一段時間進行分組,根據标簽度量名稱,統計這段時間這個度量名稱有多少條。

  适合:某個時間對某個路徑成本,分組,一段時間http相應大小,請求耗時的時間。

• Summary:與Histogram類似

Prometheus 作業和執行個體

  • 執行個體:可以抓取的目标稱為執行個體(Instances)
  • 作業:具有相同目标的執行個體集合稱為作業(Job)
scrape_configs:
    - job_name: 'prometheus'
      static_configs:
      - targets: ['localhost:9090']
     - job_name: 'node'
      static_configs:
      - targets: ['192.168.1.10:9090']