diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2023-06-28 23:14:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-28 23:14:10 +0300 |
commit | 5be9be74854d00879e6d52d6432ae12b5e8558cd (patch) | |
tree | 7d2c3e28db5aa1306cc480a45f1bfdd17b3c8375 /health/health.c | |
parent | 26ec3b119efb9271f622047259866a6083ed6269 (diff) |
rewrite /api/v2/alerts (#15257)
* rewrite /api/v2/alerts
* implement searching for transition
* Find transition id and issue callback
* Fix parameters
* call and transition filter
* Search with transition as well
* renames and cleanup
* render flags
* what if scenario for moving transitions at the top level
* If transition is given, limit the query appropriately
* Add alert transitions
* Optimize find transition to use prepared query
Drop temp table properly
* enabled alert instances again
* Order by when key
* Order by global_id
* Return last X transitions
* updated field names
* add ati to configurations and show all keys in debug mode
* Code cleanup and optimizations
* Drop temp table in case of error
* Finalize temp table population statement to prevent memory leak
* final changes
---------
Co-authored-by: Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com>
Diffstat (limited to 'health/health.c')
-rw-r--r-- | health/health.c | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/health/health.c b/health/health.c index 97df34fcf8..424f091909 100644 --- a/health/health.c +++ b/health/health.c @@ -22,6 +22,36 @@ char *silencers_filename; SIMPLE_PATTERN *conf_enabled_alarms = NULL; DICTIONARY *health_rrdvars; + +void health_entry_flags_to_json_array(BUFFER *wb, const char *key, HEALTH_ENTRY_FLAGS flags) { + buffer_json_member_add_array(wb, key); + + if(flags & HEALTH_ENTRY_FLAG_PROCESSED) + buffer_json_add_array_item_string(wb, "PROCESSED"); + if(flags & HEALTH_ENTRY_FLAG_UPDATED) + buffer_json_add_array_item_string(wb, "UPDATED"); + if(flags & HEALTH_ENTRY_FLAG_EXEC_RUN) + buffer_json_add_array_item_string(wb, "EXEC_RUN"); + if(flags & HEALTH_ENTRY_FLAG_EXEC_FAILED) + buffer_json_add_array_item_string(wb, "FAILED"); + if(flags & HEALTH_ENTRY_FLAG_SILENCED) + buffer_json_add_array_item_string(wb, "SILENCED"); + if(flags & HEALTH_ENTRY_RUN_ONCE) + buffer_json_add_array_item_string(wb, "ONCE"); + if(flags & HEALTH_ENTRY_FLAG_EXEC_IN_PROGRESS) + buffer_json_add_array_item_string(wb, "IN_PROGRESS"); + if(flags & HEALTH_ENTRY_FLAG_IS_REPEATING) + buffer_json_add_array_item_string(wb, "RECURRING"); + if(flags & HEALTH_ENTRY_FLAG_SAVED) + buffer_json_add_array_item_string(wb, "SAVED"); + if(flags & HEALTH_ENTRY_FLAG_ACLK_QUEUED) + buffer_json_add_array_item_string(wb, "ACLK_QUEUED"); + if(flags & HEALTH_ENTRY_FLAG_NO_CLEAR_NOTIFICATION) + buffer_json_add_array_item_string(wb, "NO_CLEAR_NOTIFICATION"); + + buffer_json_array_close(wb); +} + static bool prepare_command(BUFFER *wb, const char *exec, const char *recipient, @@ -1126,6 +1156,7 @@ void *health_main(void *ptr) { rc->old_status = rc->status; rc->status = RRDCALC_STATUS_REMOVED; rc->last_status_change = now; + rc->last_status_change_value = rc->value; rc->last_updated = now; rc->value = NAN; rc->ae = ae; @@ -1297,36 +1328,37 @@ void *health_main(void *ptr) { RRDCALC_STATUS status = RRDCALC_STATUS_UNDEFINED; switch (warning_status) { - case RRDCALC_STATUS_CLEAR: - status = RRDCALC_STATUS_CLEAR; - break; + case RRDCALC_STATUS_CLEAR: + status = RRDCALC_STATUS_CLEAR; + break; - case RRDCALC_STATUS_RAISED: - status = RRDCALC_STATUS_WARNING; - break; + case RRDCALC_STATUS_RAISED: + status = RRDCALC_STATUS_WARNING; + break; - default: - break; + default: + break; } switch (critical_status) { - case RRDCALC_STATUS_CLEAR: - if (status == RRDCALC_STATUS_UNDEFINED) - status = RRDCALC_STATUS_CLEAR; - break; + case RRDCALC_STATUS_CLEAR: + if (status == RRDCALC_STATUS_UNDEFINED) + status = RRDCALC_STATUS_CLEAR; + break; - case RRDCALC_STATUS_RAISED: - status = RRDCALC_STATUS_CRITICAL; - break; + case RRDCALC_STATUS_RAISED: + status = RRDCALC_STATUS_CRITICAL; + break; - default: - break; + default: + break; } // -------------------------------------------------------- // check if the new status and the old differ if (status != rc->status) { + worker_is_busy(WORKER_HEALTH_JOB_ALARM_LOG_ENTRY); int delay = 0; @@ -1394,6 +1426,7 @@ void *health_main(void *ptr) { log_health("[%s]: Alert event for [%s.%s], value [%s], status [%s].", rrdhost_hostname(host), ae_chart_name(ae), ae_name(ae), ae_new_value_string(ae), rrdcalc_status2string(ae->new_status)); + rc->last_status_change_value = rc->value; rc->last_status_change = now; rc->old_status = rc->status; rc->status = status; |