Module: check_mk
Branch: master
Commit: 8ee8f6f37c88e80d5b624d50721abfc145766433
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8ee8f6f37c88e8…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Tue Nov 7 09:09:25 2017 +0100
Log incorrect Stats: queries.
Change-Id: I1cbc92383f5b8e7c23272aa2b2c8654675274174
---
livestatus/src/BlobColumn.cc | 7 ++++---
livestatus/src/BlobColumn.h | 1 +
livestatus/src/CustomVarsDictColumn.cc | 4 +++-
livestatus/src/CustomVarsDictColumn.h | 1 +
livestatus/src/ListColumn.cc | 4 +++-
livestatus/src/ListColumn.h | 1 +
livestatus/src/NullColumn.cc | 2 +-
livestatus/src/NullColumn.h | 1 +
livestatus/src/Query.cc | 14 ++++++++++++--
livestatus/src/Query.h | 2 ++
livestatus/src/StatsColumn.cc | 16 +++++++---------
livestatus/src/StatsColumn.h | 3 ++-
livestatus/src/StringColumn.cc | 4 +++-
livestatus/src/StringColumn.h | 1 +
14 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/livestatus/src/BlobColumn.cc b/livestatus/src/BlobColumn.cc
index ec2a6e5..ea1fa18 100644
--- a/livestatus/src/BlobColumn.cc
+++ b/livestatus/src/BlobColumn.cc
@@ -38,11 +38,12 @@ void BlobColumn::output(Row row, RowRenderer &r, const contact *
/*auth_user*/,
std::unique_ptr<Filter> BlobColumn::createFilter(
RelationalOperator /*unused*/, const std::string & /*unused*/) const {
- throw std::runtime_error("filtering on blob column " + name() +
- " not supported");
+ throw std::runtime_error("filtering on blob column '" + name() +
+ "' not supported");
}
std::unique_ptr<Aggregator> BlobColumn::createAggregator(
StatsOperation /*operation*/) const {
- return nullptr;
+ throw std::runtime_error("aggregating on blob column '" + name() +
+ "' not supported");
}
diff --git a/livestatus/src/BlobColumn.h b/livestatus/src/BlobColumn.h
index 9643dfa..658e63b 100644
--- a/livestatus/src/BlobColumn.h
+++ b/livestatus/src/BlobColumn.h
@@ -30,6 +30,7 @@
#include <memory>
#include <string>
#include <vector>
+#include "Aggregator.h"
#include "Column.h"
#include "contact_fwd.h"
#include "opids.h"
diff --git a/livestatus/src/CustomVarsDictColumn.cc
b/livestatus/src/CustomVarsDictColumn.cc
index 24b198f..53a9b27 100644
--- a/livestatus/src/CustomVarsDictColumn.cc
+++ b/livestatus/src/CustomVarsDictColumn.cc
@@ -23,6 +23,7 @@
// Boston, MA 02110-1301 USA.
#include "CustomVarsDictColumn.h"
+#include <stdexcept>
#include <utility>
#include "CustomVarsDictFilter.h"
#include "Filter.h"
@@ -52,7 +53,8 @@ std::unique_ptr<Filter> CustomVarsDictColumn::createFilter(
std::unique_ptr<Aggregator> CustomVarsDictColumn::createAggregator(
StatsOperation /*operation*/) const {
- return nullptr;
+ throw std::runtime_error("aggregating on dictionary column '" + name()
+
+ "' not supported");
}
std::unordered_map<std::string, std::string> CustomVarsDictColumn::getValue(
diff --git a/livestatus/src/CustomVarsDictColumn.h
b/livestatus/src/CustomVarsDictColumn.h
index 00699aa..3a0eb8f 100644
--- a/livestatus/src/CustomVarsDictColumn.h
+++ b/livestatus/src/CustomVarsDictColumn.h
@@ -30,6 +30,7 @@
#include <memory>
#include <string>
#include <unordered_map>
+#include "Aggregator.h"
#include "Column.h"
#include "contact_fwd.h"
#include "opids.h"
diff --git a/livestatus/src/ListColumn.cc b/livestatus/src/ListColumn.cc
index 030c909..459ca77 100644
--- a/livestatus/src/ListColumn.cc
+++ b/livestatus/src/ListColumn.cc
@@ -23,6 +23,7 @@
// Boston, MA 02110-1301 USA.
#include "ListColumn.h"
+#include <stdexcept>
#include "Filter.h"
#include "ListFilter.h"
#include "Renderer.h"
@@ -43,5 +44,6 @@ std::unique_ptr<Filter> ListColumn::createFilter(
std::unique_ptr<Aggregator> ListColumn::createAggregator(
StatsOperation /*operation*/) const {
- return nullptr;
+ throw std::runtime_error("aggregating on list column '" + name() +
+ "' not supported");
}
diff --git a/livestatus/src/ListColumn.h b/livestatus/src/ListColumn.h
index 6085ca1..4b4b6b5 100644
--- a/livestatus/src/ListColumn.h
+++ b/livestatus/src/ListColumn.h
@@ -30,6 +30,7 @@
#include <memory>
#include <string>
#include <vector>
+#include "Aggregator.h"
#include "Column.h"
#include "contact_fwd.h"
#include "opids.h"
diff --git a/livestatus/src/NullColumn.cc b/livestatus/src/NullColumn.cc
index 6099e27..d496ef8 100644
--- a/livestatus/src/NullColumn.cc
+++ b/livestatus/src/NullColumn.cc
@@ -41,5 +41,5 @@ std::unique_ptr<Filter> NullColumn::createFilter(
std::unique_ptr<Aggregator> NullColumn::createAggregator(
StatsOperation /*operation*/) const {
- return nullptr;
+ throw std::runtime_error("aggregating on null column not supported");
}
diff --git a/livestatus/src/NullColumn.h b/livestatus/src/NullColumn.h
index 847ff72..6251a4b 100644
--- a/livestatus/src/NullColumn.h
+++ b/livestatus/src/NullColumn.h
@@ -29,6 +29,7 @@
#include <chrono>
#include <memory>
#include <string>
+#include "Aggregator.h"
#include "Column.h"
#include "contact_fwd.h"
#include "opids.h"
diff --git a/livestatus/src/Query.cc b/livestatus/src/Query.cc
index 4976f89..525b1ce 100644
--- a/livestatus/src/Query.cc
+++ b/livestatus/src/Query.cc
@@ -451,7 +451,7 @@ void Query::parseColumnsLine(char *line) {
// But not failing has the advantage that an updated GUI, that
// expects new columns, will be able to keep compatibility with
// older Livestatus versions.
- Informational(_logger) << "Replacing non-existing column
'"
+ Informational(_logger) << "replacing non-existing column
'"
<< column_name << "' with null
column";
column = std::make_shared<NullColumn>(
column_name, "non-existing column", -1, -1, -1, 0);
@@ -796,13 +796,23 @@ void Query::optimizeBitmask(const std::string &column_name,
_filter.optimizeBitmask(column_name, bitmask, timezoneOffset());
}
+std::unique_ptr<Aggregator> Query::createAggregator(
+ const StatsColumn &sc) const {
+ try {
+ return sc.createAggregator();
+ } catch (const std::runtime_error &e) {
+ Informational(_logger) << e.what() << ", falling back to
counting";
+ return sc.createCountAggregator();
+ }
+}
+
const std::vector<std::unique_ptr<Aggregator>>
&Query::getAggregatorsFor(
const RowFragment &groupspec) {
auto it = _stats_groups.find(groupspec);
if (it == _stats_groups.end()) {
std::vector<std::unique_ptr<Aggregator>> aggrs;
for (const auto &sc : _stats_columns) {
- aggrs.push_back(sc->createAggregator());
+ aggrs.push_back(createAggregator(*sc));
}
it = _stats_groups.emplace(groupspec, move(aggrs)).first;
}
diff --git a/livestatus/src/Query.h b/livestatus/src/Query.h
index b7d663b..ac09085 100644
--- a/livestatus/src/Query.h
+++ b/livestatus/src/Query.h
@@ -140,6 +140,8 @@ private:
void start(QueryRenderer &q);
void finish(QueryRenderer &q);
+ std::unique_ptr<Aggregator> createAggregator(const StatsColumn &sc) const;
+
// NOTE: We cannot make this 'const' right now, it adds entries into
// _stats_groups.
const std::vector<std::unique_ptr<Aggregator>> &getAggregatorsFor(
diff --git a/livestatus/src/StatsColumn.cc b/livestatus/src/StatsColumn.cc
index e644774..3cd614b 100644
--- a/livestatus/src/StatsColumn.cc
+++ b/livestatus/src/StatsColumn.cc
@@ -33,14 +33,12 @@ StatsColumn::StatsColumn(Column *c, std::unique_ptr<Filter> f,
StatsOperation o)
std::unique_ptr<Filter> StatsColumn::stealFilter() { return move(_filter); }
-std::unique_ptr<Aggregator> StatsColumn::createAggregator() {
- if (_operation == StatsOperation::count) {
- return std::make_unique<CountAggregator>(_filter.get());
- }
- if (std::unique_ptr<Aggregator> aggr =
- _column->createAggregator(_operation)) {
- return aggr;
- }
- // unaggregateble column
+std::unique_ptr<Aggregator> StatsColumn::createAggregator() const {
+ return _operation == StatsOperation::count
+ ? createCountAggregator()
+ : _column->createAggregator(_operation);
+}
+
+std::unique_ptr<Aggregator> StatsColumn::createCountAggregator() const {
return std::make_unique<CountAggregator>(_filter.get());
}
diff --git a/livestatus/src/StatsColumn.h b/livestatus/src/StatsColumn.h
index a2acb9f..b89b79c 100644
--- a/livestatus/src/StatsColumn.h
+++ b/livestatus/src/StatsColumn.h
@@ -37,7 +37,8 @@ public:
Column *column() const { return _column; }
StatsOperation operation() const { return _operation; }
std::unique_ptr<Filter> stealFilter();
- std::unique_ptr<Aggregator> createAggregator();
+ std::unique_ptr<Aggregator> createAggregator() const;
+ std::unique_ptr<Aggregator> createCountAggregator() const;
private:
Column *_column;
diff --git a/livestatus/src/StringColumn.cc b/livestatus/src/StringColumn.cc
index 5613016..490eb27 100644
--- a/livestatus/src/StringColumn.cc
+++ b/livestatus/src/StringColumn.cc
@@ -23,6 +23,7 @@
// Boston, MA 02110-1301 USA.
#include "StringColumn.h"
+#include <stdexcept>
#include "Filter.h"
#include "Renderer.h"
#include "Row.h"
@@ -41,5 +42,6 @@ std::unique_ptr<Filter> StringColumn::createFilter(
std::unique_ptr<Aggregator> StringColumn::createAggregator(
StatsOperation /*operation*/) const {
- return nullptr;
+ throw std::runtime_error("aggregating on string column '" + name() +
+ "' not supported");
}
diff --git a/livestatus/src/StringColumn.h b/livestatus/src/StringColumn.h
index e3b1970..ecc8358 100644
--- a/livestatus/src/StringColumn.h
+++ b/livestatus/src/StringColumn.h
@@ -29,6 +29,7 @@
#include <chrono>
#include <memory>
#include <string>
+#include "Aggregator.h"
#include "Column.h"
#include "contact_fwd.h"
#include "opids.h"