Module: check_mk
Branch: master
Commit: c4d1a4fd6122436fbc7c30f3f4b65f30678000be
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=c4d1a4fd612243…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Sep 27 11:41:59 2017 +0200
5212 FIX check_mkevents: Improved performance
The performance of the check check_mkevents has been improved. This
check is used when you configure the WATO rule "Check event state in Event
Console".
Change-Id: Ib8b5d24b5528f69c4c1df4df51ba9cf4ec77d32e
---
.werks/5212 | 11 +++++++++++
active_checks/check_mkevents.cc | 14 +++++---------
bin/mkeventd | 16 +++++++++++-----
3 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/.werks/5212 b/.werks/5212
new file mode 100644
index 0000000..3a3e882
--- /dev/null
+++ b/.werks/5212
@@ -0,0 +1,11 @@
+Title: check_mkevents: Improved performance
+Level: 1
+Component: ec
+Compatible: compat
+Edition: cre
+Version: 1.5.0i1
+Date: 1506505155
+Class: fix
+
+The performance of the check check_mkevents has been improved. This
+check is used when you configure the WATO rule "Check event state in Event
Console".
diff --git a/active_checks/check_mkevents.cc b/active_checks/check_mkevents.cc
index e4986ef..3155fad 100644
--- a/active_checks/check_mkevents.cc
+++ b/active_checks/check_mkevents.cc
@@ -97,15 +97,12 @@ void usage() {
" HOST may be a hostname, and IP address or hostname/IP-address.");
}
-string prepare_hostname_regex(const char *s) {
+string prepare_host_match_list(const char *s) {
const char *scan = s;
string result;
while (*scan != 0) {
- if (strchr(R"([](){}^$.*+?|\)", *scan) != nullptr) {
- result += R"(\)";
- result += *scan;
- } else if (*scan == '/') {
- result += "|";
+ if (*scan == '/') {
+ result += " ";
} else {
result += *scan;
}
@@ -228,9 +225,8 @@ int main(int argc, char **argv) {
string query_message;
query_message += "GET events\nFilter: event_host ";
if (strchr(host, '/') != nullptr) {
- query_message += "~~ ^(";
- query_message += prepare_hostname_regex(host);
- query_message += ")$";
+ query_message += "in ";
+ query_message += prepare_host_match_list(host);
} else {
query_message += "=~ ";
query_message += host;
diff --git a/bin/mkeventd b/bin/mkeventd
index c64d962..9d8449c 100755
--- a/bin/mkeventd
+++ b/bin/mkeventd
@@ -3474,9 +3474,11 @@ class StatusServer(object):
argument = argument.strip()
if header == "Filter":
name, opfunc, argument = self.parse_filter(argument, columns)
- # Needed for later optimization
- if name == "event_host" and opfunc ==
filter_operators['=']:
- only_host = argument
+
+ # Needed for later optimization (check_mkevents)
+ if name == "event_host" and opfunc ==
filter_operators['in']:
+ only_host = set(argument)
+
filters.append((name, opfunc, argument))
elif header == "Limit":
limit = int(argument)
@@ -4042,14 +4044,18 @@ class EventStatus(object):
def get_events(self, only_host = None):
result = []
for event in self._events:
- # A small optimization for check_mkevents
- if only_host and event["host"] != only_host:
+ # Optimize filters that are set by the check_mkevents active check. Since
users
+ # may have a lot of those checks running, it is a good idea to optimize
this.
+ if only_host and event["host"] not in only_host:
continue
+
event_line = []
for col_name, col_default in event_columns:
without_prefix = col_name[6:] # drop event_
event_line.append(event.get(without_prefix, col_default))
+
result.append(event_line)
+
return [ e[0] for e in event_columns ], result