feat: extend monitor JSON Data evaluation with additional operators (#4614 )

pull/4617/head
Daniel Höfer 2 months ago
parent 45690a25a0
commit 6dbfbdced3

@ -0,0 +1,22 @@
exports.up = function (knex) {
return knex.schema
.alterTable("monitor", (table) => {
table.string("json_path_operator");
})
.then(() =>
knex("monitor")
.where({
type: "json-query"
})
.update({
"json_path_operator": "=="
})
);
};
exports.down = function (knex) {
return knex.schema
.alterTable("monitor", (table) => {
table.dropColumn("json_path_operator");
});
};

@ -38,12 +38,12 @@ exports.up = function(knex) {
table.increments('id');
table.decimal('price').notNullable();
table.string('name', 1000).notNullable();
}).then(() => {
}).then(() =>
knex("products").insert([
{ price: 10, name: "Apple" },
{ price: 20, name: "Orange" },
]);
});
);
};
exports.down = function(knex) {

@ -153,6 +153,7 @@ class Monitor extends BeanModel {
gamedigGivenPortOnly: this.getGameDigGivenPortOnly(),
httpBodyEncoding: this.httpBodyEncoding,
jsonPath: this.jsonPath,
jsonPathOperator: this.jsonPathOperator,
expectedValue: this.expectedValue,
kafkaProducerTopic: this.kafkaProducerTopic,
kafkaProducerBrokers: JSON.parse(this.kafkaProducerBrokers),
@ -607,7 +608,7 @@ class Monitor extends BeanModel {
let result = await expression.evaluate(data);
if (result.toString() === this.expectedValue) {
if (this.isJsonPathMatching(result)) {
bean.msg += ", expected value is found";
bean.status = UP;
} else {
@ -1615,6 +1616,25 @@ class Monitor extends BeanModel {
return oAuthAccessToken;
}
/**
* Evaluates the provided value with the expected value based on the defined operator. Fallback is the equals operator
* @param {any} value
* @returns {boolean} Is the JsonPath matching the expected value with the defined operator?
*/
isJsonPathMatching(value) {
const operators = {
"==": (value) => value == this.expectedValue,
"!=": (value) => value != this.expectedValue,
"<": (value) => value < this.expectedValue,
"<=": (value) => value <= this.expectedValue,
">": (value) => value > this.expectedValue,
">=": (value) => value >= this.expectedValue,
};
const operator = operators[this.jsonPathOperator] ?? operators["=="];
return operator(value?.toString());
}
}
module.exports = Monitor;

@ -41,7 +41,7 @@ class MqttMonitorType extends MonitorType {
let result = await expression.evaluate(parsedMessage);
if (result?.toString() === monitor.expectedValue) {
if (monitor.isJsonPathMatching(result)) {
heartbeat.msg = "Message received, expected value is found";
heartbeat.status = UP;
} else {

@ -818,8 +818,9 @@ let needSetup = false;
bean.radiusCallingStationId = monitor.radiusCallingStationId;
bean.radiusSecret = monitor.radiusSecret;
bean.httpBodyEncoding = monitor.httpBodyEncoding;
bean.expectedValue = monitor.expectedValue;
bean.jsonPath = monitor.jsonPath;
bean.jsonPathOperator = monitor.jsonPathOperator;
bean.expectedValue = monitor.expectedValue;
bean.kafkaProducerTopic = monitor.kafkaProducerTopic;
bean.kafkaProducerBrokers = JSON.stringify(monitor.kafkaProducerBrokers);
bean.kafkaProducerAllowAutoTopicCreation = monitor.kafkaProducerAllowAutoTopicCreation;

@ -817,6 +817,13 @@
"filterActivePaused": "Pausiert",
"Expected Value": "Erwarteter Wert",
"Json Query": "Json-Abfrage",
"Json Query Operator": "Json-Abfrage Operator",
"Json Query Equals": "Wert muss gleich sein",
"Json Query Not Equals": "Wert muss unterschiedlich sein",
"Json Query Less Than": "Wert muss kleiner sein",
"Json Query Less Than Or Equals": "Wert muss kleiner oder gleich sein",
"Json Query Greater Than": "Wert muss größer sein",
"Json Query Greater Than Or Equals": "Wert muss größer oder gleich sein",
"jsonQueryDescription": "Führe eine JSON-Abfrage gegen die Antwort durch und prüfe den erwarteten Wert (der Rückgabewert wird zum Vergleich in eine Zeichenkette umgewandelt). Auf {0} findest du die Dokumentation zur Abfragesprache. {1} kannst du Abfragen üben.",
"tailscalePingWarning": "Um den Tailscale Ping Monitor nutzen zu können, musst du Uptime Kuma ohne Docker installieren und den Tailscale Client auf dem Server installieren.",
"Server URL should not contain the nfty topic": "Die Server-URL sollte das nfty-Thema nicht enthalten",

@ -60,6 +60,13 @@
"Invert Keyword": "Invert Keyword",
"Expected Value": "Expected Value",
"Json Query": "Json Query",
"Json Query Operator": "Json Query Operator",
"Json Query Equals": "value must be equal",
"Json Query Not Equals": "value must not be equal",
"Json Query Less Than": "value must be less",
"Json Query Less Than Or Equals": "value must be less or equal",
"Json Query Greater Than": "value must be greater",
"Json Query Greater Than Or Equals": "value must be greater or equal",
"Friendly Name": "Friendly Name",
"URL": "URL",
"Hostname": "Hostname",

@ -29,6 +29,8 @@
<br>
<span>{{ $t("Json Query") }}:</span> <span class="keyword">{{ monitor.jsonPath }}</span>
<br>
<span>{{ $t("Json Query Operator") }}:</span> <span class="keyword">{{ monitor.jsonPathOperator }}</span>
<br>
<span>{{ $t("Expected Value") }}:</span> <span class="keyword">{{ monitor.expectedValue }}</span>
</span>
<span v-if="monitor.type === 'dns'">[{{ monitor.dns_resolve_type }}] {{ monitor.hostname }}

@ -179,6 +179,16 @@
</i18n-t>
<br>
<label for="jsonPathOperator" class="form-label">{{ $t("Json Query Operator") }}</label>
<select id="jsonPathOperator" v-model="monitor.jsonPathOperator" class="form-select" required>
<option value="==">{{ $t("Json Query Equals") }} (==)</option>
<option value="!=">{{ $t("Json Query Not Equals") }} (!=)</option>
<option value="<">{{ $t("Json Query Less Than") }} (&lt;)</option>
<option value="<=">{{ $t("Json Query Less Than Or Equals") }} (&lt;=)</option>
<option value=">">{{ $t("Json Query Greater Than") }} (&gt;)</option>
<option value=">=">{{ $t("Json Query Greater Than Or Equals") }} (&gt;=)</option>
</select>
<label for="expectedValue" class="form-label">{{ $t("Expected Value") }}</label>
<input id="expectedValue" v-model="monitor.expectedValue" type="text" class="form-control" required>
</div>
@ -375,6 +385,16 @@
</div>
<br>
<label for="jsonPathOperator" class="form-label">{{ $t("Json Query Operator") }}</label>
<select id="jsonPathOperator" v-model="monitor.jsonPathOperator" class="form-select" required>
<option value="==">{{ $t("Json Query Equals") }} (==)</option>
<option value="!=">{{ $t("Json Query Not Equals") }} (!=)</option>
<option value="<">{{ $t("Json Query Less Than") }} (&lt;)</option>
<option value="<=">{{ $t("Json Query Less Than Or Equals") }} (&lt;=)</option>
<option value=">">{{ $t("Json Query Greater Than") }} (&gt;)</option>
<option value=">=">{{ $t("Json Query Greater Than Or Equals") }} (&gt;=)</option>
</select>
<label for="expectedValue" class="form-label">{{ $t("Expected Value") }}</label>
<input id="expectedValue" v-model="monitor.expectedValue" type="text" class="form-control" required>
</div>

Loading…
Cancel
Save