iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
DevOps

時間序列資料庫探討 - Prometheus系列 第 4

Prometheus - 時間序列資料的資料結構

  • 分享至 

  • xImage
  •  

本篇提問

  • 時間序列的時間戳該怎麼決定?
  • Prometheus 和 OpenMetrics 的時間序列的型態有哪些?
  • Recording Rule 如何自我參照?

Prometheus 的資料結構

Prometheus 核心的資料結構非常簡單,只有一種。就是時間序列。

一個時間序列的組成包含:

  • 指標名稱 (字串)
  • 指標標籤集
    • 標籤名(字串)
    • 標籤值(字串)
  • 樣本集
    • 浮點數值(float64)
    • 時間戳(毫秒)

一般來說指標名稱和標籤是鍵,樣本是值。比方以下表達式

api_http_requests_total{method="POST", handler="/messages"}
  • api_http_request_total 是指標名稱。
  • method 和 handler 是標籤名。
  • POST 和 /messages 是標籤值。

表達的是「名為 api_http_request_total,method 是 POST,handler 是 /message」的那個樣本集。數值通常是圖示。

使用上如果一個時間序列不夠存我們關注的資訊,就用兩個。比方說我們可以有

api_http_responses{method="POST", handler="/messages", code="200"}
api_http_responses_total{method="POST", handler="/messages"}

這樣就可以用 PromQL 算出 200 的比率了。

api_http_responses{method="POST", handler="/messages", code="200"} / api_http_responses_total{method="POST", handler="/messages"}

本節提問

  • 以上如果兩個時間序列的樣本時間戳一一對應,那一切都很美好。如果沒對應到的話要怎麼相除呢?
  • 進一步說,我們該對樣本的時間戳做什麼規範?
  • 另外還有一個小問題,float64 的精度夠用嗎?

OpenMetrics 的資料結構

相較於 Prometheus,OpenMetrics 就顯得囉嗦。
它訂義了指標族(MetricFamily),一個指標族的組成包含

  • 指標族名稱
  • 型態(Gauge, Counter, StateSet, Info, Histogram, GaugeHistogram, Summary, Unknown)
  • 單位
  • 說明
  • 標籤名集
  • 指標集
    • 標籤值(與標籤名對應)
    • 樣本序列

樣本序列裡的樣本格式取決於指標族型態。

然而在表示一個指標族時,就是拆成多個 Prometheus 時間序列。
以 Counter 型態為例,樣本包含 total 和 created 屬性。

# TYPE api_http_responses counter
# HELP Http Response Counts
api_http_responses_total{method="POST", handler="/messages"}
api_http_responses_created{method="POST", handler="/messages"}

本節提問

  • 所以 OpenMetrics 的各型態分別是什麼呢?
  • Prometheus Metrics 的型態 跟它們一樣嗎?
  • OpenMetrics 裡 lequantile 是保留標籤名,它們是做什麼的?

Recording Rule 的資料結構

上篇提到 Prometheus 提供了 Recording Rule來從舊指標用表達式生出新的指標。
yml 設定檔的最底層是 groups,每個 group 有:

  • 名稱(name)
  • 取樣間隔(interval)
  • 警報上限(limit)
  • 時間戳偏移(query_offset)
  • 規則列表(rules)

規則列表裡的規則有兩種:
一是 recording_rule,它有:

  • 名稱(record)
  • 表達式(expr)
  • 覆寫標籤(labels)

二是 alerting_rule,它有:

  • 名稱(alert)
  • 表達式(expr)
  • 觸發警報所需持續的時長(for)
  • 消滅警報所需持續的時長(keep_firing_for)
  • 註記(annotation)
  • 覆寫標籤(labels)

其中覆寫標籤可以使用 Golang 模板語言。
例見官方文件

本節提問

  • Recording Rule 可以參照其他 Recording Rule 生出的指標嗎?時間戳會𨒂遲嗎?
  • Recording Rule 可以參照自身嗎?我可以實作數位濾波器嗎?

警報規則引擎的資料結構

警報規則引擎的設定檔就跟 Recording Rule 是同一個,他的原理是用表達式來產生「警報是否觸發」的時間序列,值為 1 代表觸發,反之為 0。
每條警報規則會產生兩條時間序列:

ALERTS{alertname="<alert name>", alertstate="pending"...}
ALERTS{alertname="<alert name>", alertstate="firing"...}

pending 時間序列代表表達式已為真,但持續的時長不足。
firing 時間序列代表表達式已為真,超過時長且尚未消滅。
例見官方文件

問題整理

  • 如果兩相關時間序列時間戳沒對應到的話,要怎麼運算呢?
  • 我們該對樣本的時間戳做什麼規範?
  • float64 的樣本值精度夠用嗎?
  • OpenMetrics 的各型態分別是什麼?
  • Prometheus Metrics 的型態 跟 OpenMetrics 一樣嗎?
  • OpenMetrics 裡的保留標籤名 lequantile 是做什麼的?
  • 若 Recording Rule 參照其他 Recording Rule 生出的指標,時間戳會𨒂遲嗎?
  • Recording Rule 可以參照自身嗎?

上一篇
Prometheus - 監控系統和它的週邊工具
下一篇
Prometheus - 時間序列資料的資料型態
系列文
時間序列資料庫探討 - Prometheus30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言