需求場景:ES 叢集通過 Nginx 做了網關代理,需要把通路 ES 叢集的請求進行統計監控。
使用元件:Filebeat 收集,寫入 ES 叢集,通過 Kibana 的 dashboard 進行展示,即 ELK 的老本行,采用更輕量級的日志收集工具 Filebeat 而沒有使用 Logstash。
1. Nginx
對 Nginx 預設的日志格式進行了微調,将預設的
$time_local
修改為
$time_iso8601
,日志變化如下所示:
#before
171.0.0.1 - - [11/Nov/2021:00:00:02 +0800] 1.300 0.982 200 731171 "POST /index1/_search?timeout=30s HTTP/1.1" "-" "axios/0.19.2" "-"
#after
171.0.0.1 - - [2021-11-25T11:29:13+08:00] 0.008 0.008 200 137 "GET /index1/_search HTTP/1.1" "-" "python-urllib3/1.26.2" "-"
Nginx 日志每行12個字段含義如下:
字段 | 含義 |
---|---|
remote_addr | 用戶端IP位址 |
- | 占位符 |
remote_user | 用戶端登入使用者名沒有則置為占位符 - |
time | 通路時間和時區 |
request_time | 整個請求的總時間 |
upstream_response_time | Nginx向後端請求的時間 |
status | 請求傳回的http狀态碼 |
body_bytes_sent | 發送給用戶端的位元組數 |
request | 請求的URI和HTTP協定 |
http_referer | 哪個頁面連結通路 |
http_user_agent | 用戶端通路資訊,如浏覽器、手機用戶端等 |
http_x_forwarded_for | 用戶端的真實ip通常web伺服器放在反向代理的後面 |
2. Filebeat
Filebeat 配置比較簡單,開箱即用,配置好 Input 為 Log,Output 為 ES 即可,如下所示:
filebeat.inputs:
#=========================== Filebeat inputs =============================
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/access_whsh.log
#=========================== Filebeat inputs =============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#=========================== Filebeat inputs =============================
setup.template.settings:
index.number_of_shards: 1
#index.codec: best_compression
setup.template.name: "es-request-log"
setup.template.pattern: "es-request-log-*"
setup.template.enabled: false
setup.template.overwrite: true
setup.template.fields: "esrequestfields.yml"
setup.ilm.enabled: false
#=========================== Filebeat inputs =============================
output.elasticsearch:
hosts: ["172.0.0.1:9200","172.0.0.2:9200","172.0.0.3:9200"]
index: "es-request-log-%{+yyyy.MM.dd}"
pipeline: "es-request-log"
# Protocol - either `http` (default) or `https`.
protocol: "https"
#api_key: "id:api_key"
username: "elastic"
password: "changeme"
ssl.verification_mode: "none"
#=========================== Filebeat inputs =============================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
這裡修改了 Filebeat 自帶的預設日志模闆和預設輸出到 ES 的索引,并添加了一個 pipeline 用于對 Nginx 日志進行拆分處理(Filebeat預設将每行日志輸出到
message
字段)。
修改預設索引的模闆字段
fields.yml
,并将其導出錄入到 ES 叢集内作為記錄日志索引的 template,具體做法可以參考官網:
Load the Elasticsearch index template。
3. ES
ES 側需要配置好存放日志資料索引的模闆、ILM政策(非必須)、以及用到的 pipeline,名稱和上一步 Filebeat 配置中要對應。
- 模闆設定:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY2MjYyEjNhFTOwcDZ2IGOllzY0gzNhRzNxgTYwEjY48CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
設定好别名、比對的索引字首、一些你想配置的 settings 以及字段結構:包括 Filebeat 自帶的一些字段以及主要的日志字段
message
和我們将通過 pipeline 拆解
message
字段擷取的一些将用于日志分析的字段。
- pipeline設定:
pipeline 主要作用是對
message
字段拆解:
- 通過`grok`正則比對方式比對到`message`内部的每個字段,并将其抽出;
- 通過`script`可以加一些對抽出字段的判斷,将請求聚類分析。
這裡可以任意處理資料,擷取自己想要的分析内容,或者也可以引入Logstash對資料進行處理。
4. Kibana
經過以上三步,資料已經進入到 ES 叢集内,通過 Kibana 可以對資料分析結果進行可視化展示,忽略一些 Filebeat 自帶的字段,資料内容如下所示:
我們可以對時間字段,某些 keyword 類字段進行聚合等統計數一些日志分析結果,并使用 dashboard 進行展示,部分示例如下:
- 統計請求的響應狀态:
- 分類統計時間段的請求數量:
- 統計查詢耗時的 pct (參考 jmeter 名額):
- 展示部分請求的部分字段(data table展示topN耗時等):