Gnocchi: 1、Gnocchi源码分析

 

gnocchi是用于多租时间序列聚合处理的数据库。可用于进行时间序列聚合,统计处理。

 

1目录概要介绍

gnocchi下面主要包括etc目录,gnocchi目录,setup.cfg文件,setup.py文件。

在gnocchi目录下主要包括:aggregates目录,indexer目录,rest目录,storage目录,

__init__.py,arrchive_policy.py,carbonara.py,cli.py,opts.py,service.py,statsd.py。

 

2gnocchi下非目录文件介绍

__init__.py:空文件

arrchive_policy.py:主要定义了low,medium.high默认归档策略,归档策略(名称,回退窗口,定义,聚集方法列表),归档策略条目(粒度,点的个数,时间跨度)

carbonara.py:包含TimeSerie(时间序列,本质是映射,可排序,去除重复索引),BoundTimeSerie(继承TimeSerie类,设置每次处理的metric大小)AggregatedTimeSerie(承自TimeSerie,该类重要,包含update函数外部传入近来的时间序列(映射),和当前已经存在的时间序列做运算,以及_resample函数,通过采样来分组,并应用聚集方法到点的集合中, 生成再次聚集后的时间序列),TimeSerieArchive

cli.py:重要,包含了数据库生成的入口方法upgrade(),api入口方法api(),statsd入口方法statsd(),

聚合和统计的入口方法metricd(),重要。

MetricProcessBase(监控项处理基类,先初始化数据库,然后进入到线程中循环,执行任务
),MetricReporting(继承自MetricProcessBase,执行的线程任务是打印待处理的监控项的采样数量等信息),MetricProcessor(重要类,继承自MetricProcessBase,从队列中获取测量值列表并处理,包括聚合,更新,重新采样等重要操作)监控项处理基类,先初始化数据库,然后进入到线程中循环,执行任务
),MetricReporting(继承自MetricProcessBase,执行的线程任务是打印待处理的监控项的采样数量等信息),MetricProcessor(重要类,继承自MetricProcessBase,从队列中获取测量值列表并处理,包括聚合,更新,重新采样等重要操作)

 

service.py:提供了prepare_service函数,用于注册配置选项组,设置api和metricd的工作者数量

 

statsd.py:包含Stats类(获取存储库和索引库的驱动器,并连接索引库;获取资源,遍历资源对应的测量值,调用通过InfluxDBClient写入监控项的测量值),StatsdServer类(统计服务,主要对接收到数据的每一行解析,得到监控项名称和采样值,设置监控项对应的测量值

),start()方法开启服务,实例化stats对象,创建数据报端点,调用asyncio,永久开启服务

 

opts.py:包含了indexer,metricd,api,storage等元组组成的配置项列表

 

genconfig.py:主要根据gnocchi-config-generator.conf来生成配置文件gnocchi.conf

aggregates目录:包含__init__.py和moving_stats.py

__init__.py:CustomAggregator(object):作用:定制化聚集器,是抽象类,包含一个抽象方法:compute。

moving_stats.py:MovingAverage(继承自CustomAggregator):包含:aggregate_data和compute方法

 

3 rest目录

是api转化为gnocchi可以处理请求的入口类,包含了许多Controller方法。由于gnocchi采用pecan(对象路由web框架来获取资源),这个文件提供的方法就是解析传递过来的url,通过对应方法解析后执行相关命令。

__init__.py:

比较重要的方法包括:MetricController(继承自rest.RestController

,提供post_measures添加测量值数组,获取某个监控项测量值列表方法get_measures),MetricsController(根据监控项id解析得到监控项交给MetricController处理),NamedMetricController(可根据监控项名称查询到监控项,根据资源id,类型,监控项列表来更新资源),MetricsMeasuresBatchController

(重要,监控项测量值批处理控制器,实际上就是遍历每个监控项,将每隔监控项的采样值列表添加到数据库中)。其他….

app.py:app.py是pecan应用的入口,包含应用初始化代码。hooks对应的配置是一些Pecan的hook,作用类似于WSGIMiddleware

GnocchiHook类(提供在Pecan尝试将一个请求分发给控制器的之前被调用)

的函数on_route)。load_app方法(Paste.Deploy主要是用来载入WSGI中的WebApp使用,其核心函数是loadapp()通过loadapp函数和一个配置文件或者egg包来载入WSGI应用

一个配置文件后缀为ini,内容被分为很多段):实际上是获取storage,indexer数据库驱动器,然后部署生成app并返回。 WerkzeugApp类(传入配置文件,分裂gnocchi-api进程,并且避免主进程创建到storage/indexer的连接 。  Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。) 
build_server(): 执行: service.prepare_service(),执行: serving.run_simple
app.wsgi文件:主要调用conf = service.prepare_service(),application = app.load_app(conf)
ini,内容被分为很多段):实际上是获取storage,indexer数据库驱动器,然后部署生成app并返回。 WerkzeugApp类(传入配置文件,分裂gnocchi-api进程,并且避免主进程创建到storage/indexer的连接 。  Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。) 
build_server(): 执行: service.prepare_service(),执行: serving.run_simple
app.wsgi文件:主要调用conf = service.prepare_service(),application = app.load_app(conf)

 

4 indexer目录

__init__.py:提供get_driver(conf)方法来根据配置文件中indexer.url获取索引数据库的驱动器,返回存入了配置的数据库驱动器对象。

IndexerDriver类(实际上资源,归档策略,归档策略规则等都存储在indexer中
作用:是抽象类,封装了连接,断开连接,升级等函数,获取资源,获取资源列表)
sqlalchemy_base.py:该文件主要定义了索引库indexer中各个表。例如:
ArchivePolicy,Metric等。
sqlalchemy.py: 提供get_resource_mappers方法(可能重要,不知道资源如何生成),PerInstanceFacade类(包含独立写,独立读,写连接,读连接等,获取数据库引擎等
),SQLAlchemyIndexer(indexer.IndexerDriver):通过stevedoe加载资源插件,例如volume,instance等;可以数据库迁移,升级;
生成资源类型到类的映射,重要(可能后续添加新的资源在这里添加);包含创建资源,列出/删除归档策略等接口
sqlalchemy_extension.py: 重要,该文件包括一些资源表,例如Image,Instance,Volume等,可能后续添加新的资源在这个文件。类(实际上资源,归档策略,归档策略规则等都存储在indexer中
作用:是抽象类,封装了连接,断开连接,升级等函数,获取资源,获取资源列表)
sqlalchemy_base.py:该文件主要定义了索引库indexer中各个表。例如:
ArchivePolicy,Metric等。
sqlalchemy.py: 提供get_resource_mappers方法(可能重要,不知道资源如何生成),PerInstanceFacade类(包含独立写,独立读,写连接,读连接等,获取数据库引擎等
),SQLAlchemyIndexer(indexer.IndexerDriver):通过stevedoe加载资源插件,例如volume,instance等;可以数据库迁移,升级;
生成资源类型到类的映射,重要(可能后续添加新的资源在这里添加);包含创建资源,列出/删除归档策略等接口
sqlalchemy_extension.py: 重要,该文件包括一些资源表,例如Image,Instance,Volume等,可能后续添加新的资源在这个文件。

 

5 storage目录

包含__init__.py,_carbonara.py,ceph.py,file.py,influxdb.py,swift,py等文件

最终存储的聚合结果在storage数据库中。因此重要。

__init__.py:提供get_driver(conf)方法根据配置文件中的存储数据库的驱动器,返回该驱动器的类;StorageDriver类存储驱动数据库,包括:初始化,停止,处理回退任务,物理删除,处理/获取测量值等功能(不过大多都未实现)

_carbonara.py:CarbonaraBasedStorage(重要类,继承自StorageDriver

,包含添加测量值列表,处理测量值,获取测量值,删除监控项等操作

里面有一个重要方法process_measures:遍历每隔监控项,获取每个监控项待处理测量值列表,进行聚合,更新,重新采样等处理process_measures:遍历每隔监控项,获取每个监控项待处理测量值列表,进行聚合,更新,重新采样等处理

ceph.py: CephStorage类(继承自CarbonaraBasedStorage

,包含添加测量值列表,处理测量值,获取测量值,删除监控项等操作

 

file.py:FileStorage类(继承自CarbonaraBasedStorage,包含添加测量值列表,处理测量值,获取测量值,删除监控项等操作。重要方法_store_measures(self,metric, data): 存储计量值列表,先获取临时文件,再写入数据,将临时文件变为包含采样值的目标文件

influxdb.py:InfluxDBStorage类(继承自StorageDriver),包含删除监控项,添加测量值列表,获取采样值列表等操作。重要方法

add_measures(self, metric, measures):通过InfluxDBClient写入时间点集合通过InfluxDBClient写入时间点集合

 

swift.py:未了解

 

 

6聚合处理的调用路线

文件 方法 调用

cli.py metricd() MetricProcessor类的process_background_tasks(self.index,self.block_size)

cli.py MetricProcessor类process_background_tasks(self.index,self.block_size) CarbonaraBasedStorage类的process_measures(index,block_size, sync)

_carbonara.py CarbonaraBasedStorage类process_measures(self,indexer, block_size,sync=False) CarbonaraBasedStorage类的_map_add_measures(bound_timeserie)

_carbonara.py CarbonaraBasedStorage类的_map_add_measures(bound_timeserie) CarbonaraBasedStorage类的_add_measures(self,aggregation, archive_policy_def,metric, timeserie)

_carbonara.py _add_measures(self,aggregation, archive_policy_def,metric,timeserie) AggregatedTimeSerie类的update(timeserie)

carbonara.py AggregatedTimeSerie类的update(timeserie) AggregatedTimeSerie类的_resample(self,after)

 

 

7增加测量值处理的调用路线

增加一条采样数据调用路线(以file作为gnocchi后端进行分析)

文件 方法 调用

gnocchi/rest/__init__.py NamedMetricController类的_lookup(self,name, *remainder) MetricController类的post_measures(self)

gnocchi/rest/__init__.py MetricController类的post_measures(self) CarbnonaraBaseStorage类的add_measures(self,metric, measures)

gnocchi/storage/_carbonara.py CarbnonaraBaseStorage类的add_measures(self,metric, measures) FileStorage类(采用其他后端,对应其他类)_store_measures(self,metric, data)

 

参考:

gnocchi 2.0源码

你可能感兴趣的:(gnocchi)