diff options
Diffstat (limited to 'cpp/src/Ice/MetricsAdminI.h')
-rw-r--r-- | cpp/src/Ice/MetricsAdminI.h | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/cpp/src/Ice/MetricsAdminI.h b/cpp/src/Ice/MetricsAdminI.h index 1af52c19317..ad30849244e 100644 --- a/cpp/src/Ice/MetricsAdminI.h +++ b/cpp/src/Ice/MetricsAdminI.h @@ -31,7 +31,6 @@ namespace IceMX { class Updater; -typedef IceUtil::Handle<Updater> UpdaterPtr; class MetricsHelper; template<typename T> class MetricsHelperT; @@ -67,27 +66,33 @@ public: virtual MetricsMap getMetrics() const = 0; virtual MetricsMapI* clone() const = 0; - const Ice::PropertyDict& getMapProperties() const - { - return _properties; - } + void validateProperties(const std::string&, const Ice::PropertiesPtr&, const std::vector<std::string>&); + const Ice::PropertyDict& getProperties() const; protected: const Ice::PropertyDict _properties; - std::vector<std::string> _groupByAttributes; - std::vector<std::string> _groupBySeparators; + const std::vector<std::string> _groupByAttributes; + const std::vector<std::string> _groupBySeparators; const int _retain; const std::vector<RegExpPtr> _accept; const std::vector<RegExpPtr> _reject; }; typedef IceUtil::Handle<MetricsMapI> MetricsMapIPtr; -class MetricsMapFactory : public IceUtil::Shared +class MetricsMapFactory : public Ice::LocalObject { public: + MetricsMapFactory(Updater*); + virtual MetricsMapIPtr create(const std::string&, const Ice::PropertiesPtr&) = 0; + + void update(); + +private: + + Updater* _updater; }; typedef IceUtil::Handle<MetricsMapFactory> MetricsMapFactoryPtr; @@ -225,11 +230,13 @@ public: const std::map<std::string, std::pair<SubMapMember, MetricsMapFactoryPtr> >& subMaps) : MetricsMapI(mapPrefix, properties) { + std::vector<std::string> subMapNames; typename std::map<std::string, std::pair<SubMapMember, MetricsMapFactoryPtr> >::const_iterator p; for(p = subMaps.begin(); p != subMaps.end(); ++p) { + subMapNames.push_back(p->first); const std::string subMapsPrefix = mapPrefix + "Map."; - std::string subMapPrefix = subMapsPrefix + p->first; + std::string subMapPrefix = subMapsPrefix + p->first + '.'; if(properties->getPropertiesForPrefix(subMapPrefix).empty()) { if(properties->getPropertiesForPrefix(subMapsPrefix).empty()) @@ -245,6 +252,7 @@ public: std::make_pair(p->second.first, p->second.second->create(subMapPrefix, properties)))); } + validateProperties(mapPrefix, properties, subMapNames); } MetricsMapT(const MetricsMapT& other) : MetricsMapI(other) @@ -446,6 +454,10 @@ template<class MetricsType> class MetricsMapFactoryT : public MetricsMapFactory { public: + MetricsMapFactoryT(Updater* updater) : MetricsMapFactory(updater) + { + } + virtual MetricsMapIPtr create(const std::string& mapPrefix, const Ice::PropertiesPtr& properties) { @@ -455,7 +467,7 @@ public: template<class SubMapMetricsType> void registerSubMap(const std::string& subMap, MetricsMap MetricsType::* member) { - _subMaps[subMap] = make_pair(member, new MetricsMapFactoryT<SubMapMetricsType>()); + _subMaps[subMap] = make_pair(member, new MetricsMapFactoryT<SubMapMetricsType>(0)); } private: @@ -469,7 +481,8 @@ public: MetricsViewI(const std::string&); - void update(const Ice::PropertiesPtr&, const std::map<std::string, MetricsMapFactoryPtr>&, std::set<std::string>&); + void update(const Ice::PropertiesPtr&, const std::map<std::string, MetricsMapFactoryPtr>&, + std::set<MetricsMapFactoryPtr>&); MetricsView getMetrics(); MetricsFailuresSeq getFailures(const std::string&); @@ -486,24 +499,26 @@ private: }; typedef IceUtil::Handle<MetricsViewI> MetricsViewIPtr; -class MetricsAdminI : public MetricsAdmin, private IceUtil::Mutex +class MetricsAdminI : public MetricsAdmin, public Ice::PropertiesAdminUpdateCallback, private IceUtil::Mutex { public: MetricsAdminI(const ::Ice::PropertiesPtr&, const Ice::LoggerPtr&); - void addUpdater(const std::string&, const UpdaterPtr&); void updateViews(); template<class MetricsType> void - registerMap(const std::string& map) + registerMap(const std::string& map, Updater* updater) { - _factories[map] = new MetricsMapFactoryT<MetricsType>(); + Lock sync(*this); + _factories[map] = new MetricsMapFactoryT<MetricsType>(updater); } template<class MemberMetricsType, class MetricsType> void registerSubMap(const std::string& map, const std::string& subMap, MetricsMap MetricsType::* member) { + Lock sync(*this); + std::map<std::string, MetricsMapFactoryPtr>::const_iterator p = _factories.find(map); assert(p != _factories.end()); @@ -511,6 +526,13 @@ public: factory->template registerSubMap<MemberMetricsType>(subMap, member); } + void + unregisterMap(const std::string& map) + { + Lock sync(*this); + _factories.erase(map); + } + virtual Ice::StringSeq getMetricsViewNames(const ::Ice::Current&); virtual MetricsView getMetricsView(const std::string&, const ::Ice::Current&); virtual MetricsFailuresSeq getMapMetricsFailures(const std::string&, const std::string&, const ::Ice::Current&); @@ -521,14 +543,17 @@ public: const Ice::LoggerPtr& getLogger() const; + void setProperties(const Ice::PropertiesPtr&); + private: + void updated(const Ice::PropertyDict&); + std::map<std::string, MetricsViewIPtr> _views; - std::map<std::string, UpdaterPtr> _updaters; std::map<std::string, MetricsMapFactoryPtr> _factories; - const Ice::PropertiesPtr _properties; const Ice::LoggerPtr _logger; + Ice::PropertiesPtr _properties; }; typedef IceUtil::Handle<MetricsAdminI> MetricsAdminIPtr; |