背景
總結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()