背景
总结gnocchi 4.4版本gnocchi-metricd工作流程
入口
gnocchi.cli.metricd
metricd
stop after processing metric默认为0,调servicemanager run
MetricdServiceManager
__init__
服务逻辑封装到MetricdServiceManager初始化中
主要由MetricProcessor, MetricReporting, MetricJanitor,都在metricd.py中定义。register_hooks用来reload MetricProcessor,默认48个worker
cotyledon.ServiceManager.add
先加到self._services,最后manager调_adjust_workers方法所有services集中处理
_adjust_workers调_start_worker和_stop_worker调整worker数,_utils.spawn_process调multiprocessing模块起进程
MetricProcessBase
三个metric类都继承自相同的base基类,base实现了run方法,run是无限循环,类似周期任务,周期执行业务类的_run_job方法
每一个worker好像都会delay一秒
只有metricProcessor是多worker,其他reporting和janitor都是单worker
MetricProcessor
主要业务是周期处理写进来的measures,处理后重新写入basepath下,具体怎么处理需确认
_run_job
229 判断初始化时间是否超过interval_delay(120),默认不超过,
_get_sacks_to_process
该函数类似一个装饰器,给定函数内存使用上限和timetolive,装饰类的同名函数_get_sacks_to_process
coordinator只有部分driver支持run_watchers,mysql driver不支持,所以_get_sacks_to_process报错,捕获异常,然后什么也不做,直接到finally返回
返回_tasks或fallback_tasks。mysql driver抛异常,_tasks是空,会返回fallback_tasks,看下赋值
incoming是gnocchi.incoming下的file driver
iter_sacks函数返回一个sack对象生成器,生成器长度从/var/lib/gnocchi/gnocchi-config默认配置文件读取,默认为128
获取完sack后,遍历每个sack底下的metric并处理
chef.process_new_measures_for_sack
看起来感觉是处理sack下的measures
MetricReporting
周期汇报,返回一个report,默认没啥用,可以根据情况给业务用
MetricJanitor
周期删除状态为delete的metric和对应的measures
api
总结一些重要或常用api流程
gnocchiclient
7.X版本用v1
数据连接和查询的话,应该是初始化怎么连到db,还没看
v1/batch/resources/metrics/measures
该接口会修改incoming file类型存储端和mysql里的数据。mysql只有当metri不存在才会创建,如果存在则不处理,incoming file存储端存储上报的measures
对应gnocchiclient方法为metric.batch_resources_metrics_measures,方法对应的gnocchi处理逻辑在ResourcesMetricsMeasuresBatchController,方法是post,有一个create_metrics参数,默认False
虽然默认false,但和ceilometer对接的ceilometer端传参都是True
先查已有metric列表,新增measure前先判断measures里有没有名字不在已有metric列表的,如果有,创建新metric
最后批量创measuers,incoming应该是gnocchi.incoming下的file
add_measures_batch,应该是执行_store_new_measures方法
看着会先创临时文件,将measures写到临时文件,再按一定规则改临时文件名
sack有个最大数量,每个metricid会取余运算匹配一个sack,将sack和metricid组装成临时文件的替代路径,最后将临时文件重命名为这个路径
sack文件夹命名,total是总的,number是取余的结果,uuid模块创的uuid可转化为int,然后取余
最终路径应该是sack路径 + metricid + 随机uuid + 当前时间,父路径是/var/lib/gnocchi
加上True后会在原先生成路径后加一个随机uuid和当前时间
此处存疑,写入measure用的incoming模块,查询用的storage模块,其中对路径的拼接不一致(确认了,非问题,有多个存储端,不同的信息存储在不同的存储端)
其他业务相关
关于存储端
gnocchi有storage,incoming,indexer存储端,默认对接的分别是file,file,mysql。incoming主要操作measure,indexer操作metric,storage操作metric和measure的聚合相关操作
关于存储粒度
gnocchi有metric,measure,resource,和ceilometer粒度有类似对应关系,可以参考理解
gnocchi中的resource/metric/measure等的关系_gnocchi resource-CSDN博客
其他好用方法
获取主机名直接socket.gethostname()