From f98493d3112905d2ad988b453b74d9555f5fdac8 Mon Sep 17 00:00:00 2001 From: Mark Benvenuto Date: Tue, 10 Apr 2018 13:29:16 -0400 Subject: SERVER-34223 Implement config file options for free monitoring --- src/mongo/db/free_mon/SConscript | 1 + src/mongo/db/free_mon/free_mon_options.cpp | 129 ++++++++++++++++++++++++++ src/mongo/db/free_mon/free_mon_options.h | 54 +++++++++++ src/mongo/db/free_mon/free_mon_queue_test.cpp | 2 +- 4 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/mongo/db/free_mon/free_mon_options.cpp create mode 100644 src/mongo/db/free_mon/free_mon_options.h diff --git a/src/mongo/db/free_mon/SConscript b/src/mongo/db/free_mon/SConscript index 0bfce9a48a8..f9210015636 100644 --- a/src/mongo/db/free_mon/SConscript +++ b/src/mongo/db/free_mon/SConscript @@ -30,6 +30,7 @@ if get_option("enable-free-mon") == "on": target='free_mon_mongod', source=[ 'free_mon_mongod.cpp', + 'free_mon_options.cpp', 'http_client_curl.cpp', #'http_client_curl.cpp' if not env.TargetOSIs('windows') else 'http_client_winhttp.cpp', ], diff --git a/src/mongo/db/free_mon/free_mon_options.cpp b/src/mongo/db/free_mon/free_mon_options.cpp new file mode 100644 index 00000000000..81293405b59 --- /dev/null +++ b/src/mongo/db/free_mon/free_mon_options.cpp @@ -0,0 +1,129 @@ +/** + * Copyright (C) 2018 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects + * for all of the code used other than as permitted herein. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you do not + * wish to do so, delete this exception statement from your version. If you + * delete this exception statement from all source files in the program, + * then also delete it in the license file. + */ + +#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kFTDC + + +#include "mongo/platform/basic.h" + +#include "mongo/db/free_mon/free_mon_options.h" + +#include "mongo/base/error_codes.h" +#include "mongo/base/initializer_context.h" +#include "mongo/base/status.h" +#include "mongo/base/status_with.h" +#include "mongo/base/string_data.h" +#include "mongo/util/log.h" +#include "mongo/util/options_parser/startup_option_init.h" +#include "mongo/util/options_parser/startup_options.h" + +namespace mongo { + +FreeMonParams globalFreeMonParams; + +namespace optionenvironment { +class OptionSection; +class Environment; +} // namespace optionenvironment + +namespace moe = mongo::optionenvironment; + +namespace { + +constexpr StringData kEnableCloudState_on = "on"_sd; +constexpr StringData kEnableCloudState_off = "off"_sd; +constexpr StringData kEnableCloudState_runtime = "runtime"_sd; + +StatusWith EnableCloudState_parse(StringData value) { + if (value == kEnableCloudState_on) { + return EnableCloudStateEnum::kOn; + } + if (value == kEnableCloudState_off) { + return EnableCloudStateEnum::kOff; + } + if (value == kEnableCloudState_runtime) { + return EnableCloudStateEnum::kRuntime; + } + + // TODO + return Status(ErrorCodes::InvalidOptions, "Unrecognized state"); +} + +Status addFreeMonitoringOptions(moe::OptionSection* options) { + moe::OptionSection freeMonitoringOptions("Free Monitoring options"); + + // Command Line: --enableFreeMonitoring= + // YAML Name: cloud.monitoring.free= + freeMonitoringOptions.addOptionChaining("cloud.monitoring.free.state", + "enableFreeMonitoring", + moe::String, + "Enable Cloud Free Monitoring (on|runtime|off)"); + + // Command Line: --enableFreeMonitoringTag=string + // YAML Name: cloud.monitoring.free.tag=string + freeMonitoringOptions.addOptionChaining( + "cloud.monitoring.free.tag", "freeMonitoringTag", moe::String, "Cloud Free Monitoring Tag"); + + Status ret = options->addSection(freeMonitoringOptions); + if (!ret.isOK()) { + error() << "Failed to add free monitoring option section: " << ret.toString(); + return ret; + } + + return Status::OK(); +} + +Status storeFreeMonitoringOptions(const moe::Environment& params) { + + if (params.count("cloud.monitoring.free.state")) { + auto swState = + EnableCloudState_parse(params["cloud.monitoring.free.state"].as()); + if (!swState.isOK()) { + return swState.getStatus(); + } + globalFreeMonParams.freeMonitoringState = swState.getValue(); + } + + if (params.count("cloud.monitoring.free.tag")) { + globalFreeMonParams.freeMonitoringTag = + params["cloud.monitoring.free.tag"].as(); + } + + return Status::OK(); +} + +MONGO_MODULE_STARTUP_OPTIONS_REGISTER(FreeMonitoringOptions)(InitializerContext* /*unused*/) { + return addFreeMonitoringOptions(&moe::startupOptions); +} + +MONGO_STARTUP_OPTIONS_STORE(FreeMonitoringOptions)(InitializerContext* /*unused*/) { + return storeFreeMonitoringOptions(moe::startupOptionsParsed); +} + +} // namespace +} // namespace mongo diff --git a/src/mongo/db/free_mon/free_mon_options.h b/src/mongo/db/free_mon/free_mon_options.h new file mode 100644 index 00000000000..05d4ae2a91a --- /dev/null +++ b/src/mongo/db/free_mon/free_mon_options.h @@ -0,0 +1,54 @@ +/** + * Copyright (C) 2018 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects + * for all of the code used other than as permitted herein. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you do not + * wish to do so, delete this exception statement from your version. If you + * delete this exception statement from all source files in the program, + * then also delete it in the license file. + */ + +#pragma once + +#include + +namespace mongo { + +/** +* Free Moniting Command line choices +*/ +enum class EnableCloudStateEnum : std::int32_t { + kOn, + kOff, + kRuntime, +}; + +/** + * Free Monitoring configuration options + */ +struct FreeMonParams { + std::string freeMonitoringTag; + EnableCloudStateEnum freeMonitoringState = EnableCloudStateEnum::kRuntime; +}; + +extern FreeMonParams globalFreeMonParams; + +} // namespace mongo diff --git a/src/mongo/db/free_mon/free_mon_queue_test.cpp b/src/mongo/db/free_mon/free_mon_queue_test.cpp index b7dd61887f0..5e7b35c061d 100644 --- a/src/mongo/db/free_mon/free_mon_queue_test.cpp +++ b/src/mongo/db/free_mon/free_mon_queue_test.cpp @@ -140,7 +140,7 @@ TEST_F(FreeMonQueueTest, TestQueueStop) { // Let our worker thread proceed barrier.countDownAndWait(); - + _mockThreadPool->shutdown(); _mockThreadPool->join(); } -- cgit v1.2.1