ATS插件channel_stats源码分析解读

简介
channel_stats插件能对每个channel收集运行时统计信息(速率,请求数,更多选项将在未来添加),这些统计信息通过http json方式输出,这些
接口代码取自stats_over_http插件。通常,该插件只用于具有*固定*个数的remap规则的反向代理服务器,它并非为那些不限制channel的代理服务器,比如open-relay forward proxy而设计的。

编译安装
使用方法
参见另一篇博文:
http://blog.csdn.net/tao_627/article/details/46275877

目前提供的统计项
 - response.bytes.content: transferred content length (not including header)
 - response.count.2xx.get: 2xx transaction count
 - response.count.5xx.get: 5xx transaction count
 - speed.ua.bytes_per_sec_64k: count of transaction whose speed is < 64KBps
 
另外可选参数选项
 - topn: only output top N channels order by response count
 - channel: only output the channels which contain specific string
 - global: also display TS internal stats as 'stats_over_http' plugin

源码解读

1.数据结构的定义

#define MAX_MAP_SIZE 100000
定义remap.config中的regex_map规则最多到1万行,以避免潜在的攻击

static std::string api_path("_cstats");
定义api的path是_cstats,如果带有这种path的url请求,就断定它是查询channel信息的请求

定义全局的状态统计信息
static uint64_t global_response_count_2xx_get = 0; // 2XX GET response count
static uint64_t global_response_bytes_content = 0; // transferred bytes

struct channel_stat
对一个channel的统计项信息都罗列在这个结构体中,目前只有这4项,后续根据业务发展,可能大量增加统计项
  uint64_t response_bytes_content;
  uint64_t response_count_2xx;
  uint64_t response_count_5xx;
  uint64_t speed_ua_bytes_per_sec_64k;
  
struct intercept_state_t
截获状态结构体,定义了与ATS内核proxy主模块获取数据时有关的一些数据结构,下面的这几个选项是非常重要的:
  int output_bytes;
  int body_written;   //body发送出去了吗?
  int show_global; // default 0
  char *channel;   // default ""
  int topn;        // default -1
  int deny;        // default 0
这几个选项说明了,在获取内核状态统计信息时,是全局信息,还是特定channel信息,是topn排名,还是允许查询该域名
(只有内网私有IP和IPv4类型的才允许查询这种统计信息)

struct private_seg_t
定义了子网和掩码,在全局静态变量private_segs数组中预置了内网私有ip相关信息,并借此判断内网ip和是否是同一网段。
这样做的目的是,只允许ATS同一局域网内的用户才能查询相应的频道信息
inet_pton:将“点分十进制” -> “二进制整数”
inet_ntop函数原型如下[将“二进制整数” -> “点分十进制”]

2.插件基本思想
现在插件配置文件plugin.config中配置
channel_stats.so test_stats
来设置接口访问API中url的path是这里的test_stats,它将会覆盖默认值_cstats,此后将所有进来的http请求按照path是不是test_stats的http请求而分为两类,
一类是path是test_stats的,称为API请求,记录它的query参数,提取出指定的channel或是topn=10或是global参数等,来触发intercept 请求,另一类是非API 请求,将根据该transaction中的信息,计算出每类channel的2xx次数,5xx次数,传输的总字节数,传输的平价速度等指标,并排序,这些信息将存放在上面的channel_stats 中,当API请求到来时,从中找出相应的channel统计信息,直接给出响应。

插件调用流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值