Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1760302
  • 博文数量: 150
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 11:39
文章分类

全部博文(150)

文章存档

2019年(4)

2018年(36)

2017年(53)

2016年(7)

2015年(3)

2014年(3)

2013年(27)

2012年(2)

2011年(1)

2006年(1)

2005年(13)

分类: 系统运维

2017-06-06 16:47:32

按照http访问路径进行访问量的统计和展现的一次实践

摘要

笔者在通过web界面展现由自定义脚本统计各http(按照http访问路径分类)服务在特定时间周期的访问量的项目中,通过zabbix trapper设置和自定义shell脚本相结合的方式实现了统计和展现需求,有如下两个特点:

性能高

平均统计上百万行日志耗时并发送到zabbix server后通过web 界面展现出来耗时在4秒内

可扩展性高

可以根据不同时间周期统计;
可以根据策略筛选不同的服务进行统计;

背景

最近遇到部分服务不稳定,需要判断是访问量过高,还是服务自身的问题导致的,对该类型服务的客户端访问量进行统计和分析就提上了日程,通过自定义脚本按照一定时间周期统计本周期内各个http访问(一级目录分类)nginx日志,不同目录对应不同功能,从而实现了应用各功能模块的访问量统计。

需要解决的问题

开发和运营人员查看方便

 通过web界面展现,再辅以权限控制可以完美解决该需求。

性能要好

统计功能不能占用过高的cpu和内存、磁盘等资源,因为都是线上机器。

历史记录追溯

统计记录需要有保存时限,通常为一年,一年内的历史数据方便查看和对比。

具体的解决理论依据

zabbix具有很强大功能及易用的图形界面 完全满足界面展示、历史记录追溯查看、权限控制等需求 自定义shell脚本完成日志的采集和统计 完全满足关于性能方面的要求

解决过程

环境说明

zabbix

  • zabbix server 3.2.4
  • zabbix agent 2.4.7
  • zabbix_sender 2.4.7

主机

  • centos7
  • bash 

nginx

  • nginx version: nginx/1.12.0
  • 标准日志格式

自定义shell脚本采集和统计日志

日志格式

  • http
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"
  • tcp
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内的值保持一致

zabbix相关设置过程

创建模板

登录后,步骤:Configuration->Templates->Create template->输入模板名字"nginxbydir"保存 贴图略

创建项目

步骤:Configuration->Templates->点击 nginxbydir模板的Items->进入items设置->点击右上角的Create item ->输入Name、选择Type为Zabbix trapper、输入Key->依次创建所需的items

设置主机使用该模板

zabbix_sender测试

crontab设置

总结

至此,应该可以满足

存在问题

  • 考虑统计数据的时候某个目录访问次数为0的话,如果发送数据0给zabbix server
  • 考虑多个主机数据汇总的图形展示
阅读(8245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~