返回文章列表

日誌轉換指標與探針監控實踐

本文探討如何使用 mtail 從應用程式日誌中提取指標,並結合 Prometheus 和 Blackbox Exporter 實作全面的監控體系。文章涵蓋 mtail 安裝、組態、常用案例以及 Blackbox Exporter 的佈署和使用,提供實用的操作和範例程式碼,幫助讀者快速上手日誌監控和探針監控。

監控 DevOps

日誌資料是監控系統的重要資料來源,尤其在無法直接檢測應用程式內部狀態的情況下,從日誌中提取指標就顯得尤為重要。mtail 作為一款日誌處理工具,可以有效地解析日誌並生成 Prometheus 可用的指標。同時,Blackbox Exporter 則能從外部探測應用程式狀態,彌補日誌監控的不足。結合這兩種工具,可以構建更全面的監控體系。

第9章:將日誌用作儀表化

在前面的章節中,我們探討了根據應用程式、主機和容器的監控。在本章中,我們將研究如何使用日誌資料作為時間序列資料的來源,以便Prometheus進行抓取。雖然我們的主機、服務和應用程式可以生成關鍵的指標和事件,但它們也經常生成可以告訴我們有關其狀態和狀態的有用資訊的日誌。

為什麼使用日誌進行儀表化

尤其是在監控遺留應用程式時,這種情況尤其如此,因為這些應用程式沒有被儀表化,或者由於技術限制而無法進行儀表化。在這種情況下,重寫、修補或重構該應用程式以暴露其內部狀態的成本可能不是一個好的工程投資。然而,我們仍然需要了解應用程式內部正在發生的事情,而適應日誌輸出是實作這一目標的最簡單方法之一。

從日誌中提取指標

為了從日誌條目中提取資料,我們將使用日誌處理工具。有幾種工具可供選擇,包括Grok Exporter和Google的mtail。我們選擇了mtail,因為它更輕量級且更受歡迎。

mtail簡介

mtail日誌處理器是由Google的SRE團隊編寫的。它是一個根據Apache 2.0許可證的Go應用程式。mtail專門設計用於從應用程式日誌中提取指標,以便匯出到時間序列資料函式庫。它旨在填補我們上面描述的空白:解析無法匯出其內部狀態的應用程式的日誌資料。

mtail透過執行“程式”來工作,這些程式定義了日誌比對模式,並指定了從比對結果中建立的指標以及要執行的操作。它與Prometheus配合良好,可以將建立的指標暴露給Prometheus進行抓取,但也可以組態為將指標傳送到collectd、StatsD或Graphite等工具。

安裝mtail

mtail日誌處理器以單個二進位制檔案的形式發布:mtail。它被封裝用於多種作業系統,包括Linux、OS X和Microsoft Windows。

下載和安裝mtail

$ wget https://github.com/google/mtail/releases/download/v3.0.0-rc13/mtail_v3.0.0-rc13_linux_amd64 -O mtail
$ chmod 0755 mtail
$ sudo cp mtail /usr/local/bin

我們可以透過執行帶有--version標誌的mtail來確認它是否正常工作。

$ mtail --version
mtail version v3.0.0-rc13-119-g01c76cd git revision 01c76cde1ee5399be4d6c62536d338ba3077e0e7 go version go1.8.3

使用mtail

mtail二進位制檔案透過命令列進行組態。您需要指定要解析的日誌檔案列表,以及要在這些檔案上執行的程式目錄。

建立mtail程式目錄
$ sudo mkdir /etc/mtail

現在,讓我們在新目錄中建立第一個mtail程式。每個mtail程式都需要以.mtail為字尾。讓我們建立一個名為line_count.mtail的新程式。這是最簡單的mtail程式:每次解析新行時,它都會遞增一個計數器。

$ sudo touch /etc/mtail/line_count.mtail

並填充該檔案。

counter line_count
/$/ {
  line_count++
}

執行mtail

要執行mtail,我們需要指定一些要執行的程式和一些要解析的日誌檔案。

$ sudo mtail --progs /etc/mtail --logs '/var/log/*.log'

內容解密:

  1. counter line_count:定義了一個名為line_count的計數器,用於記錄比對到的日誌行數。
  2. /$/ { line_count++ }:這是一個條件-動作陳述式。條件/$/是一個正規表示式,比對每一行的結尾(即比對每一行)。當條件滿足時,執行動作line_count++,即將line_count計數器遞增1。
  3. mtail --progs /etc/mtail --logs '/var/log/*.log':執行mtail,指定程式目錄為/etc/mtail,並解析/var/log/目錄下所有.log檔案。

這樣,mtail就會對指定的日誌檔案進行監控,並根據定義的規則對日誌行進行計數,將計數結果暴露給Prometheus進行抓取。

使用 mtail 進行日誌監控與指標收集

mtail 是一款強大的工具,能夠解析日誌檔案並從中提取指標。本章將介紹如何使用 mtail 來處理日誌並產生 Prometheus 可用的指標。

執行 mtail

執行 mtail 需要指定兩個主要引數:--progs--logs。前者告訴 mtail 程式檔案的位置,後者指定要解析的日誌檔案路徑。可以使用 glob 模式比對多個日誌檔案。

mtail --progs /path/to/progs --logs '/var/log/*.log'

重點注意事項:

  1. 許可權問題:執行 mtail 的使用者需要具備讀取目標日誌檔案的許可權,否則會出現讀取錯誤。
  2. 日誌檔案截斷處理:mtail 能夠處理日誌檔案截斷、服務重啟和日誌輪替等情況。

mtail 網頁介面

執行 mtail 後,會在預設的 3903 連線埠啟動一個網頁伺服器。存取這個網頁介面可以看到:

  • mtail 的版本資訊
  • 各種指標輸出格式(包括 Prometheus)
  • 已載入的程式和正在追蹤的日誌檔案

重點指標輸出:

  • JSON 格式
  • varz(Google 內部指標收集格式)
  • Prometheus 格式

解析 Apache 存取日誌

使用 mtail 提供的範例程式 apache_combined.mtail,可以解析 Apache 的 combined 日誌格式。

程式碼範例:

# Parser for the common apache "NCSA extended/combined" log format
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
counter apache_http_requests_total by request_method, http_version, request_status
counter apache_http_bytes_total by request_method, http_version, request_status

/^/ +
/(?P<hostname>[0-9A-Za-z\.-]+) / + # %h
/(?P<remote_logname>[0-9A-Za-z-]+) / + # %l
/(?P<remote_username>[0-9A-Za-z-]+) / + # %u
/(?P<timestamp>\[\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} (\+|-)\d{4}\]) / + # %t
/"(?P<request_method>[A-Z]+) (?P<URI>\S+) (?P<http_version>HTTP\/[0-9\.]+)" / + # \"%r\"
/(?P<request_status>\d{3}) / + # %>s
/(?P<response_size>\d+) / + # %b
/"(?P<referer>\S+)" / + # \"%{Referer}i\"
/"(?P<user_agent>[[:print:]]+)"/ + # \"%{User-agent}i\"
/$/ {
  apache_http_requests_total[$request_method][$http_version][$request_status]++
  apache_http_bytes_total[$request_method][$http_version][$request_status] += $response_size
}

#### 內容解密:

  1. 定義計數器:使用 counter 關鍵字定義兩個指標,分別用於統計 HTTP 請求次數和總位元組數。
  2. 正規表示式比對:使用一系列正規表示式來比對 combined 日誌格式中的各個欄位。
  3. 命名擷取群組:使用 (?P<name>pattern) 的形式擷取欄位值,如 request_methodresponse_size
  4. 動作:在比對成功後執行的程式碼中,更新兩個計數器的值。

透過結合 mtail 和 Prometheus,可以建立強大的日誌監控和指標收集系統,為系統維運和開發人員提供深入的洞察力。未來可以進一步探索更多 mtail 的進階功能,例如自訂正規表示式和處理更複雜的日誌格式。

第9章:將日誌作為監控工具

使用 mtail 進行日誌處理

在許多情況下,我們無法直接對應用程式進行檢測,或者檢測的成本過高。此時,利用日誌條目來提供指標就變得尤為重要。mtail 是一款強大的日誌處理工具,可以幫助我們從日誌中提取有用的指標。

執行 mtail

首先,我們需要執行 mtail 並指定程式和日誌檔案的位置。以下是一個範例命令:

$ sudo mtail --progs /etc/mtail --logs '/var/log/apache/*.access'

接著,存取 /metrics 路徑,即可檢視產生的指標:

Apache 結合指標

# TYPE apache_http_requests_total counter
# apache_http_requests_total defined at apache_combined.mtail:6:9-34
apache_http_requests_total{http_version="HTTP/1.1", request_method="GET", request_status="200", prog="apache_combined.mtail"} 73
# apache_http_requests_total defined at apache_combined.mtail:6:9-34
apache_http_requests_total{http_version="HTTP/1.1", request_method="GET", request_status="304", prog="apache_combined.mtail"} 3
# TYPE apache_http_bytes_total counter
# apache_http_bytes_total defined at apache_combined.mtail:7:9-31
apache_http_bytes_total{http_version="HTTP/1.1", request_method="GET", request_status="200", prog="apache_combined.mtail"} 2814654
# apache_http_bytes_total defined at apache_combined.mtail:7:9-31
apache_http_bytes_total{http_version="HTTP/1.1", request_method="GET", request_status="304", prog="apache_combined.mtail"} 0

將 Rails 日誌解析為直方圖

Rails 請求日誌對於衡量效能非常有用,但解析起來有些困難。下面是 mtail 程式的一個範例,用於解析 Rails 日誌:

mtail rails 程式

counter rails_requests_started_total
counter rails_requests_started by verb
counter rails_requests_completed_total
counter rails_requests_completed by status
counter rails_requests_completed_milliseconds_sum by status
counter rails_requests_completed_milliseconds_count by status
counter rails_requests_completed_milliseconds_bucket by le, status

/^Started (?P<verb>[A-Z]+) .*/ {
  rails_requests_started_total++
  rails_requests_started[$verb]++
}

/^Completed (?P<status>\d{3}) .+ in (?P<request_milliseconds>\d+)ms .*$/ {
  rails_requests_completed_total++
  rails_requests_completed[$status]++
  rails_requests_completed_milliseconds_sum[$status] += $request_milliseconds
  rails_requests_completed_milliseconds_count[$status]++
  
  # 10ms bucket
  $request_milliseconds <= 10 {
    rails_requests_completed_milliseconds_bucket["10"][$status]++
  }
  
  # 50ms bucket
  $request_milliseconds <= 50 {
    rails_requests_completed_milliseconds_bucket["50"][$status]++
  }
  ...
}

Rails mtail 指標輸出

rails_requests_started_total{prog="rails.mtail"} 44
rails_requests_started{verb="POST", prog="rails.mtail"} 19
rails_requests_started{verb="PUT", prog="rails.mtail"} 18
rails_requests_started{verb="GET", prog="rails.mtail"} 7
rails_requests_completed_total{prog="rails.mtail"} 217
rails_requests_completed{status="200", prog="rails.mtail"} 217
rails_requests_completed_milliseconds_sum{status="200", prog="rails.mtail"} 3555
rails_requests_completed_milliseconds_count{status="200", prog="rails.mtail"} 217
rails_requests_completed_milliseconds_bucket{le="10", status="200", prog="rails.mtail"} 93
rails_requests_completed_milliseconds_bucket{le="50", status="200", prog="rails.mtail"} 217
...

部屬 mtail

我們建議為每個應用程式執行一個 mtail 例項,並透過組態管理作為依賴項進行佈署。這種模式通常被稱為 sidecar,特別適用於容器化應用程式。

從 mtail 端點抓取指標

現在,我們已經有了一些暴露出來的指標,接下來需要建立一個 Prometheus job 來抓取這些指標。

mtail job 組態

scrape_configs:
  - job_name: 'mtail'
    file_sd_configs:
      - files:
          - 'targets/mtail/*.json'
        refresh_interval: 5m

Worker 檔案發現

[{
  "targets": [
    "web:3903",
    "rails:3903"
  ]
}]

重新啟動 Prometheus 後,我們現在可以收集由 mtail 程式產生的時間序列資料,並利用這些指標進行監控。

探針監控:深入瞭解應用程式外部狀態

在第一章中,我們討論了監控應用程式的兩種主要方法:探針(Probing)和內省(Introspection)。本章將探討探針監控的概念、架構和實作方法。

探針監控原理

探針監控是透過查詢應用程式的外部特徵來監控其狀態,例如檢查應用程式是否對開放埠的輪詢做出回應,或傳回正確的資料或回應程式碼。簡單來說,就是把應用程式當作一個黑盒子(Black Box),不關心其內部實作,只關注外部表現。

探針監控架構

探針監控的工作原理是透過執行一個匯出器(Exporter),即 Blackbox Exporter,來探測遠端目標並在本地端點上公開收集到的時間序列資料。然後,Prometheus 伺服器會從該端點抓取指標。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 探針監控架構

rectangle "Scrape" as node1
rectangle "Probe" as node2
rectangle "Response" as node3
rectangle "Metrics" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

此圖示展示了 Prometheus 伺服器、Blackbox Exporter 和目標應用程式之間的互動關係。

探針監控的限制

探針監控有三個主要限制:

  1. 探針需要能夠看到被探測的資源。
  2. 探針的位置需要測試到資源的正確路徑。
  3. 探針匯出器的位置需要能夠被 Prometheus 伺服器抓取。

為了確保最大程度的故障檢測和使用者經驗資料收集,通常會在組織網路外佈署地理分佈的探針。

Blackbox Exporter

Blackbox Exporter 是一個單一的 Go 二進位制應用程式,採用 Apache 2.0 許可證。它允許透過 HTTP、HTTPS、DNS、TCP 和 ICMP 對端點進行探測。其架構與其他匯出器略有不同,在匯出器內部定義了一系列模組,用於執行特定的檢查。

安裝 Blackbox Exporter

Blackbox Exporter 可以在 Prometheus.io 的下載頁面找到對應平台的二進位制檔案。目前支援多個平台,包括 Linux、Mac OS X、FreeBSD、OpenBSD、NetBSD、Microsoft Windows 和 DragonFly。

在 Linux 上安裝
  1. 下載對應版本的 Blackbox Exporter。
$ cd /tmp
$ wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbox_exporter-0.12.0.linux-amd64.tar.gz
  1. 解壓並安裝。
$ tar -xzf blackbox_exporter-0.12.0.linux-amd64.tar.gz
$ sudo cp blackbox_exporter-0.12.0.linux-amd64/blackbox_exporter /usr/local/bin/
  1. 檢查版本確認安裝成功。
$ blackbox_exporter --version

在 Microsoft Windows 上安裝

  1. 建立目錄並下載對應版本的 Blackbox Exporter。
C:\> MKDIR blackbox_exporter
C:\> CD blackbox_exporter
  1. 使用工具如 7-Zip 解壓下載的檔案到 C:\blackbox_exporter 目錄。
  2. C:\blackbox_exporter 目錄新增到系統路徑。
$env:Path += ";C:\blackbox_exporter"
  1. 執行 blackbox_exporter.exe --version 檢查版本。

使用組態管理工具安裝

一些組態管理模組也可以用於安裝 Blackbox Exporter,詳細方法可以參考相關檔案。

#### 內容解密:

上述步驟展示瞭如何在不同作業系統上安裝 Blackbox Exporter。首先,我們需要從官方網站下載對應版本的二進位制檔案。接著,根據不同的作業系統執行相應的安裝步驟。在 Linux 系統上,我們使用 wget 下載並使用 tar 解壓縮檔案,最後將二進位制檔案複製到 /usr/local/bin/ 目錄。在 Windows 系統上,我們則需要建立一個目錄,下載並解壓縮檔案到該目錄,並將該目錄新增到系統路徑中。無論在哪個平台,安裝完成後都應該檢查版本以確認安裝成功。組態管理工具也提供了另一種安裝方式,可以根據實際需求選擇合適的方法。這些步驟共同確保了 Blackbox Exporter 能夠正確安裝並執行,為後續的探針監控做好準備。