全部博文(150)
分类: 系统运维
2017-06-06 16:47:32
笔者在通过web界面展现由自定义脚本统计各http(按照http访问路径分类)服务在特定时间周期的访问量的项目中,通过zabbix trapper设置和自定义shell脚本相结合的方式实现了统计和展现需求,有如下两个特点:
性能高
平均统计上百万行日志耗时并发送到zabbix server后通过web 界面展现出来耗时在4秒内
可扩展性高
可以根据不同时间周期统计; 可以根据策略筛选不同的服务进行统计;
最近遇到部分服务不稳定,需要判断是访问量过高,还是服务自身的问题导致的,对该类型服务的客户端访问量进行统计和分析就提上了日程,通过自定义脚本按照一定时间周期统计本周期内各个http访问(一级目录分类)nginx日志,不同目录对应不同功能,从而实现了应用各功能模块的访问量统计。
开发和运营人员查看方便
通过web界面展现,再辅以权限控制可以完美解决该需求。
性能要好
统计功能不能占用过高的cpu和内存、磁盘等资源,因为都是线上机器。
历史记录追溯
统计记录需要有保存时限,通常为一年,一年内的历史数据方便查看和对比。
zabbix具有很强大功能及易用的图形界面 完全满足界面展示、历史记录追溯查看、权限控制等需求 自定义shell脚本完成日志的采集和统计 完全满足关于性能方面的要求
zabbix
主机
nginx
日志格式
117.61.128.188 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.009 uct="0.000" uht="0.009" urt="0.009" 117.61.129.158 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cnn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.011 uct="0.000" uht="0.011" urt="0.011" 117.61.134.167 - - [06/Jun/2017:10:08:01 +0800] "some.domain.cn" "POST /tripWeb/track.htm HTTP/1.1" 200 53 "-" "Dalvik/2.1.0 (Linux; U; Android 5.1.1; CARBOX Build/LMY47V)" "-" rt=0.008 uct="0.000" uht="0.008" urt="0.008"
117.61.132.69 [06/Jun/2017:13:20:00 +0800] TCP 200 55 30 0.023 "10.0.1.21:59001" "30" "55" "0.000" 117.61.132.69 13655 10.0.1.12 59001 115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59001" "0" "0" "0.000" 115.159.128.92 11792 10.0.1.12 59001 115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59002" "0" "0" "0.000" 115.159.128.92 41148 10.0.1.12 59002 115.159.128.92 [06/Jun/2017:13:20:01 +0800] TCP 200 0 0 0.027 "10.0.1.21:59003" "0" "0" "0.000" 115.159.128.92 32925 10.0.1.12 59003
脚本
#!/bin/sh access_log=/var/log/nginx/your_nginx.log tcp_log=/var/log/nginx/your_tcp_access.log sendkeys="trip tripWeb tripWeixin 59001 59002 59003" cur_time=`date +%d/%b/%Y:%H:%M:%S` if [ $1 ] ; then time_dur=$1 else time_dur=5 fi ago_time=`date -d "$time_dur minutes ago" +%d/%b/%Y:%H:%M:%S` # for debugging #echo $cur_time $ago_time temp_file=/tmp/count_$time_dur_mins.tmp count_by_name() { # http awk -F' |?' '{if((substr($4,2,20)>=start)&&(substr($4,2,20)<=end)){split($8,aa,"/");name[aa[2]]=aa[2];cnt[aa[2]]+=1}}END{for(i in name)print name[i],cnt[i]}' start=$ago_time end=$cur_time $access_log >>$temp_file # tcp awk -F' |"' '{if((substr($2,2,20)>=start)&&(substr($2,2,20)<=end)){s[$10]=$10;cnt[$10]+=1}}END{for(i in s)print s[i],cnt[i]}' start=$ago_time end=$cur_time $tcp_log |awk -F' |:' '{print $2,$3}' >>$temp_file } send_to_server() { while read name count do #echo $name $count #echo $sendkeys if [[ "$sendkeys" =~ "$name" ]] ; then echo $name $count zabbix_sender -z 10.0.1.2 -s `hostname` -k $name -o $count fi done < $temp_file } count_by_name send_to_server :>$temp_file
脚本运行输出及注意事项
./nginx_by_name.sh 10 #10分钟统计,假设如下统计结果 system 676 authorityManage 116 cdcGraph 712 favicon.ico 7 cdcMessageQueue 76
注意事项
system为发送给zabbix server的Key,需要保持同创建item的Key一致;
676为该Key的值;
zabbix_sender中的 hostname命令返回值必须同zabbix frontend中定义的主机中的Host name内的值保持一致
创建模板
登录后,步骤:Configuration->Templates->Create template->输入模板名字"nginxbydir"保存 贴图略
创建项目
步骤:Configuration->Templates->点击 nginxbydir模板的Items->进入items设置->点击右上角的Create item ->输入Name、选择Type为Zabbix trapper、输入Key->依次创建所需的items
设置主机使用该模板
zabbix_sender测试
crontab设置
至此,应该可以满足