夜鶯監控(Nightingale)是一個開源的雲原生監控系統,本文介紹如何使用夜鶯監控程序。
程序監控分兩部分,一部分是作業系統內整體程序數量統計,另一部分是單一程序指標採集。
總體程序數量
以 Categraf 為例,Categraf 提供了 processes 外掛用於統計機器上的程序數量,比如總程序數量多少、Running 狀態的程序數量多少、Sleeping 狀態的程序數量多少等。針對 processes 外掛採集的資料,我們整理過專門的儀表板:
https://github.com/ccfos/nightingale/blob/main/integrations/Linux/dashboards/categraf-processes.json
這類指標有什麼用?通常是非預期的啟動了大量程序的場景。比如筆者之前遇到:crontab 寫挫了,腳本 hang 住了,而且沒有在 cron 腳本裡偵測之前的程序是否退出,導致每次 crontab 執行時都啟動了一個新的程序,最終導致機器上有大量的同名程序在執行,最終釀成事故。這個時候就可以透過 processes 外掛採集的指標來發現問題。
單一程序指標
單一程序指標,指的是程序佔用的 CPU、記憶體、控制代碼等指標。有多種方式可以採集。
- 在程序裡埋點。比如 Java 程式可以使用 micrometer 或者 Spring Boot Actuator 等方式來採集指標,Go 程式可以使用 Prometheus 的 Go 語言客戶端庫來採集指標。
- 在程序外採集。比如使用 Process Exporter、Categraf 的 procstat 外掛等採集程序指標。
通常來講,在程序裡埋點是更推薦的做法。不但可以採集程序的 CPU、記憶體等常規指標,也可以採集更多執行時指標,比如 Java 程式可以採集 JVM 的一些指標,Go 程式可以採集一些 goroutine、gc 的指標。所有優秀的開源軟體,都會暴露自身的監控指標。作為業務研發人員,水平參差不齊,可能有些人不清楚埋點的重要性,此時也可使用程序外採集的方式來做補充。
Spring Boot Actuator 是可以透過設定調整來直接暴露 Prometheus 格式的 metrics 資料的,所以不需要額外的外掛來採集,直接使用 Categraf 的
prometheus外掛即可。或者直接在 Prometheus 或 vmagent 裡設定抓取規則也可以。
以 Categraf 的 procstat 外掛為例,其文件參考 這裡。重點要關注的指標是:
- procstat_lookup_count 程序數量,如果為 0,表示對應的程序掛了
- procstat_rlimit_num_fds_soft 程序的軟限制控制代碼數,如果是 1024,通常表示系統參數沒有調優好
- procstat_cpu_usage_total 程序 CPU 使用率
- procstat_mem_usage_total 程序記憶體使用率
- procstat_num_fds_total 程序開啟的檔案控制代碼數
- procstat_read_bytes_total 程序讀取的總位元組數
- procstat_write_bytes_total 程序寫入的總位元組數
單一程序的儀表板可以參考:
FAQ
1. procstat 外掛監控多個程序怎麼做?
設定範例如下:
[[instances]]
search_exec_substring = "mysqld"
gather_total = true
gather_per_pid = true
gather_more_metrics = [
"threads",
"fd",
"io",
"uptime",
"cpu",
"mem",
"limit",
]
[[instances]]
search_exec_substring = "n9e-plus"
gather_total = true
gather_per_pid = true
gather_more_metrics = [
"threads",
"fd",
"io",
"uptime",
"cpu",
"mem",
"limit",
]
2. procstat 設定中的 gather_more_metrics 裡邊的 jvm 參數是幹啥的
如果 gather_more_metrics 包含 jvm 則會認為要採集的目標程序是個 Java 程序,會呼叫系統的 jstat 命令採集 JVM 的一些基礎指標。jstat 是安裝 JDK 時自帶安裝的一個工具,在 JDK 的 bin 目錄下。這裡經常會有一個坑,就是使用者在 gather_more_metrics 設定了 jvm,機器上也有 jstat,使用如下命令測試採集的時候也可以採集到資料:
./categraf --test --inputs procstat
但是重啟 Categraf 正式採集之後,卻又採集不到了。通常的原因是:Categraf 使用 systemd 託管的,而 systemd 並不知道 JDK 的環境變數,所以找不到 jstat 命令導致的。解決方法是設定 Categraf 的 service 檔案,加入 JDK 的環境變數。比如:
Environment="PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
常見問題
Q1:怎麼監控某個程序在不在跑?
A:用 Categraf 的 procstat 外掛,設定 exe = "nginx" 或 pattern = "supervisord",會上報 proc_pid_count{name="nginx"} 這類指標,配 < 1 告警即可。
Q2:能監控程序的記憶體 / CPU 佔用嗎?
A:能。procstat 上報 proc_resident_memory_bytes / proc_cpu_usage 等指標,按程序名 + 閾值配告警。