作為采集 agent,logtail 所采集的日志可能會就被用于對應用程式進行監控/告警,是以保證它自身處于正常狀态對整個系統的穩定顯得尤為重要。在之前的 《全方位 Logtail 狀态監控》
中,我們曾介紹了關于監控 Logtail 各類狀态的方法,包括基本的鍊路狀态、資源使用情況等。
在本文中,我們将詳細展開通過外圍巡檢擷取 SLS 提供的狀态資訊來實作對 logtail 心跳狀态的監控和告警,并提供可供直接使用的代碼。
外圍巡檢
顧名思義,外圍巡檢即不通路實際運作 logtail 的機器,僅通過一些外部通路可獲得的狀态資訊來進行巡檢。因為是巡檢,自然會受到監控規模的限制,是以,此方法适用于 logtail 執行個體數量較少(比如少于 500 台)或是對發現異常的實時性要求較低(比如半小時内發現)的場景。
SLS 提供的狀态資訊
在實踐中,我們可以通過以下兩項 SLS 提供的資訊來進行巡檢:
- ListMachines API :在日志服務中,正在采集日志的 logtail 執行個體在邏輯上會屬于至少一個機器組,是以,通過此 API 查詢指定機器組,即可得到該組内 logtail 執行個體在 SLS 服務端的狀态,輔助我們進行巡檢判斷。
- 服務日志 中的 logtail 狀态日志:在正常情況下,logtail 會在每分鐘上報一條狀态日志至 SLS 服務端,通過開通服務日志(不開通記錄檔的情況下完全免費),我們即可擷取到這些狀态日志,進而判斷 logtail 執行個體的狀态日志上報是否依舊正常。
巡檢流程
假定監控對象為單個 project,實時性要求為 15 分鐘,我們推薦按照如下流程來組合上述的兩項資訊以實作外圍巡檢:
-
對于 project 下的每個機器組,調用 ListMachines API 來擷取該機器組内所有機器的狀态,其中有個 lastHeartbeatTime 表示對應機器上 logtail 執行個體在服務端的最近心跳時間。通過對比目前時間,配合上特定門檻值(比如 10 分鐘),即可篩選出潛在的異常機器(現階段,ListMachines 傳回的心跳時間可能會有延時,是以隻是潛在機器)。
2.借助 logtail 狀态日志來做進一步地确認。因為服務日志也存儲在 SLS 的 logstore 中,是以可以通過 API 在對應 logstore 中查詢相關内容,根據結果來進行确認。比如使用如下語句來查詢特定 logtail 執行個體最近 10 分鐘内的狀态日志數量,如果少于 8 條,認為它是異常。
# 單個查詢
__topic__: logtail_status and ip: "192.168.1.1" | select count(*) as c
# 為了提高效率,可以批量查詢多個 IP(不超過 25 個)
__topic__: logtail_status and (ip:"192.168.1.1" or ip:"192.168.1.2") | select ip, count(*) as c group by ip
巡檢結果告警
在通過巡檢得到異常結果後,我們可以直接将此資訊寫入到特定 logstore,然後利用 SLS 的告警功能來進行通知。目前,
告警功能支援短信、郵件、釘釘、WebHook 等多種通知方式。
實踐示例
代碼及其使用方法
巡檢腳本的代碼已托管至
Github,歡迎 PR。腳本的使用方式如下:
- 選擇周期性運作的環境:任意可通路 SLS 服務端的機器或是托管到相同區域内的函數計算服務。
- 配置 heartbeat_monitor.py 腳本中的參數,主要是以下參數:
- project_name: 需要監控的 SLS 項目,預設為監控該 project 下的所有機器組;
- endpoint:SLS 項目對應的 endpoint,比如 cn-hangzhou.log.aliyuncs.com;
- logtail_status_project_name:SLS 項目的服務日志的存放位置,一般為 log-service--<區域名>,比如 log-service-123232323-cn-hangzhou;
- report_logstore:用于上報巡檢異常結果的 logstore(預設為相同 project),需手動建立,如未指定,異常資訊僅會輸出在本地。
- 配置周期執行該腳本,比如在機器上建立一個 crontab 任務,每 5 分鐘執行一次。
# 假設腳本部署在 HOME 目錄下
(crontab -l 2>/dev/null; echo "*/5 * * * * python ~/heartbeat_monitor.py > ~/heartbeat_monitor.log") | crontab -
告警配置
因為隻有在發生異常的時候,巡檢腳本才會向 report_logstore 中寫入異常資訊,是以我們可以直接監控該 logstore 中是否有日志,有的話就進行告警。
查詢語句如下:
* | select count(*) as c
告警配置(每 3 分鐘執行一次):

可根據需要配置合适的告警通知方式,如下為釘釘機器人告警的示例: