從儀表盤探索 MongoDB 關鍵指標

IT运维监控發表於2024-12-02

這是 MongoDB 監控系列文章的第七篇,前面幾篇文章的連結如下:

  • MongoDB 監控(一)
  • MongoDB 監控(二)
  • MongoDB 監控(三)
  • MongoDB 監控(四)
  • MongoDB 監控(五)
  • MongoDB 監控(六)

按照前面系列文章,我們已經採集到 MongoDB 的監控資料了,並且透過 Grafana 和 Nightingale 的儀表盤看到了資料,這一節開始,我們來探索一下 MongoDB 的關鍵指標,對於未來配置告警規則、排查問題都有幫助。

透過 MongoDB Grafana 儀表盤檢視 MongoDB 關鍵指標

一般儀表盤中每個圖表的左上角,會有一個 i 圖示,點選這個圖示,可以看到這個圖表的一些提示資訊,這個資訊可是非常重要,是製作儀表盤的那個人的經驗總結。我們先看看 Grafana 那個儀表盤,看的時候注意看這個提示資訊。

mongodb_instance_uptime_seconds

這個指標是 MongoDB 例項的執行時間,這個指標是一個累加值,單位是秒,可以用來判斷 MongoDB 例項的執行時間,如果這個值突然變小,說明 MongoDB 服務重啟了。有人會建立一個告警規則:如果這個值小於 300,就報警,說明最近 5 分鐘內發生過重啟。當然了,這麼粗暴的告警規則,在新例項剛剛啟動的時候,也會報警。

qps

sum(irate(mongodb_op_counters_total{type!="command"}[5m]))

mongodb_op_counters_total 表示總的操作次數,顯然是 counter 型別,即單調遞增的,所以使用 irate 或 rate 求每秒操作次數,又因為 type 有多種取值,所以 sum 一下把各類操作求和,但是 type 排除了 command,不知道原因是啥,莫非是因為 command 是什麼特殊操作?回頭再研究。

latency

irate(mongodb_mongod_op_latencies_latency_total{type="command"}[5m]) / irate(mongodb_mongod_op_latencies_ops_total{type="command"}[5m])

mongodb_mongod_op_latencies_latency_total 是延遲總量,mongodb_mongod_op_latencies_ops_total 是操作總量,求 rate 之後再相除,就是每個操作的平均延遲了。具體細節還需要進一步研究。

Current ReplSet State

這個圖表有提示:

This shows the role of the selected service. Normally this should be one of PRIMARY, SECONDARY and ARBITER, but if the system is newly added it could show STARTUP2 during its initial sync.

看起來是 MongoDB 叢集中某個例項的角色,一般是 PRIMARY、SECONDARY 和 ARBITER 三種,如果是新加入的例項,可能會顯示 STARTUP2,這個提示很有用,可以幫助我們理解這個圖表。但是我的顯示的是 STARTUP,可能是因為我是一個 standalone 例項,不是叢集。

在 Prometheus 生態裡沒法儲存字串,所以這裡顯示的內容顯然是根據數字換算出來的,我們先看看這個圖表對應的指標:

max by (instance) (mongodb_mongod_replset_my_state{})

核心就是 mongodb_mongod_replset_my_state 指標,這個指標是一個數字,根據這個數字,我們可以知道這個例項的角色。從圖表上可以看到對應關係:

MongoDB state value mapping

Command Operations

這個圖表包含三個 promql:

irate(mongodb_op_counters_total{job="$job", instance="$instance", type!="command"}[5m])
irate(mongodb_mongod_op_counters_repl_total{job="$job", instance="$instance", type!~"(command|query|getmore)"}[5m])
irate(mongodb_mongod_metrics_ttl_deleted_documents_total{job="$job", instance="$instance"}[5m])

mongodb_op_counters_total 用於計算普通操作,mongodb_mongod_op_counters_repl_total 用於計算 repl 相關的操作,mongodb_mongod_metrics_ttl_deleted_documents_total 用於計算 TTL 刪除的文件數。具體含義就需要研究 MongoDB 的文件和原理了,回頭再說。

Latency detail

irate(mongodb_mongod_op_latencies_latency_total{job="$job", instance="$instance"}[5m]) / irate(mongodb_mongod_op_latencies_ops_total{job="$job", instance="$instance"}[5m]) > 0

這個 promql 和前面的 Latency 是一樣的,只不過上面的是展示的當前值,下面這個展示的是趨勢圖,並且下面的會把不同的 type 的 command 都展示出來,這樣可以看到不同操作的延遲情況。

Current Connections

mongodb_connections{job="$job", instance="$instance", state="current"}

對於資料庫而言,連線數是一個非常重要的指標,這個圖表展示了當前連線數,這個指標是一個 gauge 型別,即時的,不是累加值。

Cursors

mongodb_mongod_metrics_cursor_open{job="$job", instance="$instance"}

這個圖表展示了當前開啟的遊標數,這個指標是一個 gauge 型別,即時的,不是累加值。從圖表的 legend 可以看出,這個指標有個 state 標籤,用來區分不同狀態的遊標。

Document Operations

irate(mongodb_mongod_metrics_document_total{job="$job", instance="$instance"}[5m])

表示文件操作的總數,這個指標是一個 counter 型別,即單調遞增的,所以使用 irate 或 rate 求每秒操作次數。從 legend 可以看出,這個指標有個 state 標籤,用來區分不同型別的文件操作。

Queued Operations

這個 panel 有個提示:Operations queued due to a lock. 由於鎖的緣故積壓的運算元。

mongodb_mongod_global_lock_current_queue{job="$job", instance="$instance"}

沒有使用 rate、irate 之類的,說明是一個 gauge 型別的指標,從 legend 看出這個指標有個 type 標籤,用來區分不同型別的資料。

Query Efficiency

Panel 提示:Ratio of Documents returned or Index entries scanned / full documents scanned。 返回的文件數或索引條目數與掃描的完整文件數的比率。

sum(irate(mongodb_mongod_metrics_document_total{job="$job", instance="$instance", state="returned"}[5m]))
/
sum(irate(mongodb_mongod_metrics_query_executor_total{job="$job", instance="$instance", state="scanned_objects"}[5m]))

另一個:

sum(irate(mongodb_mongod_metrics_query_executor_total{job="$job", instance="$instance", state="scanned"}[5m]))
/
sum(irate(mongodb_mongod_metrics_query_executor_total{job="$job", instance="$instance", state="scanned_objects"}[5m]))

如果掃描了很多,但是返回的很少,即上面的值較小說明效率低,反之效率高。具體還需要再研究。

Scanned and Moved Objects

這個 panel 有提示:This panel shows the number of objects (both data (scanned_objects) and index (scanned)) as well as the number of documents that were moved to a new location due to the size of the document growing. Moved documents only apply to the MMAPv1 storage engine。 此皮膚顯示了由於文件大小增長而將物件(資料(scanned_objects)和索引(scanned))移動到新位置的數量,由於文件大小增長而移動的文件僅適用於 MMAPv1 儲存引擎。

irate(mongodb_mongod_metrics_query_executor_total{job="$job", instance="$instance"}[5m])

另一個:

irate(mongodb_mongod_metrics_record_moves_total{job="$job", instance="$instance"}[5m])

這兩個指標都是 counter 型別,即單調遞增的,所以使用 irate 或 rate 求每秒操作次數。

getLastError Write Time

這個 panel 有提示:Legacy driver operation: Number of, and Sum of time spent, per second executing getLastError commands to confirm write concern. 傳統驅動程式操作:每秒執行 getLastError 命令以確認寫入關注點的數量和時間總和。

irate(mongodb_mongod_metrics_get_last_error_wtime_total_milliseconds{job="$job", instance="$instance"}[5m])

這個指標明顯是一個 counter 型別,單位是 milliseconds,求 rate 之後表示每秒中有多少 ms 是用於 getLastError 的。

Assert Events

這個 panel 有提示:This panel shows the number of assert events per second on average over the given time period. In most cases assertions are trivial, but you would want to check your log files if this counter spikes or is consistently high. 此皮膚顯示了給定時間段內每秒平均的斷言事件數。 在大多數情況下,斷言是微不足道的,但如果此計數器激增或持續很高,則應檢查日誌檔案。

irate(mongodb_asserts_total{job="$job", instance="$instance"}[1m])

這個指標是一個 counter 型別,即單調遞增的,所以使用 irate 或 rate 求每秒操作次數。

Page Faults

這個 panel 有提示:Unix or Window memory page faults. Not necessarily from mongodb. Unix 或 Windows 記憶體頁面錯誤。 不一定來自 mongodb。

irate(mongodb_extra_info_page_faults_total{job="$job", instance="$instance"}[3m])

這個指標是一個 counter 型別,即單調遞增的,所以使用 irate 或 rate 求每秒次數。

總結

透過每個 panel 的研讀,我們對 MongoDB 的監控知識又前進了一步,要想徹底弄懂還需要研究 MongoDB 的文件和原理。本文的探索希望給大家一些學習這類知識的方向。

相關文章