From a8267e8b973bb2d5bb50b49c63bc950e6eec39b4 Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Mon, 15 Nov 2021 13:30:27 +0100 Subject: [PATCH] update errors and deployment --- common/cpp/include/asapo/common/error.tpp | 7 +-- common/cpp/include/asapo/common/utils.h | 49 +++++++++++++++++++ .../include/asapo/json_parser/json_parser.h | 1 - common/cpp/src/database/mongodb_client.cpp | 4 +- common/cpp/src/logger/logger.cpp | 6 +-- common/cpp/src/logger/spd_logger.cpp | 41 +--------------- common/cpp/src/logger/spd_logger.h | 2 +- deploy/asapo_services/run_maxwell.sh | 2 +- .../scripts/asapo-monitoring.nmd.tpl | 4 ++ docs/site/examples/start_asapo_socket.sh | 2 +- docs/site/examples/start_asapo_tcp.sh | 2 +- .../request_handler/request_handler_db.cpp | 4 +- 12 files changed, 70 insertions(+), 54 deletions(-) create mode 100644 common/cpp/include/asapo/common/utils.h diff --git a/common/cpp/include/asapo/common/error.tpp b/common/cpp/include/asapo/common/error.tpp index aa14d4015..931abd205 100644 --- a/common/cpp/include/asapo/common/error.tpp +++ b/common/cpp/include/asapo/common/error.tpp @@ -1,6 +1,7 @@ - #include "error.h" +#include "asapo/common/utils.h" + namespace asapo { template<typename ServiceErrorType> @@ -91,13 +92,13 @@ template<typename ServiceErrorType> std::string ServiceError<ServiceErrorType>::ExplainInJSON() const noexcept { std::string err = WrapInQuotes("error") + ":" + WrapInQuotes(error_name_); if (!error_message_.empty()) { - err += "," + WrapInQuotes("message") + ":" + WrapInQuotes(error_message_); + err += "," + WrapInQuotes("message") + ":" + WrapInQuotes(EscapeJson(error_message_)); } if (!details_.empty()) { err += "," + WrapInQuotes("details") + ":{"; auto i = 0; for (const auto &kv : details_) { - err += (i > 0 ? ", " : "") + WrapInQuotes(kv.first) + ":" + WrapInQuotes(kv.second); + err += (i > 0 ? ", " : "") + WrapInQuotes(kv.first) + ":" + WrapInQuotes(EscapeJson(kv.second)); i++; } err += "}"; diff --git a/common/cpp/include/asapo/common/utils.h b/common/cpp/include/asapo/common/utils.h new file mode 100644 index 000000000..103fb8f0a --- /dev/null +++ b/common/cpp/include/asapo/common/utils.h @@ -0,0 +1,49 @@ +#ifndef ASAPO_COMMON_CPP_INCLUDE_ASAPO_COMMON_UTILS_H_ +#define ASAPO_COMMON_CPP_INCLUDE_ASAPO_COMMON_UTILS_H_ + +#include <iomanip> +#include <sstream> + + +namespace asapo { + +inline std::string EscapeJson(const std::string& s) { + std::ostringstream o; + for (auto c = s.cbegin(); c != s.cend(); c++) { + switch (*c) { + case '"': + o << "\\\""; + break; + case '\\': + o << "\\\\"; + break; + case '\b': + o << "\\b"; + break; + case '\f': + o << "\\f"; + break; + case '\n': + o << "\\n"; + break; + case '\r': + o << "\\r"; + break; + case '\t': + o << "\\t"; + break; + default: + if ('\x00' <= *c && *c <= '\x1f') { + o << "\\u" + << std::hex << std::setw(4) << std::setfill('0') << (int)*c; + } else { + o << *c; + } + } + } + return o.str(); +} + +} + +#endif //ASAPO_COMMON_CPP_INCLUDE_ASAPO_COMMON_UTILS_H_ diff --git a/common/cpp/include/asapo/json_parser/json_parser.h b/common/cpp/include/asapo/json_parser/json_parser.h index b8bd14f69..a2baa383d 100644 --- a/common/cpp/include/asapo/json_parser/json_parser.h +++ b/common/cpp/include/asapo/json_parser/json_parser.h @@ -49,7 +49,6 @@ class JsonFileParser : public JsonParser { JsonFileParser(const std::string& json, const std::unique_ptr<IO>* io = nullptr): JsonParser(json, io) {}; }; - } diff --git a/common/cpp/src/database/mongodb_client.cpp b/common/cpp/src/database/mongodb_client.cpp index eff22561e..bfb0d8ffb 100644 --- a/common/cpp/src/database/mongodb_client.cpp +++ b/common/cpp/src/database/mongodb_client.cpp @@ -46,7 +46,7 @@ Error MongoDBClient::Ping() { bson_destroy(&reply); bson_destroy(command); - return !retval ? DBErrorTemplates::kConnectionError.Generate() : nullptr; + return !retval ? DBErrorTemplates::kConnectionError.Generate("cannot ping database") : nullptr; } MongoDBClient::MongoDBClient() { @@ -58,7 +58,7 @@ Error MongoDBClient::InitializeClient(const std::string& address) { client_ = mongoc_client_new(uri_str.c_str()); if (client_ == nullptr) { - return DBErrorTemplates::kBadAddress.Generate(); + return DBErrorTemplates::kBadAddress.Generate("cannot initialize database"); } write_concern_ = mongoc_write_concern_new(); diff --git a/common/cpp/src/logger/logger.cpp b/common/cpp/src/logger/logger.cpp index e9613d768..e277c2da5 100644 --- a/common/cpp/src/logger/logger.cpp +++ b/common/cpp/src/logger/logger.cpp @@ -61,12 +61,12 @@ LogMessageWithFields::LogMessageWithFields(std::string key, double val, int prec LogMessageWithFields::LogMessageWithFields(std::string val) { if (!val.empty()) { - log_string_ = EncloseQuotes("message") + ":" + EncloseQuotes(escape_json(val)); + log_string_ = EncloseQuotes("message") + ":" + EncloseQuotes(EscapeJson(val)); } } LogMessageWithFields::LogMessageWithFields(std::string key, std::string val) { - log_string_ = EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(escape_json(val)); + log_string_ = EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(EscapeJson(val)); } inline std::string LogMessageWithFields::CommaIfNeeded() { @@ -85,7 +85,7 @@ LogMessageWithFields &LogMessageWithFields::Append(std::string key, double val, } LogMessageWithFields &LogMessageWithFields::Append(std::string key, std::string val) { - log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(escape_json(val)); + log_string_ += CommaIfNeeded() + EncloseQuotes(std::move(key)) + ":" + EncloseQuotes(EscapeJson(val)); return *this; } diff --git a/common/cpp/src/logger/spd_logger.cpp b/common/cpp/src/logger/spd_logger.cpp index 21f9f6ec3..cf66d44ff 100644 --- a/common/cpp/src/logger/spd_logger.cpp +++ b/common/cpp/src/logger/spd_logger.cpp @@ -3,8 +3,8 @@ #include "fluentd_sink.h" #include <sstream> -#include <iomanip> +#include "asapo/common/utils.h" namespace asapo { @@ -30,46 +30,9 @@ void SpdLogger::SetLogLevel(LogLevel level) { } } -std::string escape_json(const std::string& s) { - std::ostringstream o; - for (auto c = s.cbegin(); c != s.cend(); c++) { - switch (*c) { - case '"': - o << "\\\""; - break; - case '\\': - o << "\\\\"; - break; - case '\b': - o << "\\b"; - break; - case '\f': - o << "\\f"; - break; - case '\n': - o << "\\n"; - break; - case '\r': - o << "\\r"; - break; - case '\t': - o << "\\t"; - break; - default: - if ('\x00' <= *c && *c <= '\x1f') { - o << "\\u" - << std::hex << std::setw(4) << std::setfill('0') << (int)*c; - } else { - o << *c; - } - } - } - return o.str(); -} - std::string EncloseMsg(std::string msg) { if (msg.find("\"") != 0) { - return std::string(R"("message":")") + escape_json(msg) + "\""; + return std::string(R"("message":")") + EscapeJson(msg) + "\""; } else { return msg; } diff --git a/common/cpp/src/logger/spd_logger.h b/common/cpp/src/logger/spd_logger.h index 1c2485f95..4b4ea94a2 100644 --- a/common/cpp/src/logger/spd_logger.h +++ b/common/cpp/src/logger/spd_logger.h @@ -38,7 +38,7 @@ class SpdLogger : public AbstractLogger { }; std::string EncloseMsg(std::string msg); -std::string escape_json(const std::string& s); +std::string EscapeJson(const std::string& s); } diff --git a/deploy/asapo_services/run_maxwell.sh b/deploy/asapo_services/run_maxwell.sh index d2a74ed1f..13bd97f0a 100755 --- a/deploy/asapo_services/run_maxwell.sh +++ b/deploy/asapo_services/run_maxwell.sh @@ -45,7 +45,7 @@ ASAPO_LIGHTWEIGHT_SERVICE_NODES=`scontrol show hostnames $SLURM_JOB_NODELIST | h mkdir -p $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHARED $MONGO_DIR chmod 777 $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHARED $MONGO_DIR cd $SERVICE_DATA_CLUSTER_SHARED -mkdir esdatadir fluentd grafana influxdb mongodb +mkdir esdatadir fluentd grafana influxdb mongodb prometheus alertmanager chmod 777 * #todo: elastic search check diff --git a/deploy/asapo_services/scripts/asapo-monitoring.nmd.tpl b/deploy/asapo_services/scripts/asapo-monitoring.nmd.tpl index 677e5413f..0f1a15493 100644 --- a/deploy/asapo_services/scripts/asapo-monitoring.nmd.tpl +++ b/deploy/asapo_services/scripts/asapo-monitoring.nmd.tpl @@ -27,6 +27,8 @@ job "asapo-monitoring" { driver = "docker" user = "${asapo_user}" config { + security_opt = ["no-new-privileges"] + userns_mode = "host" image = "prom/alertmanager:${alertmanager_version}" args = [ "--web.route-prefix=/alertmanager/", @@ -87,6 +89,8 @@ job "asapo-monitoring" { driver = "docker" user = "${asapo_user}" config { + security_opt = ["no-new-privileges"] + userns_mode = "host" image = "prom/prometheus:${prometheus_version}" args = [ "--web.external-url=/prometheus/", diff --git a/docs/site/examples/start_asapo_socket.sh b/docs/site/examples/start_asapo_socket.sh index a50a87ff9..0150a44a8 100644 --- a/docs/site/examples/start_asapo_socket.sh +++ b/docs/site/examples/start_asapo_socket.sh @@ -16,7 +16,7 @@ mkdir -p $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHAR chmod 777 $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHARED $DATA_GLOBAL_SHARED_ONLINE cd $SERVICE_DATA_CLUSTER_SHARED -mkdir -p fluentd grafana influxdb influxdb2 mongodb +mkdir -p fluentd grafana influxdb influxdb2 mongodb prometheus alertmanager chmod 777 * docker run --privileged --rm -v /var/run/docker.sock:/var/run/docker.sock \ diff --git a/docs/site/examples/start_asapo_tcp.sh b/docs/site/examples/start_asapo_tcp.sh index 007595fe5..4debb8e82 100644 --- a/docs/site/examples/start_asapo_tcp.sh +++ b/docs/site/examples/start_asapo_tcp.sh @@ -22,7 +22,7 @@ mkdir -p $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHAR chmod 777 $NOMAD_ALLOC_HOST_SHARED $SERVICE_DATA_CLUSTER_SHARED $DATA_GLOBAL_SHARED $DATA_GLOBAL_SHARED_ONLINE cd $SERVICE_DATA_CLUSTER_SHAREDdetector -mkdir -p fluentd grafana influxdb2 mongodb +mkdir -p fluentd grafana influxdb influxdb2 mongodb prometheus alertmanager chmod 777 * docker run --privileged --userns=host --security-opt no-new-privileges --rm \ diff --git a/receiver/src/request_handler/request_handler_db.cpp b/receiver/src/request_handler/request_handler_db.cpp index ed201b179..54b9fadc0 100644 --- a/receiver/src/request_handler/request_handler_db.cpp +++ b/receiver/src/request_handler/request_handler_db.cpp @@ -81,9 +81,9 @@ Error RequestHandlerDb::DBErrorToReceiverError(Error err) const { Error return_err; if (err == DBErrorTemplates::kWrongInput || err == DBErrorTemplates::kNoRecord || err == DBErrorTemplates::kJsonParseError) { - return_err = ReceiverErrorTemplates::kBadRequest.Generate(); + return_err = ReceiverErrorTemplates::kBadRequest.Generate("error from database"); } else { - return_err = ReceiverErrorTemplates::kInternalServerError.Generate(); + return_err = ReceiverErrorTemplates::kInternalServerError.Generate("error from database"); } return_err->SetCause(std::move(err)); return return_err; -- GitLab