Repository: mesos Updated Branches: refs/heads/master 1600ebc69 -> 25feb869e
Added metrics for showing number of subscribed resource providers. Review: https://reviews.apache.org/r/65470 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/25feb869 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/25feb869 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/25feb869 Branch: refs/heads/master Commit: 25feb869e797b600cc6159d951fe70d4db685445 Parents: 1600ebc Author: Jie Yu <yujie....@gmail.com> Authored: Thu Feb 1 15:37:35 2018 -0800 Committer: Jie Yu <yujie....@gmail.com> Committed: Fri Feb 2 09:32:14 2018 -0800 ---------------------------------------------------------------------- src/resource_provider/manager.cpp | 43 ++++++++++++++++-- src/tests/resource_provider_manager_tests.cpp | 53 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/25feb869/src/resource_provider/manager.cpp ---------------------------------------------------------------------- diff --git a/src/resource_provider/manager.cpp b/src/resource_provider/manager.cpp index 5d064bf..cc195a3 100644 --- a/src/resource_provider/manager.cpp +++ b/src/resource_provider/manager.cpp @@ -32,6 +32,9 @@ #include <process/id.hpp> #include <process/process.hpp> +#include <process/metrics/gauge.hpp> +#include <process/metrics/metrics.hpp> + #include <stout/hashmap.hpp> #include <stout/protobuf.hpp> #include <stout/uuid.hpp> @@ -80,6 +83,7 @@ using process::http::UnsupportedMediaType; using process::http::authentication::Principal; +using process::metrics::Gauge; namespace mesos { namespace internal { @@ -188,17 +192,28 @@ private: ResourceProviderID newResourceProviderId(); + double gaugeSubscribed(); + struct ResourceProviders { hashmap<ResourceProviderID, Owned<ResourceProvider>> subscribed; } resourceProviders; + + struct Metrics + { + explicit Metrics(const ResourceProviderManagerProcess& manager); + ~Metrics(); + + Gauge subscribed; + }; + + Metrics metrics; }; ResourceProviderManagerProcess::ResourceProviderManagerProcess() - : ProcessBase(process::ID::generate("resource-provider-manager")) -{ -} + : ProcessBase(process::ID::generate("resource-provider-manager")), + metrics(*this) {} Future<http::Response> ResourceProviderManagerProcess::api( @@ -742,6 +757,28 @@ ResourceProviderID ResourceProviderManagerProcess::newResourceProviderId() } +double ResourceProviderManagerProcess::gaugeSubscribed() +{ + return static_cast<double>(resourceProviders.subscribed.size()); +} + + +ResourceProviderManagerProcess::Metrics::Metrics( + const ResourceProviderManagerProcess& manager) + : subscribed( + "resource_provider_manager/subscribed", + defer(manager, &ResourceProviderManagerProcess::gaugeSubscribed)) +{ + process::metrics::add(subscribed); +} + + +ResourceProviderManagerProcess::Metrics::~Metrics() +{ + process::metrics::remove(subscribed); +} + + ResourceProviderManager::ResourceProviderManager() : process(new ResourceProviderManagerProcess()) { http://git-wip-us.apache.org/repos/asf/mesos/blob/25feb869/src/tests/resource_provider_manager_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/resource_provider_manager_tests.cpp b/src/tests/resource_provider_manager_tests.cpp index 2944b06..c8997ec 100644 --- a/src/tests/resource_provider_manager_tests.cpp +++ b/src/tests/resource_provider_manager_tests.cpp @@ -56,6 +56,7 @@ #include "slave/slave.hpp" #include "tests/mesos.hpp" +#include "tests/utils.hpp" namespace http = process::http; @@ -1312,6 +1313,58 @@ TEST_F(ResourceProviderManagerHttpApiTest, ResourceProviderSubscribeDisconnect) AWAIT_READY(subscribed2); } + +TEST_F(ResourceProviderManagerHttpApiTest, Metrics) +{ + Clock::pause(); + + // Start master and agent. + master::Flags masterFlags = CreateMasterFlags(); + Try<Owned<cluster::Master>> master = StartMaster(masterFlags); + ASSERT_SOME(master); + + Owned<MasterDetector> detector = master.get()->createDetector(); + + Future<UpdateSlaveMessage> updateSlaveMessage = + FUTURE_PROTOBUF(UpdateSlaveMessage(), _, _); + + slave::Flags slaveFlags = CreateSlaveFlags(); + + Try<Owned<cluster::Slave>> agent = StartSlave(detector.get(), slaveFlags); + ASSERT_SOME(agent); + + Clock::advance(slaveFlags.registration_backoff_factor); + Clock::settle(); + + AWAIT_READY(updateSlaveMessage); + + mesos::v1::ResourceProviderInfo resourceProviderInfo; + resourceProviderInfo.set_type("org.apache.mesos.rp.test"); + resourceProviderInfo.set_name("test"); + + Owned<v1::MockResourceProvider> resourceProvider( + new v1::MockResourceProvider(resourceProviderInfo)); + + // Start and register a resource provider. + Owned<EndpointDetector> endpointDetector( + resource_provider::createEndpointDetector(agent.get()->pid)); + + Future<Event::Subscribed> subscribed; + EXPECT_CALL(*resourceProvider, subscribed(_)) + .WillOnce(FutureArg<0>(&subscribed)); + + resourceProvider->start( + endpointDetector, + ContentType::PROTOBUF, + v1::DEFAULT_CREDENTIAL); + + AWAIT_READY(subscribed); + + const JSON::Object snapshot = Metrics(); + + EXPECT_EQ(1, snapshot.values.at("resource_provider_manager/subscribed")); +} + } // namespace tests { } // namespace internal { } // namespace mesos {