5 #ifndef ICEMX_METRICSOBSERVER_I_H
6 #define ICEMX_METRICSOBSERVER_I_H
25 template<
typename T>
class MetricsHelperT
29 virtual ~MetricsHelperT()
33 virtual std::string operator()(
const std::string&)
const = 0;
35 virtual void initMetrics(
const ICE_INTERNAL_HANDLE<T>&)
const
42 template<
typename Helper>
class AttributeResolverT
48 Resolver(
const std::string& name) : _name(name)
56 virtual std::string operator()(
const Helper* h)
const = 0;
65 AttributeResolverT() : _default(0)
71 for(
typename std::map<std::string, Resolver*>::iterator p = _attributes.begin(); p != _attributes.end();++p)
77 std::string operator()(
const Helper* helper,
const std::string& attribute)
const
79 typename std::map<std::string, Resolver*>::const_iterator p = _attributes.find(attribute);
80 if(p == _attributes.end())
82 if(attribute ==
"none")
88 return (helper->*_default)(attribute);
90 throw std::invalid_argument(attribute);
92 return (*p->second)(helper);
96 setDefault(std::string (Helper::*memberFn)(
const std::string&)
const)
101 template<
typename Y>
void
102 add(
const std::string& name, Y Helper::*member)
104 _attributes.insert(
typename std::map<std::string,
105 Resolver*>::value_type(name,
new HelperMemberResolver<Y>(name, member)));
108 template<
typename Y>
void
109 add(
const std::string& name, Y (Helper::*memberFn)()
const)
111 _attributes.insert(
typename std::map<std::string,
112 Resolver*>::value_type(name,
new HelperMemberFunctionResolver<Y>(name, memberFn)));
115 template<
typename I,
typename O,
typename Y>
void
116 add(
const std::string& name, O (Helper::*getFn)()
const, Y I::*member)
118 _attributes.insert(
typename std::map<std::string,
119 Resolver*>::value_type(name,
new MemberResolver<I, O, Y>(name, getFn, member)));
122 template<
typename I,
typename O,
typename Y>
void
123 add(
const std::string& name, O (Helper::*getFn)()
const, Y (I::*memberFn)()
const)
125 _attributes.insert(
typename std::map<std::string,
126 Resolver*>::value_type(name,
new MemberFunctionResolver<I, O, Y>(name, getFn,
130 #if ICE_CPLUSPLUS >= 201703L
135 template<
typename I,
typename O,
typename Y>
void
136 add(
const std::string& name, O (Helper::*getFn)()
const, Y (I::*memberFn)()
const noexcept)
138 _attributes.insert(
typename std::map<std::string,
139 Resolver*>::value_type(name,
new MemberFunctionResolver<I, O, Y>(name, getFn,
146 template<
typename Y>
class HelperMemberResolver :
public Resolver
150 HelperMemberResolver(
const std::string& name, Y Helper::*member) : Resolver(name), _member(member)
154 virtual std::string operator()(
const Helper* r)
const
156 return toString(r->*_member);
164 template<
typename Y>
class HelperMemberFunctionResolver :
public Resolver
168 HelperMemberFunctionResolver(
const std::string& name, Y (Helper::*memberFn)()
const) :
169 Resolver(name), _memberFn(memberFn)
173 virtual std::string operator()(
const Helper* r)
const
175 return toString((r->*_memberFn)());
180 Y (Helper::*_memberFn)()
const;
183 template<
typename I,
typename O,
typename Y>
class MemberResolver :
public Resolver
187 MemberResolver(
const std::string& name, O (Helper::*getFn)()
const, Y I::*member) :
188 Resolver(name), _getFn(getFn), _member(member)
192 virtual std::string operator()(
const Helper* r)
const
194 O o = (r->*_getFn)();
195 I* v = dynamicCast<I>(IceInternal::ReferenceWrapper<O>::get(o));
198 return toString(v->*_member);
202 throw std::invalid_argument(Resolver::_name);
208 O (Helper::*_getFn)()
const;
212 template<
typename I,
typename O,
typename Y>
class MemberFunctionResolver :
public Resolver
216 MemberFunctionResolver(
const std::string& name, O (Helper::*getFn)()
const, Y (I::*memberFn)()
const) :
217 Resolver(name), _getFn(getFn), _memberFn(memberFn)
221 virtual std::string operator()(
const Helper* r)
const
223 O o = (r->*_getFn)();
224 I* v = dynamicCast<I>(IceInternal::ReferenceWrapper<O>::get(o));
227 return toString((v->*_memberFn)());
231 throw std::invalid_argument(Resolver::_name);
237 O (Helper::*_getFn)()
const;
238 Y (I::*_memberFn)()
const;
241 template<
typename I,
typename V>
static I*
244 return dynamic_cast<I*
>(v);
247 template<
typename I>
static I*
252 I* i =
dynamic_cast<I*
>(info);
261 template<
typename I>
static I*
266 I* i =
dynamic_cast<I*
>(info);
275 template<
typename I>
static std::string
278 std::ostringstream os;
283 static const std::string
284 toString(
const Ice::ObjectPrxPtr& p)
286 return p->ice_toString();
289 static const std::string&
290 toString(
const std::string& s)
296 toString(const ::Ice::EndpointPtr& e)
298 return e->toString();
302 toString(const ::Ice::ConnectionPtr& e)
304 return e->toString();
310 return v ?
"true" :
"false";
313 std::map<std::string, Resolver*> _attributes;
314 std::string (Helper::*_default)(
const std::string&)
const;
319 #ifndef ICE_CPP11_MAPPING
325 virtual void update() = 0;
329 template<
typename T>
class UpdaterT
ICE_FINAL :
public Updater
333 #ifdef ICE_CPP11_MAPPING
334 UpdaterT(
const std::shared_ptr<T>& updater,
void (T::*fn)()) :
336 UpdaterT(T* updater, void (T::*fn)()) :
343 virtual void update()
345 (_updater.get()->*_fn)();
350 const ICE_HANDLE<T> _updater;
354 #ifdef ICE_CPP11_MAPPING
355 template<
typename T> UpdaterPtr
356 newUpdater(
const std::shared_ptr<T>& updater,
void (T::*fn)())
360 return std::make_shared<UpdaterT<T>>(updater, fn);
368 template<
typename T> UpdaterPtr
369 newUpdater(
const IceInternal::Handle<T>& updater,
void (T::*fn)())
373 return UpdaterPtr(
new UpdaterT<T>(updater.get(), fn));
386 typedef T MetricsType;
387 typedef typename IceInternal::MetricsMapT<MetricsType>::EntryTPtr EntryPtrType;
388 typedef std::vector<EntryPtrType> EntrySeqType;
390 ObserverT() : _previousDelay(0)
397 if(!_watch.isStarted())
406 ::Ice::Long lifetime = _previousDelay + _watch.stop();
407 for(
typename EntrySeqType::const_iterator p = _objects.begin(); p != _objects.end(); ++p)
409 (*p)->detach(lifetime);
414 failed(
const std::string& exceptionName)
416 for(
typename EntrySeqType::const_iterator p = _objects.begin(); p != _objects.end(); ++p)
418 (*p)->failed(exceptionName);
422 template<
typename Function>
void
423 forEach(
const Function& func)
425 for(
typename EntrySeqType::const_iterator p = _objects.begin(); p != _objects.end(); ++p)
432 init(
const MetricsHelperT<MetricsType>& , EntrySeqType& objects, ObserverT* previous = 0)
434 _objects.swap(objects);
441 _previousDelay = previous->_previousDelay + previous->_watch.delay();
446 for(
typename EntrySeqType::const_iterator p = previous->_objects.begin(); p != previous->_objects.end(); ++p)
448 if(find(_objects.begin(), _objects.end(), *p) == _objects.end())
450 (*p)->detach(_previousDelay);
456 getEntry(IceInternal::MetricsMapT<MetricsType>* map)
458 for(
typename EntrySeqType::const_iterator p = _objects.begin(); p != _objects.end(); ++p)
460 if((*p)->getMap() == map)
468 template<
typename ObserverImpl,
typename ObserverMetricsType> ICE_INTERNAL_HANDLE<ObserverImpl>
469 getObserver(
const std::string& mapName,
const MetricsHelperT<ObserverMetricsType>& helper)
471 std::vector<typename IceInternal::MetricsMapT<ObserverMetricsType>::EntryTPtr> metricsObjects;
472 for(
typename EntrySeqType::const_iterator p = _objects.begin(); p != _objects.end(); ++p)
474 typename IceInternal::MetricsMapT<ObserverMetricsType>::EntryTPtr e = (*p)->getMatching(mapName, helper);
477 metricsObjects.push_back(e);
481 if(metricsObjects.empty())
486 ICE_INTERNAL_HANDLE<ObserverImpl> obsv =
ICE_MAKE_SHARED(ObserverImpl);
487 obsv->init(helper, metricsObjects);
493 EntrySeqType _objects;
494 IceUtilInternal::StopWatch _watch;
498 template<
typename ObserverImplType>
503 #ifdef ICE_CPP11_MAPPING
504 using ObserverImplPtrType = ::std::shared_ptr<ObserverImplType>;
505 using MetricsType =
typename ObserverImplType::MetricsType;
506 using MetricsMapSeqType = std::vector<::std::shared_ptr<IceInternal::MetricsMapT<MetricsType>>>;
509 typedef typename ObserverImplType::MetricsType MetricsType;
510 typedef std::vector<IceUtil::Handle<IceInternal::MetricsMapT<MetricsType> > > MetricsMapSeqType;
513 ObserverFactoryT(
const IceInternal::MetricsAdminIPtr& metrics,
const std::string& name) :
514 _metrics(metrics), _name(name), _enabled(0)
516 _metrics->registerMap<MetricsType>(name,
this);
523 _metrics->unregisterMap(_name);
528 getObserver(
const MetricsHelperT<MetricsType>& helper)
536 typename ObserverImplType::EntrySeqType metricsObjects;
537 for(
typename MetricsMapSeqType::const_iterator p = _maps.begin(); p != _maps.end(); ++p)
539 typename ObserverImplType::EntryPtrType entry = (*p)->getMatching(helper);
542 metricsObjects.push_back(entry);
546 if(metricsObjects.empty())
552 obsv->init(helper, metricsObjects);
556 template<
typename ObserverPtrType> ObserverImplPtrType
557 getObserver(
const MetricsHelperT<MetricsType>& helper,
const ObserverPtrType& observer)
559 #ifdef ICE_CPP11_MAPPING
560 ObserverImplPtrType old = std::dynamic_pointer_cast<ObserverImplType>(observer);
562 ObserverImplPtrType old = ObserverImplPtrType::dynamicCast(observer);
565 if(!observer || !old)
567 return getObserver(helper);
575 typename ObserverImplType::EntrySeqType metricsObjects;
576 for(
typename MetricsMapSeqType::const_iterator p = _maps.begin(); p != _maps.end(); ++p)
578 typename ObserverImplType::EntryPtrType entry = (*p)->getMatching(helper, old->getEntry(p->get()));
581 metricsObjects.push_back(entry);
584 if(metricsObjects.empty())
591 obsv->init(helper, metricsObjects, old.get());
595 template<
typename SubMapMetricsType>
void
596 registerSubMap(
const std::string& subMap,
MetricsMap MetricsType::* member)
599 _metrics->registerSubMap<SubMapMetricsType>(_name, subMap, member);
602 bool isEnabled()
const
604 return _enabled != 0;
607 virtual void update()
617 std::vector<IceInternal::MetricsMapIPtr> maps = _metrics->getMaps(_name);
619 for(std::vector<IceInternal::MetricsMapIPtr>::const_iterator p = maps.begin(); p != maps.end(); ++p)
621 #ifdef ICE_CPP11_MAPPING
622 _maps.push_back(::std::dynamic_pointer_cast<IceInternal::MetricsMapT<MetricsType>>(*p));
624 _maps.push_back(
IceUtil::Handle<IceInternal::MetricsMapT<MetricsType> >::dynamicCast(*p));
626 assert(_maps.back());
628 _enabled.exchange(_maps.empty() ? 0 : 1);
638 void setUpdater(
const UpdaterPtr& updater)
653 IceInternal::MetricsAdminIPtr _metrics;
654 const std::string _name;
655 MetricsMapSeqType _maps;
660 IceUtilInternal::Atomic _enabled;
664 typedef ObserverT<Metrics> ObserverI;