dimensions should also be referred as context.dimension under the same family
Costa Tsaousis (ktsaou) committed
Nov 12, 2016 at 19:41 UTC
62ec8b418c1884452024e19f919dabbf0d0da724
2 files changed
+52
-25
src/health.c
+44
-21
@@ -520,6 +520,9 @@ static inline RRDVAR *rrdvar_create_and_index(const char *scope, avl_tree_lock *
520
else {
521
// already exists
522
freez(variable);
523
+
524
+ // this is important
525
+ // it must return NULL - not the existing variable - or double-free will happen
526
rv = NULL;
527
}
528
@@ -722,6 +725,12 @@ RRDDIMVAR *rrddimvar_create(RRDDIM *rd, int type, const char *prefix, const char
725
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", rd->rrdset->id, rs->name);
726
rs->fullidname = strdupz(buffer);
727
728
+ snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", rd->rrdset->context, rs->id);
729
+ rs->contextid = strdupz(buffer);
730
+
731
+ snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", rd->rrdset->context, rs->name);
732
+ rs->contextname = strdupz(buffer);
733
+
734
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", rd->rrdset->name, rs->id);
735
rs->fullnameid = strdupz(buffer);
736
@@ -733,16 +742,18 @@ RRDDIMVAR *rrddimvar_create(RRDDIM *rd, int type, const char *prefix, const char
742
rs->options = options;
743
rs->rrddim = rd;
744
736
- rs->local_id = rrdvar_create_and_index("local", &st->variables_root_index, rs->id, rs->type, rs->value);
737
- rs->local_name = rrdvar_create_and_index("local", &st->variables_root_index, rs->name, rs->type, rs->value);
745
+ rs->local_id = rrdvar_create_and_index("local", &st->variables_root_index, rs->id, rs->type, rs->value);
746
+ rs->local_name = rrdvar_create_and_index("local", &st->variables_root_index, rs->name, rs->type, rs->value);
747
739
- rs->family_id = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->id, rs->type, rs->value);
740
- rs->family_name = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->name, rs->type, rs->value);
748
+ rs->family_id = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->id, rs->type, rs->value);
749
+ rs->family_name = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->name, rs->type, rs->value);
750
+ rs->family_contextid = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->contextid, rs->type, rs->value);
751
+ rs->family_contextname = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->contextname, rs->type, rs->value);
752
742
- rs->host_fullidid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullidid, rs->type, rs->value);
743
- rs->host_fullidname = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullidname, rs->type, rs->value);
744
- rs->host_fullnameid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnameid, rs->type, rs->value);
745
- rs->host_fullnamename = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnamename, rs->type, rs->value);
753
+ rs->host_fullidid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullidid, rs->type, rs->value);
754
+ rs->host_fullidname = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullidname, rs->type, rs->value);
755
+ rs->host_fullnameid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnameid, rs->type, rs->value);
756
+ rs->host_fullnamename = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnamename, rs->type, rs->value);
757
758
rs->next = rd->variables;
759
rd->variables = rs;
@@ -762,35 +773,42 @@ void rrddimvar_rename_all(RRDDIM *rd) {
773
char buffer[RRDDIMVAR_ID_MAX + 1];
774
// name changed
775
765
- // name
776
+ // name and family name
777
rrdvar_free(st->rrdhost, &st->variables_root_index, rs->local_name);
778
+ rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->family_name);
779
freez(rs->name);
780
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s%s%s", rs->prefix, rd->name, rs->suffix);
781
rs->name = strdupz(buffer);
770
- rs->local_name = rrdvar_create_and_index("local", &st->variables_root_index, rs->name, rs->type, rs->value);
782
+ rs->local_name = rrdvar_create_and_index("local", &st->variables_root_index, rs->name, rs->type, rs->value);
783
+ rs->family_name = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->name, rs->type, rs->value);
784
+
785
+ // family_contextname
786
+ rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->family_contextname);
787
+ freez(rs->contextname);
788
+ snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", rd->rrdset->context, rs->name);
789
+ rs->contextname = strdupz(buffer);
790
+ rs->family_contextname = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->contextname, rs->type, rs->value);
791
792
+ // fullidname
793
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->host_fullidname);
794
freez(rs->fullidname);
795
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->id, rs->name);
796
rs->fullidname = strdupz(buffer);
776
- rs->host_fullidname = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index,
777
- rs->fullidname, rs->type, rs->value);
797
+ rs->host_fullidname = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullidname, rs->type, rs->value);
798
799
// fullnameid
800
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->host_fullnameid);
801
freez(rs->fullnameid);
802
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->name, rs->id);
803
rs->fullnameid = strdupz(buffer);
784
- rs->host_fullnameid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index,
785
- rs->fullnameid, rs->type, rs->value);
804
+ rs->host_fullnameid = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnameid, rs->type, rs->value);
805
806
// fullnamename
807
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->host_fullnamename);
808
freez(rs->fullnamename);
809
snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->name, rs->name);
810
rs->fullnamename = strdupz(buffer);
792
- rs->host_fullnamename = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index,
793
- rs->fullnamename, rs->type, rs->value);
811
+ rs->host_fullnamename = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->fullnamename, rs->type, rs->value);
812
}
813
}
814
}
@@ -805,6 +823,8 @@ void rrddimvar_free(RRDDIMVAR *rs) {
823
824
rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->family_id);
825
rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->family_name);
826
+ rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->family_contextid);
827
+ rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->family_contextname);
828
829
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->host_fullidid);
830
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->host_fullidname);
@@ -827,6 +847,8 @@ void rrddimvar_free(RRDDIMVAR *rs) {
847
freez(rs->suffix);
848
freez(rs->id);
849
freez(rs->name);
850
+ freez(rs->contextid);
851
+ freez(rs->contextname);
852
freez(rs->fullidid);
853
freez(rs->fullidname);
854
freez(rs->fullnameid);
@@ -2722,23 +2744,24 @@ void *health_main(void *ptr) {
2744
2745
rc->value = NAN;
2746
2725
- debug(D_HEALTH, "Health alarm '%s.%s': failed to evaluate calculation with error: %s",
2726
- rc->chart?rc->chart:"NOCHART", rc->name, buffer_tostring(rc->calculation->error_msg));
2747
+ debug(D_HEALTH, "Health alarm '%s.%s': expression '%s' failed: %s",
2748
+ rc->chart?rc->chart:"NOCHART", rc->name, rc->calculation->parsed_as, buffer_tostring(rc->calculation->error_msg));
2749
2750
if (unlikely(!(rc->rrdcalc_flags & RRDCALC_FLAG_CALC_ERROR))) {
2751
rc->rrdcalc_flags |= RRDCALC_FLAG_CALC_ERROR;
2730
- error("Health alarm '%s.%s': failed to evaluate calculation with error: %s",
2731
- rc->chart?rc->chart:"NOCHART", rc->name, buffer_tostring(rc->calculation->error_msg));
2752
+ error("Health alarm '%s.%s': expression '%s' failed: %s",
2753
+ rc->chart?rc->chart:"NOCHART", rc->name, rc->calculation->parsed_as, buffer_tostring(rc->calculation->error_msg));
2754
}
2755
}
2756
else {
2757
if (unlikely(rc->rrdcalc_flags & RRDCALC_FLAG_CALC_ERROR))
2758
rc->rrdcalc_flags &= ~RRDCALC_FLAG_CALC_ERROR;
2759
2738
- debug(D_HEALTH, "Health alarm '%s.%s': calculation expression gave value "
2760
+ debug(D_HEALTH, "Health alarm '%s.%s': expression '%s' gave value "
2761
CALCULATED_NUMBER_FORMAT
2762
": %s (source: %s)",
2763
rc->chart?rc->chart:"NOCHART", rc->name,
2764
+ rc->calculation->parsed_as,
2765
rc->calculation->result,
2766
buffer_tostring(rc->calculation->error_msg),
2767
rc->source
src/health.h
+8
-4
@@ -66,10 +66,12 @@ typedef struct rrddimvar {
66
67
char *id; // dimension id
68
char *name; // dimension name
69
- char *fullidid; // chart type.chart id.dimension id
70
- char *fullidname; // chart type.chart id.dimension name
71
- char *fullnameid; // chart type.chart name.dimension id
72
- char *fullnamename; // chart type.chart name.dimension name
69
+ char *contextid; // context + dimension id
70
+ char *contextname; // context + dimension name
71
+ char *fullidid; // chart type.chart id + dimension id
72
+ char *fullidname; // chart type.chart id + dimension name
73
+ char *fullnameid; // chart type.chart name + dimension id
74
+ char *fullnamename; // chart type.chart name + dimension name
75
76
int type;
77
void *value;
@@ -81,6 +83,8 @@ typedef struct rrddimvar {
83
84
RRDVAR *family_id;
85
RRDVAR *family_name;
86
+ RRDVAR *family_contextid;
87
+ RRDVAR *family_contextname;
88
89
RRDVAR *host_fullidid;
90
RRDVAR *host_fullidname;