通过nginx访问日志快速展示/分析平台使用量(Filebeat+Elasticsearch+Grafana)
简介
对于一个平台的使用量信息,部分是可通过db里的数据统计出来的,而另外一部分如果没有在接口进行数据埋点的话(例如一些GET请求,可能没有对DB或其他存储做任何操作),则统计起来会比较困难。这个时候能想到的就是日志,而通常只关心用户的操作的话,nginx的access日志是最好的选择,本文以后端接口调用的nginx访问日志为源,使用Filebeat+Elasticsearch+Grafana快速搭建针对平台使用量(可用于系统压力分析,用户行为分析,热点功能分析等)的数据可视化展示。
概览
本着快速搭建的目标,整体结构尽可能简单,下图中橘色的部分即本文介绍的重点。
搭建部署
由于ES作为数据源要在Grafana中添加,同时作为日志数据的中间存储,也需要配置到Filebeat进行数据推送,所以下面先搭建ES(如果使用已有ES集群,请注意与Filebeat的版本匹配,Elastic的全家桶推荐同版本配合使用,否则请先测试兼容性)
ElasticSearch
ES用于存储解析后的nginx访问日志,作为数据源供Grafana生成可视化数据图表。如果使用已有集群,可跳过此节
官方下载(本文使用版本为7.13.2)
https://www.elastic.co/downloads/elasticsearch
安装配置(linux环境)
下载
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.2-linux-x86_64.tar.gz
tar xzvf elasticsearch-7.13.2-linux-x86_64.tar.gz
cd elasticsearch-7.13.2
如果只是本地进行测试,基本上不需要配置,直接启动即可(只能本地访问),但如果是需要对外提供服务,需要进行配置(本文只做简单的单节点服务配置)
vi config/elasticsearch.yml
找到network.host进行配置:network.host: 0.0.0.0
保存
启动xpack安全认证
vi config/elasticsearch.yml
添加如下配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
保存
配置为单节点模式(本文只简单启动一个单节点ES,如果需配置集群请参考ES文档)
vi config/elasticsearch.yml
添加 discovery.type: single-node
保存
初始化ES的keystore
./bin/elasticsearch-keystore create
初始化ES账户密码(自行设置密码或自动生成密码, 需要先启动服务)
./bin/elasticsearch -d
./bin/elasticsearch-setup-passwords interactive
[可选自动生成密码]./bin/elasticsearch-setup-passwords auto
重启服务
Filebeat
Filebeat用于读取nginx access log并把解析后的数据推送但es,配置好后,它就会实时的自动把新写入的nginx access日志推送到es,保证我们的可视化数据是最新的
官方下载(本文使用版本为7.13.2)
https://www.elastic.co/downloads/beats/filebeat
安装配置(linux环境)
下载
curl -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.2-linux-x86_64.tar.gz
tar zxvf filebeat-7.13.2-linux-x86_64.tar.gz
cd filebeat-7.13.2-linux-x86_64
启用nginx模块
./filebeat modules enable nginx
配置nginx访问日志路径
vi modules.d/nginx.yml
配置access log路径
- module: nginx
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/data/logs/nginx/myapp.access.log"]
配置filebeat推送日志到ES
vi filebeat.yml
添加 Elasticsearch template setting
# ======================= Elasticsearch template setting =======================
setup.ilm.enabled: false
setup.template.name: "es-nginx"
setup.template.pattern: "es-nginx-*"
添加 ES Output
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["xx.xx.xx.xx:9200"]
# Protocol - either `http` (default) or `https`.
#protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "your password"
index: "es-nginx-your-app"
启动filebeat
filebeat -e -c filebeat.yml
Grafana
官方下载(本文使用版本为8.0.3)
https://grafana.com/grafana/download/8.0.3?pg=get&plcmt=selfmanaged-box1-cta1&edition=oss
安装配置(linux环境)
下载
curl -O https://dl.grafana.com/oss/release/grafana-8.0.3.linux-amd64.tar.gz
tar -zxvf grafana-8.0.3.linux-amd64.tar.gz
cd grafana-8.0.3
启动
./bin/grafana-server web
访问http://localhost:3000, 默认用户名密码admin/admin(第一次登录可以修改)
创建可视化数据
登录Grafana http://localhost:3000
配置数据源
把我们前面部署的ES作为数据源添加到Grafana里,选择设置->数据源
保存测试没有问题的话,就可以开始创建Dashboard了
创建Dashboard
选择添加Dashboard并添加一个空的panel
如果一切正常的话,应该就可以看到从ES中拿到的数据了
通过Lucene Query筛选特定数据
默认情况下获取到的是全部nginx访问日志,展示数据图表为分时接口访问量(因为本文示例的日志是后端服务接口的access log),如果你正好想分析下用户在什么时间使用量怎么样,那无需其他设置,这个图表就够用了,在上方可以选择时间范围,只要你的日志数据量足够,就可以按日,按月,按年进行展示和分析了(注意:如果原始日志数据量较大,filebeat可能需要一定的时间把日志分析完后推送到ES)
那么如果我们要具体分析某一特定用户行为的平台使用量呢?这个时候就需要过滤筛选数据了,filebeat默认解析出来的日志格式中关键内容如下(可以通过ES的client连接到ES上查看具体数据格式样式,不同版本可能会有差异)
{
"url": {
"original": "/v1/list"
},
"@timestamp": "2021-09-01T06:02:14.000Z",
"http": {
"request": {
"method": "GET"
},
"response": {
"status_code": 200,
"body": {
"bytes": 148
}
},
"version": "1.1"
}
}
其中@timestamp就是Grafana中的横轴时间数据,所有日志数据通过filebeat解析并推送到ES时都必有此字段,然后url.original即用户访问后端服务接口请求path,http.request和http.response分别对应接口的请求和响应基本信息
例如一个GET的接口/v1/show是一个展示某重要数据的接口,我们想分析下每天这个重要数据被展示了多少次就可以通过以下query和设置Interval:1d来实现:
url.original: “/v1/show” AND http.request.method: “GET”
总结
由于本文主要是想通过nginx access日志数据进行展示,并未介绍Grafana添加mysql或其他数据源的使用,需要的老师请参考Grafana官方文档。
- END -
推荐阅读
长按,扫码,关注
及时收看更多精彩内容