diff options
author | Louis Williams <louis.williams@mongodb.com> | 2020-09-09 12:50:59 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-09-09 17:13:17 +0000 |
commit | 067c84541cfced8abe0eca82b003ba02dd331ed6 (patch) | |
tree | b3f3ab8985939429dc5b4a0a947f79ab82750420 /src/mongo/db | |
parent | 705f35bfd71671e0168dca78960820cb7b31ec2a (diff) | |
download | mongo-067c84541cfced8abe0eca82b003ba02dd331ed6.tar.gz |
SERVER-50703 Create global resource consumption structure
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/stats/SConscript | 3 | ||||
-rw-r--r-- | src/mongo/db/stats/resource_consumption_metrics.cpp | 64 | ||||
-rw-r--r-- | src/mongo/db/stats/resource_consumption_metrics.h | 100 | ||||
-rw-r--r-- | src/mongo/db/stats/resource_consumption_metrics_test.cpp | 76 |
4 files changed, 243 insertions, 0 deletions
diff --git a/src/mongo/db/stats/SConscript b/src/mongo/db/stats/SConscript index 15138462b01..d805e0cc6ea 100644 --- a/src/mongo/db/stats/SConscript +++ b/src/mongo/db/stats/SConscript @@ -75,6 +75,7 @@ env.Library( env.Library( target='resource_consumption_metrics', source=[ + 'resource_consumption_metrics.cpp', env.Idlc('operation_resource_consumption.idl')[0], ], LIBDEPS=[ @@ -133,6 +134,7 @@ env.CppUnitTest( 'api_version_metrics_test.cpp', 'fill_locker_info_test.cpp', 'operation_latency_histogram_test.cpp', + 'resource_consumption_metrics_test.cpp', 'timer_stats_test.cpp', 'top_test.cpp', ], @@ -143,6 +145,7 @@ env.CppUnitTest( '$BUILD_DIR/mongo/util/clock_source_mock', 'api_version_metrics', 'fill_locker_info', + 'resource_consumption_metrics', 'timer_stats', 'top', ], diff --git a/src/mongo/db/stats/resource_consumption_metrics.cpp b/src/mongo/db/stats/resource_consumption_metrics.cpp new file mode 100644 index 00000000000..a5bb969042a --- /dev/null +++ b/src/mongo/db/stats/resource_consumption_metrics.cpp @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2020-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * 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 + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * 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 Server Side 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. + */ + +#include "mongo/db/stats/resource_consumption_metrics.h" + +namespace mongo { +namespace { +const OperationContext::Decoration<ResourceConsumption::Metrics> getOperationMetrics = + OperationContext::declareDecoration<ResourceConsumption::Metrics>(); +const ServiceContext::Decoration<ResourceConsumption> getGlobalResourceConsumption = + ServiceContext::declareDecoration<ResourceConsumption>(); +} // namespace + + +ResourceConsumption::Metrics& ResourceConsumption::Metrics::get(OperationContext* opCtx) { + return getOperationMetrics(opCtx); +} + +ResourceConsumption& ResourceConsumption::get(ServiceContext* svcCtx) { + return getGlobalResourceConsumption(svcCtx); +} + +ResourceConsumption& ResourceConsumption::get(OperationContext* opCtx) { + return getGlobalResourceConsumption(opCtx->getServiceContext()); +} + +void ResourceConsumption::add(const Metrics& metrics) { + invariant(!metrics.getDbName().empty()); + stdx::unique_lock<Mutex> lk(_mutex); + _metrics[metrics.getDbName()] += metrics; +} + +ResourceConsumption::MetricsMap ResourceConsumption::getMetrics() const { + stdx::unique_lock<Mutex> lk(_mutex); + return _metrics; +} + +} // namespace mongo diff --git a/src/mongo/db/stats/resource_consumption_metrics.h b/src/mongo/db/stats/resource_consumption_metrics.h new file mode 100644 index 00000000000..257039ca17f --- /dev/null +++ b/src/mongo/db/stats/resource_consumption_metrics.h @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2020-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * 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 + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * 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 Server Side 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 <map> +#include <string> + +#include "mongo/db/operation_context.h" +#include "mongo/platform/mutex.h" + +namespace mongo { + +/** + * ResourceConsumption maintains thread-safe access into a map of resource consumption Metrics. + */ +class ResourceConsumption { +public: + static ResourceConsumption& get(OperationContext* opCtx); + static ResourceConsumption& get(ServiceContext* svcCtx); + + /** + * Metrics maintains non-thread-safe, per-operation resource consumption metrics for a specific + * database. + */ + class Metrics { + public: + static Metrics& get(OperationContext* opCtx); + + /** + * Adds other Metrics to this one. + */ + void add(const Metrics& other){}; + Metrics& operator+=(const Metrics& other) { + add(other); + return *this; + } + + /** + * Set the database name associated with these metrics. + */ + void setDbName(const std::string& dbName) { + _dbName = dbName; + } + + const std::string& getDbName() const { + return _dbName; + } + + private: + std::string _dbName; + }; + + /** + * Adds a Metrics object to an existing Metrics object in the map, keyed by database name. If no + * Metrics exist for the database, the value is initialized with the provided Metrics. + * + * The Metrics database name must not be an empty string. + */ + void add(const Metrics& metrics); + + /** + * Returns a copy of the Metrics map. + */ + using MetricsMap = std::map<std::string, Metrics>; + MetricsMap getMetrics() const; + +private: + // Protects _metrics + mutable Mutex _mutex = MONGO_MAKE_LATCH("ResourceConsumption::_mutex"); + MetricsMap _metrics; +}; + +} // namespace mongo diff --git a/src/mongo/db/stats/resource_consumption_metrics_test.cpp b/src/mongo/db/stats/resource_consumption_metrics_test.cpp new file mode 100644 index 00000000000..093170ec199 --- /dev/null +++ b/src/mongo/db/stats/resource_consumption_metrics_test.cpp @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2020-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * 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 + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * 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 Server Side 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. + */ + +#include "mongo/platform/basic.h" + +#include "mongo/db/service_context_test_fixture.h" +#include "mongo/db/stats/resource_consumption_metrics.h" +#include "mongo/unittest/unittest.h" + +namespace mongo { + +class ResourceConsumptionMetricsTest : public ServiceContextTest { +public: + void setUp() { + _opCtx = makeOperationContext(); + } + + typedef std::pair<ServiceContext::UniqueClient, ServiceContext::UniqueOperationContext> + ClientAndCtx; + ClientAndCtx makeClientAndCtx(const std::string& clientName) { + auto client = getServiceContext()->makeClient(clientName); + auto opCtx = client->makeOperationContext(); + return std::make_pair(std::move(client), std::move(opCtx)); + } + +protected: + ServiceContext::UniqueOperationContext _opCtx; +}; + +TEST_F(ResourceConsumptionMetricsTest, Add) { + auto& globalResourceConsumption = ResourceConsumption::get(getServiceContext()); + + auto [client2, opCtx2] = makeClientAndCtx("opCtx2"); + + auto& operationMetrics1 = ResourceConsumption::Metrics::get(_opCtx.get()); + auto& operationMetrics2 = ResourceConsumption::Metrics::get(opCtx2.get()); + + operationMetrics1.setDbName("db1"); + operationMetrics2.setDbName("db2"); + globalResourceConsumption.add(operationMetrics1); + globalResourceConsumption.add(operationMetrics1); + globalResourceConsumption.add(operationMetrics2); + globalResourceConsumption.add(operationMetrics2); + + auto globalMetrics = globalResourceConsumption.getMetrics(); + ASSERT_EQ(globalMetrics.count("db1"), 1); + ASSERT_EQ(globalMetrics.count("db2"), 1); + ASSERT_EQ(globalMetrics.count("db3"), 0); +} +} // namespace mongo |