Add missing modulo operator to alerts (#21267)
Add missing modulo operator code
Stelios Fragkakis committed
Nov 5, 2025 at 21:54 UTC
244dbe37f611810f225ff5b4658a690c6753f6e6
1 file changed
+27
src/libnetdata/eval/eval-evaluate.c
+27
@@ -176,6 +176,32 @@ static NETDATA_DOUBLE eval_divide(EVAL_EXPRESSION *exp, EVAL_NODE *op, int *erro
176
return n1 / n2;
177
}
178
179
+ALWAYS_INLINE
180
+static NETDATA_DOUBLE eval_modulo(EVAL_EXPRESSION *exp, EVAL_NODE *op, int *error) {
181
+ NETDATA_DOUBLE n1 = eval_value(exp, &op->ops[0], error);
182
+ if(*error != EVAL_ERROR_OK) return NAN;
183
+
184
+ NETDATA_DOUBLE n2 = eval_value(exp, &op->ops[1], error);
185
+ if(*error != EVAL_ERROR_OK) return NAN;
186
+
187
+ if(isnan(n1) || isnan(n2)) {
188
+ *error = EVAL_ERROR_VALUE_IS_NAN;
189
+ return NAN;
190
+ }
191
+
192
+ if(isinf(n1) || isinf(n2)) {
193
+ *error = EVAL_ERROR_VALUE_IS_INFINITE;
194
+ return INFINITY;
195
+ }
196
+
197
+ if(n2 == 0) {
198
+ *error = EVAL_ERROR_VALUE_IS_INFINITE;
199
+ return NAN; // Modulo by zero is undefined
200
+ }
201
+
202
+ return fmod(n1, n2);
203
+}
204
+
205
ALWAYS_INLINE
206
static NETDATA_DOUBLE eval_nop(EVAL_EXPRESSION *exp, EVAL_NODE *op, int *error) {
207
return eval_value(exp, &op->ops[0], error);
@@ -232,6 +258,7 @@ struct operator operators[256] = {
258
[EVAL_OPERATOR_MINUS] = { "-", 4, 2, 0, eval_minus },
259
[EVAL_OPERATOR_MULTIPLY] = { "*", 5, 2, 0, eval_multiply },
260
[EVAL_OPERATOR_DIVIDE] = { "/", 5, 2, 0, eval_divide },
261
+ [EVAL_OPERATOR_MODULO] = { "%", 5, 2, 0, eval_modulo },
262
[EVAL_OPERATOR_NOT] = { "!", 6, 1, 0, eval_not },
263
[EVAL_OPERATOR_SIGN_PLUS] = { "+", 6, 1, 0, eval_sign_plus },
264
[EVAL_OPERATOR_SIGN_MINUS] = { "-", 6, 1, 0, eval_sign_minus },