接前一篇文章filebeat+logstash+elasticsearch+kibana解析nginx日志并展示
1.创建三个脚本
-
1.1 getSourceApis.sh
利用脚本,拼写查询语句,获取最新一分钟内被调用的接口信息,存入到一个临时文件中result.json
。利用crontab,设置每分钟查询一次脚本。执行
crontab -e
后,加入如下命令:*/1 * * * * /path/to/getSourceApis.sh > /tmp/result.json
-
脚本内容如下:
#!/bin/bash curl -XGET -H "Content-Type:application/json" 127.0.0.1:9200/filebeat-6.5.4-*/_search -d ' { "aggs": { "apis": { "terms": { "field": "api", "size": 9000 } } }, "query": { "bool": { "must": [ "range": { "@timestamp": { "gte": "now-1m", "lte": "now" } } { "query_string": { "default_field": "*", "query": "(NOT nginx.access.url:*.js) AND (NOT nginx.access.url:*.css) AND (NOT nginx.access.url:*.ico) AND (NOT nginx.access.url:*.png) AND (NOT nginx.access.url:*.jpeg) AND (NOT nginx.access.url:*.jpg) AND (NOT nginx.access.url:*.gif)", "analyze_wildcard": true } } ] } }, "size": 0 }'
获取的结果为json格式,包含所有的api和对应的数量。
-
结果数据格式如下:(方便展示,对数据进行了格式化)
{ "took" : 48, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 494, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "apis" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "/aaa/bbb/ccc", "doc_count" : 50 }, { ... }, { "key" : "/ddd/eee/fff", "doc_count" : 13 } ] } } }
利用crontab设置定时器,每分钟执行一次,结果输出到一个临时文件中
result.json
,便于getmetrics.py
脚本获取最新数据,并转换成特定的数据格式。
-
-
1.2 getmetrics.py
将临时文件result.json
中的数据转换为特定的数据格式,才能被zabbix自动发现。-
脚本内容如下:
import json with open("/tmp/result.json","r") as load_f: data = json.load(load_f) result = data['aggregations']['apis']['buckets'] devices = [] for one in result: devices.append({"{#URL}": one['key']}) print json.dumps({'data': devices}, sort_keys=True, indent=4)
设置宏变量#URL,在zabbix自动发现中可以获取宏变量的值。
-
转换后的特定数据格式如下:
{ "data": [ { "{#URL}": "/aaa/bbb/ccc" }, {...}, { "{#URL}": "/ddd/eee/fff" } ] }
在zabbix-agent配置文件中,执行该脚本,将格式化后的数据打印在控制台中,便于zabbix获取宏变量{#URL}的值。
-
-
nginx_api_metrics.sh
传入url和metic,获取该url的totaltime对应的指标值
执行./nginx_api_metrics.sh <URL> <METRIC>
,获取各个Api的各项指标数据。(METRIC
为value_count、avg、max、min。前一分钟的数量、平均值、最大值、最小值)- 脚本内容为:
#!/bin/bash HOST="127.0.0.1" PORT="9200" DATE=$(date +%Y.%m.%d) URL=$1 METRIC=$2 #截取json数据中的数据 function get_json_value() { local json=$1 local key=$2 if [[ -z "$3" ]]; then local num=1 else local num=$3 fi local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p) echo ${value} } RESPONSE=$(curl -XGET -s -H "Content-Type:application/json" $HOST:$PORT/filebeat-6.5.4-$DATE/_search -d ' { "aggs": { "result": { '\"$METRIC\"': { "field": "totaltime" } } }, "query": { "bool": { "must": [ { "range": { "@timestamp": { "gte": "now-1m", "lte": "now" } } }, { "match_phrase": { "nginx.access.url": '\"$URL\"' } } ] } }, "size": 0 }') get_json_value $RESPONSE value
- 在zabbix-agent配置文件中,执行该脚本,获取具体url的metric值。
- 脚本内容为:
2.zabbix-agent中的配置信息
- 在
zabbix_agentd.conf
中,设置脚本配置文件位置Include=/etc/zabbix/zabbix_agentd.d/*.conf #以root权限执行 AllowRoot=1 User=root
- 在
/etc/zabbix/zabbix_agentd.d/
下创建配置文件nginx_api_metrics.conf
,内容如下:UserParameter=nginx.api.discovery,python /path/to/getmetrics.py #$1为`<URL>`,$2为`<METRIC>` UserParameter=nginx.api[*],sh /path/to/nginx_api_metrics.sh $1 $2
- 注意:
- 赋予脚本执行权限,否则不能正常获取key值。
sudo chmod +x /path/to/getmetrics.py sudo chmod +x /path/to/nginx_api_metrics.sh
- 赋予脚本执行权限,否则不能正常获取key值。
3.重启zabbix-agent
- 执行命令
systemctl restart zabbix-agent
4.测试键值nginx.api[<URL>
<METRIC>
]
- 测试键值是否有效
- 在zabbix-agent端执行
#命令:./zabbix_agent -t "nginx.api[<URL> <METRIC>]" #结果:<key> [t|<value>] ./zabbix_agent -t "nginx.api[/aaa/bbb/ccc,value_count]" nginx.api[/aaa/bbb/ccc,value_count] [t|12]
- 在zabbix-server端执行
#命令:./zabbix_get -s 127.0.0.1 -k "nginx.api[<URL>,<METRIC>]" #结果:<value> ./zabbix_get -s 127.0.0.1 -k "nginx.api[/aaa/bbb/ccc,value_count]" 23
- 在zabbix-agent端执行
5.在zabbix-agent下创建发现规则、监控项原型、图形原型
- 创建自动发现规则
名称:nginx.api.discovery 键值:nginx.api.discovery 数据更新间隔:60s
- 给发现规则创建监控项原型
#四个指标(value_count、avg、max、min) 名称:nginx.api[{#URL},value_count] 键值:nginx.api[{#URL},value_count] 新的应用集:nginxapimetrics
- 创建图形原型
名称:nginx.api[{#URL}] monitor 添加原型,将 nginx.api[{#URL},value_count], nginx.api[{#URL},max], nginx.api[{#URL},avg], nginx.api[{#URL},min]全部加入监控项中。
- 时间和数据度量不一样,最好创建两个图形原型分别展示。
6.查看最新数据和图形界面
- 在检测->最新数据中,查看最新数据
- 在主机->图形中,查看生成的图形。
- 在检测->聚合图像中,创建聚合图像,多个组合展示图形。