|
@@ -113,6 +113,25 @@ void health_alarm_log2json(RRDHOST *host, BUFFER *wb, uint32_t after) {
|
|
|
netdata_rwlock_unlock(&host->health_log.alarm_log_rwlock);
|
|
|
}
|
|
|
|
|
|
+static inline void health_rrdcalc_values2json_nolock(RRDHOST *host, BUFFER *wb, RRDCALC *rc) {
|
|
|
+ (void)host;
|
|
|
+ buffer_sprintf(wb,
|
|
|
+ "\t\t\"%s.%s\": {\n"
|
|
|
+ "\t\t\t\"id\": %lu,\n"
|
|
|
+ , rc->chart, rc->name
|
|
|
+ , (unsigned long)rc->id);
|
|
|
+
|
|
|
+ buffer_strcat(wb, "\t\t\t\"value\":");
|
|
|
+ buffer_rrd_value(wb, rc->value);
|
|
|
+ buffer_strcat(wb, ",\n");
|
|
|
+
|
|
|
+ buffer_sprintf(wb,
|
|
|
+ "\t\t\t\"status\": \"%s\"\n"
|
|
|
+ , rrdcalc_status2string(rc->status));
|
|
|
+
|
|
|
+ buffer_strcat(wb, "\t\t}");
|
|
|
+}
|
|
|
+
|
|
|
static inline void health_rrdcalc2json_nolock(RRDHOST *host, BUFFER *wb, RRDCALC *rc) {
|
|
|
char value_string[100 + 1];
|
|
|
format_value_and_unit(value_string, 100, rc->value, rc->units, -1);
|
|
@@ -272,9 +291,23 @@ void health_aggregate_alarms(RRDHOST *host, BUFFER *wb, BUFFER* contexts, RRDCAL
|
|
|
rrdhost_unlock(host);
|
|
|
}
|
|
|
|
|
|
-void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) {
|
|
|
+void health_alarms2json_fill_alarms(RRDHOST *host, BUFFER *wb, int all, void (*fp)(RRDHOST *, BUFFER *, RRDCALC *)) {
|
|
|
+ RRDCALC *rc;
|
|
|
int i;
|
|
|
+ for(i = 0, rc = host->alarms; rc ; rc = rc->next) {
|
|
|
+ if(unlikely(!rc->rrdset || !rc->rrdset->last_collected_time.tv_sec))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if(likely(!all && !(rc->status == RRDCALC_STATUS_WARNING || rc->status == RRDCALC_STATUS_CRITICAL)))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if(likely(i)) buffer_strcat(wb, ",\n");
|
|
|
+ fp(host, wb, rc);
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) {
|
|
|
rrdhost_rdlock(host);
|
|
|
buffer_sprintf(wb, "{\n\t\"hostname\": \"%s\","
|
|
|
"\n\t\"latest_alarm_log_unique_id\": %u,"
|
|
@@ -286,18 +319,7 @@ void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) {
|
|
|
host->health_enabled?"true":"false",
|
|
|
(unsigned long)now_realtime_sec());
|
|
|
|
|
|
- RRDCALC *rc;
|
|
|
- for(i = 0, rc = host->alarms; rc ; rc = rc->next) {
|
|
|
- if(unlikely(!rc->rrdset || !rc->rrdset->last_collected_time.tv_sec))
|
|
|
- continue;
|
|
|
-
|
|
|
- if(likely(!all && !(rc->status == RRDCALC_STATUS_WARNING || rc->status == RRDCALC_STATUS_CRITICAL)))
|
|
|
- continue;
|
|
|
-
|
|
|
- if(likely(i)) buffer_strcat(wb, ",\n");
|
|
|
- health_rrdcalc2json_nolock(host, wb, rc);
|
|
|
- i++;
|
|
|
- }
|
|
|
+ health_alarms2json_fill_alarms(host, wb, all, health_rrdcalc2json_nolock);
|
|
|
|
|
|
// buffer_strcat(wb, "\n\t},\n\t\"templates\": {");
|
|
|
// RRDCALCTEMPLATE *rt;
|
|
@@ -308,5 +330,14 @@ void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) {
|
|
|
rrdhost_unlock(host);
|
|
|
}
|
|
|
|
|
|
+void health_alarms_values2json(RRDHOST *host, BUFFER *wb, int all) {
|
|
|
+ rrdhost_rdlock(host);
|
|
|
+ buffer_sprintf(wb, "{\n\t\"hostname\": \"%s\","
|
|
|
+ "\n\t\"alarms\": {\n",
|
|
|
+ host->hostname);
|
|
|
|
|
|
+ health_alarms2json_fill_alarms(host, wb, all, health_rrdcalc_values2json_nolock);
|
|
|
|
|
|
+ buffer_strcat(wb, "\n\t}\n}\n");
|
|
|
+ rrdhost_unlock(host);
|
|
|
+}
|