2009年12月27日星期日

Ganglia 3.1.2 源码

gmond :

主要有4个文件:
cmdline.h
cmdline.c
ganglia.h
gmetric.c

main :
  1. Parse 命令行到全局量args_info,类型是结构体 struct gengetopt_args_info(cmdline.h)
  2. 创建全局量global_context,类型是struct Ganglia_pool*. 实际类型是apr_pool_t*(apache的内存池). struct Ganglia_pool根本未定义.
  3. 通过分析配置文件,创建全局量gmond_config,类型是struct Ganglia_gmond_config* (未定义类型),实际类型是cfg_t(confuse.h, 是一个section,section可以嵌套,还包含一个选项(字符,数据,布尔,其它的section)的列表.
  4. 创建全局量send_channels (UDP发送通道),类型是struct Ganglia_udp_send_channels*,实际是apr_array_header_t*.这个send_channels的数组对应到每一个配置文件中的udp_send_channel.
  5. 创建全局量gmetric,仅分配空间, 类型struct Ganglia_metric* , struct Ganglia_metric中有Ganglia_pool,struct Ganglia_metadata_message* 和char* 的value及void* 的extra. Ganglia_metadata_message表明了一个metric的类型,名称,计量单位,slope(斜率),tmax(在两个gmetric call之间最大秒数,默认60)和dmax(这个gmetric最大生命周期,默认0)
  6. 然后判断一下命令行参数是否有spoof及heartbeat如果都有,设置gmetric为heartbeat;否则设置metric的各项参数(name,value,type,unit, slope, tmax, dmax)
  7. 如果有spoof或heartbeat,将它们加入metric的extra子域中(apr_table_t)
  8. 然后将metric通过send_channels发送出去( Ganglia_metric_send() 来自libgmond.c),先发 metadata,再发value
  9. 清理

没有评论:

发表评论