現在位置: ホーム / みらくるブログ / 緩やかなhousekeepingその2【MIRACLE ZBX 2.2】

緩やかなhousekeepingその2【MIRACLE ZBX 2.2】

以前の記事では、イベント削除設定についてでしたが、ヒストリ、トレンドについてもどうように緩やかに削除される仕組みとなっていました。

ヒストリ、トレンドについても調査を行いました

以前の記事では、イベント情報に関するHouseKeepingについての調査を行いました。そこで、今回はヒストリ、トレンド情報についての調査を行いました。結果としては、イベント情報と同様に緩やかに削除されていくというアルゴリズムになっていました。

 

ソースコードを追っていこう!

いつものようにソースコードを追っていきます。前回と同様にMIRACLE ZBX-2.2.9-2にて調査を行っていきます。

まずはメインのループからです。src/zabbix_server/housekeeper/housekeeper.c : void  main_housekeeper_loop() からとなります。

今回は、ヒストリ、トレンドに関する削除の調査になりますので、housekeeping_history_and_trends() から見ていくことにします。

466 static int  housekeeping_history_and_trends(int now)
467 {
468 const char *__function_name = "housekeeping_history_and_trends";
469
470 int deleted = 0, i, rc;
471 zbx_hk_history_rule_t *rule;
472
473 zabbix_log(LOG_LEVEL_DEBUG, "In %s() now:%d", __function_name, now);
474
475 /* prepare delete queues for all history housekeeping rules */
476 hk_history_delete_queue_prepare_all(hk_history_rules, now);
477
478 for (rule = hk_history_rules; NULL != rule->table; rule++)
479 {
...
487 for (i = 0; i < rule->delete_queue.values_num; i++)
488 {
489 zbx_hk_delete_queue_t *item_record = rule->delete_queue.values[i];
490
491 rc = DBexecute("delete from %s where itemid=" ZBX_FS_UI64 " and clock<%d",
492 rule->table, item_record->itemid, item_record->min_clock);
493 if (ZBX_DB_OK < rc)
494 deleted += rc;
495 }
...
504 }

476行目のhk_history_delete_queue_prepare_all()をコールしてキューを作成してから、478行目のループで削除処理をしています。実際のSQL文は491-492行目で生成しています。

キューの作成で、いろいろな処理をしていますので、ここを追っていきます。

 

と、書きましたがちょっと省きます。hk_history_delete_queue_prepare_all()では、事前にキャッシュに対する処理を行った後に、hk_history_update()をコールします。

342 static void hk_history_update(zbx_hk_history_rule_t *rules, int now)
343 {
344 DB_RESULT result;
345 DB_ROW row;
346
347 result = DBselect(
348 "select i.itemid,i.value_type,i.history,i.trends"
349 " from items i,hosts h"
350 " where i.hostid=h.hostid"
351 " and h.status in (%d,%d)",
352 HOST_STATUS_MONITORED, HOST_STATUS_NOT_MONITORED);
353
354 while (NULL != (row = DBfetch(result)))
355 {
356 zbx_uint64_t itemid;
357 int history, trends, value_type;
358 zbx_hk_history_rule_t *rule;
359
360 ZBX_STR2UINT64(itemid, row[0]);
361 value_type = atoi(row[1]);
362 history = atoi(row[2]);
363 trends = atoi(row[3]);
364
365 if (value_type < ITEM_VALUE_TYPE_MAX)
366 {
367 rule = rules + value_type;
368 if (ZBX_HK_OPTION_ENABLED == *rule->poption_global)
369 history = *rule->poption;
370 hk_history_item_update(rule, now, itemid, history);
371 }
372 if (value_type == ITEM_VALUE_TYPE_FLOAT)
373 {
374 rule = rules + HK_UPDATE_CACHE_OFFSET_TREND_FLOAT;
375 if (ZBX_HK_OPTION_ENABLED == *rule->poption_global)
376 trends = *rule->poption;
377 hk_history_item_update(rule, now, itemid, trends);
378 }
379 else if (value_type == ITEM_VALUE_TYPE_UINT64)
380 {
381 rule = rules + HK_UPDATE_CACHE_OFFSET_TREND_UINT;
382
383 if (ZBX_HK_OPTION_ENABLED == *rule->poption_global)
384 trends = *rule->poption;
385 hk_history_item_update(rule, now, itemid, trends);
386 }
387 }
388 DBfree_result(result);
389 }

hk_history_update()では、有効なアイテム情報を取得した後に、それぞれのアイテムに対してvalue_typeに応じて、hk_history_item_update()をコールしています。少なくとも、365行目の判定で全てのアイテムに対して、ヒストリ情報に関する処理が行われます。372行目もしくは379行目の判定でトレンド情報に対する処理が行われます。

hk_history_item_update()からは、前処理が行われた後にhk_history_delete_queue_append()がコールされます。

198 static void hk_history_delete_queue_append(zbx_hk_history_rule_t *rule, int now,
199 zbx_hk_item_cache_t *item_record, int history)
200 {
201 int keep_from = now - history * SEC_PER_DAY;
202
203 if (keep_from > item_record->min_clock)
204 {
205 zbx_hk_delete_queue_t *update_record;
206
207 /* update oldest timestamp in item cache */
208 item_record->min_clock = MIN(keep_from, item_record->min_clock +
209 HK_MAX_DELETE_PERIODS * CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR);
210
211 update_record = zbx_malloc(NULL, sizeof(zbx_hk_delete_queue_t));
212 update_record->itemid = item_record->itemid;
213 update_record->min_clock = item_record->min_clock;
214 zbx_vector_ptr_append(&rule->delete_queue, update_record);
215 }
216 }

やっと本題に辿り着きました。

203行目の判定で、keep_fromは現在時刻から保存期間を引いた時刻となり、item_record->min_clockは、hk_history_prepare()(hk_history_delete_queue_prepare_all()からコールされています)で取得したそれぞれのヒストリ、トレンドテーブルで保存されている最も古い時刻となります。

結果として、保存する期間より古いデータが存在した場合、最も古い時刻のデータから、4 * HouseKeeperの実行周期の時刻がitem_record->min_clockとなります。

この時刻が、housekeeping_history_and_trends()における下記のSQL文の生成に利用されます。

491       rc = DBexecute("delete from %s where itemid=" ZBX_FS_UI64 " and clock<%d",
492 rule->table, item_record->itemid, item_record->min_clock);

結果として、ヒストリ、トレンドデータの最も古い時刻のデータから、4 * HouseKeeperの実行周期分だけが削除されるようになります。