性能監控體系:InfluxDB & Grafana & Prometheus



InfluxDB

簡介

什么是 InfluxDB ?

  • InfluxDB 是一個由 InfluxData 開發的,開源的時序型數據庫。它由 Go 語言寫成,着力於高性能地查詢與存儲時序型數據。

  • InfluxDB 被廣泛應用於存儲系統的監控數據、IoT 行業的實時數據等場景。

  • 可配合 Telegraf 服務(Telegraf 可以監控系統 CPU、內存、網絡等數據)。

  • 可配合 Grafana 服務(數據展現的圖像界面,將 InfluxDB 中的數據可視化)。

  • InfluxDB 官網

什么是時序數據?

時間序列數據(TimeSeries Data):按照時間順序記錄系統、設備狀態變化的數據被稱為時序數據。其應用場景很多,如:

  • 無人駕駛車輛運行中要記錄的經度、緯度、速度、方向、旁邊的距離等。
  • 某一地區的各車輛的行駛軌跡數據。
  • 傳統證券行業實時交易數據。
  • 實時運維監控數據等。

時序數據特點

  • 性能好:關系型數據庫對於大規模數據的處理性能糟糕,而 NoSQL 可以比較好地處理大規模數據,但依然比不上時間序列數據庫。
  • 存儲成本低:高效的壓縮算法,節省存儲空間,有效降低 I/O 。

數據存儲結構

與 MySQL 的基礎概念對比

概念 MySQL InfluxDB
數據庫(同) database database
表(不同) table measurement
列(不同) column tag(帶索引的,非必須)、field(不帶索引)、timestemp(唯一主鍵)
  • tag set:不同的每組 tag key 和 tag value 的集合。

  • field set:每組 field key 和 field value 的集合。

  • retention policy:數據存儲策略(默認策略為 autogen)InfluxDB 沒有刪除數據操作,規定數據的保留時間達到清除數據的目的。

  • series:共同 retention policy、measurement 和 tag set 的集合。

示例數據

  • census 是 measurement
  • butterflies 和 honeybees 是 field key
  • location 和 scientist 是 tag key
name: census
————————————
time                 butterflies     honeybees     location     scientist
2015-08-18T00:00:00Z      12             23           1         langstroth
2015-08-18T00:00:00Z      1              30           1         perpetua
2015-08-18T00:06:00Z      11             28           1         langstroth
2015-08-18T00:06:00Z      11             28           2         langstroth

注意點

  • tag 只能為字符串類型。
  • field 類型無限制。
  • 不支持 join。
  • 支持連續查詢操作(匯總統計數據):CONTINUOUS QUERY。

部署

新建容器網絡:
docker network create grafana

運行容器:
docker run -d --name=influxdb --network grafana -p 8086:8086 -v ${PWD}/influxdb/:/var/lib/influxdb influxdb:1.7.10

創建數據庫:

  • 第一種方式:
    curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE jmeter"
  • 第二種方式:
    docker exec -it influxdb influx

簡單使用:

create database jmeters;
use jmeter;
show measurements;
select * from jmeter limit 3;

常用 InfluxQL

-- 查看所有的數據庫
show databases;

-- 使用特定的數據庫
use database_name;

-- 查看所有的 measurement
show measurements;

-- 查詢 10 條數據
select * from measurement_name limit 10;

-- 數據中的時間字段默認顯示的是一個納秒時間戳,改成可讀格式
precision rfc3339; -- 之后再查詢,時間就是 rfc3339 標准格式
-- 或可以在連接數據庫的時候,直接帶該參數
influx -precision rfc3339

-- 查看一個 measurement 中所有的 tag key 
show tag keys

-- 查看一個 measurement 中所有的 field key 
show field keys

-- 查看一個 measurement 中所有的保存策略(可以有多個,一個標識為 default)
show retention policies;

Grafana

簡介

Grafana(官網)是一個跨平台的、開源的度量分析和可視化工具,可以通過將采集的數據查詢然后可視化的展示,並及時通知。

它主要有以下六大特點:

  1. 展示方式:快速靈活的客戶端圖表,面板插件有許多不同方式的可視化指標和日志,官方庫中具有豐富的儀表盤插件,比如熱圖、折線圖、圖表等多種展示方式;
  2. 支持多種數據源:Graphite、InfluxDB、OpenTSDB、Prometheus、Elasticsearch、CloudWatch 和 KairosDB 等;
  3. 通知提醒:以可視方式定義最重要指標的警報規則,Grafana 將不斷計算並發送通知,在數據達到閾值時通過 Slack、PagerDuty 等獲得通知;
  4. 混合展示:在同一圖表中混合使用不同的數據源,可以基於每個查詢指定數據源,甚至自定義數據源;
  5. 注釋:使用來自不同數據源的豐富事件注釋圖表,將鼠標懸停在事件上會顯示完整的事件元數據和標記;
  6. 過濾器:Ad-hoc 過濾器允許動態創建新的鍵/值過濾器,這些過濾器會自動應用於使用該數據源的所有查詢。

基礎概念

Data Source

  • Grafana 確切的說是一個前端展示工具,將數據以非常美觀直接的圖形展示出來。那么這些數據必須有一個來源吧,那么 Grafana 獲取數據的地方就稱為 Data Source。
  • 官方文檔上說 Grafana 支持以下數據源:Graphite、InfluxDB、OpenTSDB、Prometheus、Elasticsearch、CloudWatch。
  • 在 Grafana 3.0+ 之后,不僅支持上面說的這些數據源,還支持一些其它的數據源,這些就稱為 Grafana Plugins。Grafana 支持的插件非常多,只要做一些簡單的插件安裝配置,就能獲取豐富的數據源。
  • 如下所示,添加數據源:
    image

DashBoard

  • 就像汽車儀表盤一樣可以展示很多信息,包括車速、水箱溫度等。Grafana 的 DashBoard 就是以各種圖形的方式來展示從 Datasource 拿到的數據。
  • 添加儀表盤的示例步驟:
    1. 如搜索 jmeter 儀表盤:
      image
    2. 選擇對應的儀表盤 ID :
      image
    3. 復制ID,填入導入界面(導入時需要選擇用戶組以及對應的數據庫):
      image
    4. 展示儀表盤(右上角可以選擇數據展示的時間段和刷新頻次):
      image

Row

  • Row 是 DashBoard 的基本組成單元,一個 DashBoard 可以包含很多個 Row 。
  • 一個 Row 可以展示一種信息或者多種信息的組合,比如系統內存使用率,CPU 五分鍾及十分鍾平均負載等。所以在一個 DashBoard 上可以集中展示很多內容。

Panel

  • Panel(面板)實際上就是 Row 展示信息的方式,支持表格(table)、列表(alert list)、熱圖(Heatmap)等多種方式,具體可以去官網上查閱。

Query Editor

  • 用來指定獲取哪一部分數據,類似於 SQL 查詢語句。比如要在某個 row 里面展示 test 這張表的數據,那么 Query Editor 里面就可以寫成 select * from test。
  • 這只是一種比方,實際上每個 DataSource 獲取數據的方式都不一樣,所以寫法也不一樣,比如像 zabbix 數據則是以指定某個監控項的方式來獲取的。

Organization

  • org 是一個很大的概念,每個用戶可以擁有多個 org,grafana 有一個默認的 main org 。
  • 用戶登錄后可以在不同的 org 之間切換,前提是該用戶擁有多個 org 。
  • 不同的 org 之間完全不一樣,包括 datasource、dashboard 等都不一樣。
  • 創建一個 org 就相當於開了一個全新的視圖,所有的 datasource、dashboard 等都要再重新開始創建。

User

  • Grafana 里面用戶有三種角色:admin、editor、viewer。
  • admin 權限最高,可以執行任何操作,包括創建用戶、新增 Datasource、創建 DashBoard 等。
  • editor 角色不可以創建用戶、不可以新增 Datasource、可以創建 DashBoard 。
  • viewer 角色僅可以查看 DashBoard 。
  • 在 2.1 版本及之后新增了一種角色 read only editor(只讀編輯模式),這種模式允許用戶修改 DashBoard,但是不允許保存。
  • 每個 user 可以擁有多個 organization 。

部署

運行容器:

docker run -d --name grafana --network grafana -p 3000:3000 grafana/grafana:6.6.2

image

默認登錄賬號密碼為 admin/admin 。


壓測結果采集:Jmeter + InfluxDB + Grafana

Jmeter 自帶的監視器在 Windows 使用 GUI 模式運行時,其渲染和效果都不是太好,而在 linux 環境下又無法實時可視化。

因此如果有一個性能測試結果實時展示的頁面,就可以提升我們對系統性能表現的掌握程度,另一方面也可以提升我們的測試效率。


Grafana 添加 InfluxDB 數據源

image


image


配置項:

  • URL:http://influxdb:8086:由於 grafana 和 influxdb 在在同個容器網絡中,因此可直接填寫【influxdb容器名:端口號】。
  • Database:jmeter:在 influxdb 中創建的數據庫名。
  • Min time interval:5:每 5 秒刷新一次數據源(這里是與 jmeter backend listener 每 5 秒寫入一次數據到 influxdb 保持同步)。

image


Grafana 創建 Jmeter 儀表盤

image

導入 Grafana 官方 Jmeter 儀表盤https://grafana.com/grafana/dashboards/5496

image


image

填寫自定義配置:

image

儀表盤創建成功:

image


Jmeter 配置 Influxdb 監聽器

image

配置項說明:

  • influxdbUrl:http://192.168.3.222:8086/write?db=jmeter:influxdb 服務器地址以及寫入的數據庫。
  • application:app_1自定義應用名稱,可在 grafana 儀表盤中篩選區分。
  • measurement:jmeter:influxdb 表名,默認為 jmeter(寫入數據時會自動創建該表)。
  • summaryOnly:false:在 grafana 儀表盤中顯示詳細 Error 信息。
  • testTitle:test_demo_1:在 influxdb 表數據中作區分。

查看寫入的 Influxdb 表數據:

[root@localhost ~]# docker exec -it influxdb influx

Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> show measurements;
name: measurements
name
----
events
jmeter
>
> select * from jmeter limit 3;
name: jmeter
time                application avg     count countError endedT hit max maxAT meanAT min minAT pct90.0 pct95.0 pct99.0 rb    responseCode responseMessage sb   startedT statut transaction
----                ----------- ---     ----- ---------- ------ --- --- ----- ------ --- ----- ------- ------- ------- --    ------------ --------------- --   -------- ------ -----------
1658844069082000000 app_1                                0              0     0          0                                                                     1               internal
1658844074048000000 app_1       34.9375 16                          42               30        41.3    42      42      39952                              1872          all    Single Request
1658844074050000000 app_1       34.9375 16                          42               30        41.3    42      42                                                       ok     Single Request
> 
> select * from events;
name: events
time                application text                title
----                ----------- ----                -----
1658844069036000000 app_1       test_demo_1 started ApacheJMeter
1658844215777000000 app_1       test_demo_1 ended   ApacheJMeter

查看儀表盤展示:

image

image


Prometheus(普羅米修斯)

簡介

什么是 Prometheus ?

  • Prometheus(官網)是一套開源的監控&報警&時序數據庫的組合,適合監控 Docker 容器。因為 Kubernetes 的流行帶動了 Prometheus 的發展

  • Prometheus 是最初在 SoundCloud 上構建的開源系統監視和警報工具包,該項目擁有非常活躍的開發人員和用戶社區。現在,它是一個獨立的開源項目,並且獨立於任何公司進行維護。為了強調這一點並闡明項目的治理結構,Prometheus 於 2016 年加入了 Cloud Native Computing Foundation,這是繼 Kubernetes 之后的第二個托管項目。

Prometheus 優點

  • 非常少的外部依賴,安裝使用超簡單。
  • 已經有非常多的系統集成,例如:docker、HAProxy、Nginx、JMX 等等。
  • 服務自動化發現。
  • 直接集成到代碼。
  • 設計思想是按照分布式、微服務架構來實現的。

Prometheus 特性

  • 多維度數據模型。
  • 提供靈活的查詢語言(PromQL)。
  • 不依賴分布式存儲,單個服務器節點是自主的。
  • 以 HTTP 方式,通過 Pull 模型拉取時間序列數據。
  • 也可以通過中間網關支持 Push 模型。
  • 通過服務發現或者靜態配置,來發現目標服務對象。
  • 支持多種多樣的圖標和界面展示。

Prometheus 生態系統

Prometheus 生態系統包含多個組件,其中許多是可選的。且大多數 Prometheus 組件都是用 Go 編寫的,因此易於構建和部署為靜態二進制文件。

  • Prometheus server:它會抓取並存儲時間序列數據。
  • client libraries:用於檢測應用程序代碼。
  • push gateway:一個支持短期工作的推送網關。
  • 諸如 HAProxy、StatsD、Graphite 等服務的專用輸出端。
  • 一個 alertmanager 處理警報。
  • 各種支持工具。

Prometheus 原理架構圖

下圖說明了 Prometheus 的體系結構及其某些生態系統組件。

image

Prometheus 直接或通過中介推送網關從已檢測作業中刪除指標,以處理短暫的作業。它在本地存儲所有報廢的樣本,並對這些數據運行規則,以匯總和記錄現有數據中的新時間序列,或生成警報。Grafana 或其他 API 使用者可以用來可視化收集的數據。

Prometheus 應用場景:

  • 什么時候適合?

    • Prometheus 可以很好地記錄任何純數字時間序列。它既適用於以機器為中心的監視,也適用於高度動態的面向服務的體系結構的監視。在微服務世界中,它對多維數據收集和查詢的支持是一種特別的優勢。
    • Prometheus 的設計旨在提高可靠性,使其成為中斷期間要使用的系統,以使你能夠快速診斷問題。每個 Prometheus 服務器都是獨立的,而不依賴於網絡存儲或其他遠程服務。當基礎結構的其他部分損壞時,你可以依靠它,並且無需設置廣泛的基礎結構即可使用它。
  • 什么時候不適合?

    • 普羅米修斯重視可靠性。即使在故障情況下也始終可以查看有關系統的可用統計信息。如果你需要 100% 的准確性(例如按請求計費),則 Prometheus 並不是一個好的選擇,因為所收集的數據可能不夠詳細和完整。在這種情況下,最好使用其他系統來收集和分析數據以進行計費,並使用 Prometheus 進行其余的監視。

部署

配置文件:

https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yml

運行容器:

docker run -d --name prometheus --network grafana -p 9090:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml

Web 訪問 Prometheus:查看默認監控目標

image

實時抓取監控數據,並存儲在 Prometheus 數據庫中:

image


主機性能采集:Prometheus + Grafana

node_exporter

Prometheus 提供了各種監控 Agent,這里以主機性能監控【node_exporter】為例。

下載解壓 node_exporter

image

# 根據系統選擇對應的下載包
[root@localhost prometheus]# wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz

[root@localhost prometheus]# tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz 
node_exporter-1.3.1.linux-amd64/
node_exporter-1.3.1.linux-amd64/LICENSE
node_exporter-1.3.1.linux-amd64/NOTICE
node_exporter-1.3.1.linux-amd64/node_exporter

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
[root@localhost prometheus]# ls
node_exporter-1.3.1.linux-amd64  node_exporter-1.3.1.linux-amd64.tar.gz  prometheus.yml
[root@localhost prometheus]# cd node_exporter-1.3.1.linux-amd64/
[root@localhost node_exporter-1.3.1.linux-amd64]# ls
LICENSE  node_exporter  NOTICE

啟動 node_exporter

# 查看啟動參數
[root@localhost prometheus]# ./node_exporter --help
# 自定義啟動端口,且限定訪問IP
[root@localhost prometheus]# nohup ./node_exporter --web.listen-address="192.168.3.222:9102" &
# 不限定訪問IP
[root@localhost prometheus]# nohup ./node_exporter --web.listen-address=":9102" &

修改 Prometheus 配置文件,添加 node_exporter 配置:

image

重啟容器:

docker restart prometheus

監控添加成功:

image


Grafana 添加 Prometheus 數據源

image


Grafana 導入 node_exporter 儀表盤

image

導入 Grafana 官方 node_exporter 儀表盤https://grafana.com/grafana/dashboards/8919

image

image

儀表盤導入成功:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM