From: Naoki Kambe Date: Wed, 21 Nov 2012 02:39:06 +0000 (+0900) Subject: [2225_statistics] merge two concrete methods and parameters into _Counter() X-Git-Tag: bind10-1.1.0beta1-release~72^2~40^2~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=949f8945514ac7d422a68f34d7cbf097c864bef8;p=thirdparty%2Fkea.git [2225_statistics] merge two concrete methods and parameters into _Counter() --- diff --git a/src/lib/python/isc/statistics/counter.py b/src/lib/python/isc/statistics/counter.py index a0862b2403..cc6e5fd434 100644 --- a/src/lib/python/isc/statistics/counter.py +++ b/src/lib/python/isc/statistics/counter.py @@ -84,11 +84,11 @@ def init(spec_file_name): module_spec = isc.config.module_spec_from_file(spec_file_name) class_name = '%sCounter' % module_spec.get_module_name() global _COUNTER - if issubclass(_COUNTER.__class__, _Counter): + if isinstance(_COUNTER, _Counter): # already loaded return _COUNTER # create an instance once - _COUNTER = globals()[class_name](module_spec) + _COUNTER = _Counter(module_spec) # make globals globals().update(_COUNTER._to_global) return _COUNTER @@ -170,7 +170,50 @@ class Counter(): pass class _Counter(): - """A basic counter class for concrete classes""" + """A module for holding all statistics counters of modules. The + counter numbers can be accessed by the accesseers defined + according to a spec file. In this class, the structure of per-zone + counters is assumed to be like this: + + zones/example.com./notifyoutv4 + zones/example.com./notifyoutv6 + zones/example.com./xfrrej + zones/example.com./xfrreqdone + zones/example.com./soaoutv4 + zones/example.com./soaoutv6 + zones/example.com./axfrreqv4 + zones/example.com./axfrreqv6 + zones/example.com./ixfrreqv4 + zones/example.com./ixfrreqv6 + zones/example.com./xfrsuccess + zones/example.com./xfrfail + zones/example.com./time_to_ixfr + zones/example.com./time_to_axfr + ixfr_running + axfr_running + socket/unixdomain/open + socket/unixdomain/openfail + socket/unixdomain/close + socket/unixdomain/bindfail + socket/unixdomain/acceptfail + socket/unixdomain/accept + socket/unixdomain/senderr + socket/unixdomain/recverr + socket/ipv4/tcp/open + socket/ipv4/tcp/openfail + socket/ipv4/tcp/close + socket/ipv4/tcp/connfail + socket/ipv4/tcp/conn + socket/ipv4/tcp/senderr + socket/ipv4/tcp/recverr + socket/ipv6/tcp/open + socket/ipv6/tcp/openfail + socket/ipv6/tcp/close + socket/ipv6/tcp/connfail + socket/ipv6/tcp/conn + socket/ipv6/tcp/senderr + socket/ipv6/tcp/recverr + """ # '_SERVER_' is a special zone name representing an entire # count. It doesn't mean a specific zone, but it means an @@ -179,7 +222,7 @@ class _Counter(): # zone names are contained under this dirname in the spec file. _perzone_prefix = 'zones' - def __init__(self): + def __init__(self, module_spec): # for exporting to the global scope self._to_global = {} self._statistics_spec = {} @@ -190,9 +233,37 @@ class _Counter(): self._start_time = {} self._disabled = False self._rlock = threading.RLock() + self._statistics_spec = module_spec.get_statistics_spec() + self._zones_item_list = isc.config.spec_name_list( + isc.config.find_spec_part( + self._statistics_spec, self._perzone_prefix)\ + ['named_set_item_spec']['map_item_spec']) + self._xfrrunning_names = [ + n for n in isc.config.spec_name_list\ + (self._statistics_spec) \ + if n.find('xfr_running') == 1 \ + or n.find('xfr_deferred') == 1 \ + or n.find('soa_in_progress') == 0 ] + self._unixsocket_names = [ \ + n.split('/')[-1] for n in \ + isc.config.spec_name_list( + self._statistics_spec, "", True) \ + if n.find('socket/unixdomain/') == 0 ] + self._ipsocket_names = [ \ + (n.split('/')[-3], n.split('/')[-1]) for n in \ + isc.config.spec_name_list( + self._statistics_spec, "", True) \ + if n.find('socket/ipv4/tcp/') == 0 \ + or n.find('socket/ipv6/tcp/') == 0 ] + self._create_perzone_functors() + self._create_perzone_timer_functors() + self._create_xfrrunning_functors() + self._create_unixsocket_functors() + self._create_ipsocket_functors() self._to_global['clear_counters'] = self.clear_counters self._to_global['disable'] = self.disable self._to_global['enable'] = self.enable + self._to_global['dump_statistics'] = self.dump_statistics def clear_counters(self): """clears all statistics data""" @@ -274,6 +345,36 @@ class _Counter(): self._to_global['inc_%s' % item] = __incrementer self._to_global['get_%s' % item] = __getter + def _create_perzone_timer_functors(self): + """Creates timer method of each per-zone counter based on the + spec file. Starter of the timer can be accessed by the name + "start_${item_name}". Stopper of the timer can be accessed by + the name "stop_${item_name}". These starter and stopper are + passed to the XfrinConnection class as timer handlers.""" + for item in self._zones_item_list: + if item.find('time_to_') == -1: continue + def __getter(zone_name, counter_name=item): + """A getter method for perzone timer. A zone name in + string is required in argument.""" + return self._getter( + '%s/%s/%s' % \ + (self._perzone_prefix, zone_name, counter_name)) + def __starttimer(zone_name, counter_name=item): + """A starter method for perzone timer. A zone name in + string is required in argument.""" + self._starttimer( + '%s/%s/%s' % \ + (self._perzone_prefix, zone_name, counter_name)) + def __stoptimer(zone_name, counter_name=item): + """A stopper method for perzone timer. A zone name in + string is required in argument.""" + self._stoptimer( + '%s/%s/%s' % \ + (self._perzone_prefix, zone_name, counter_name)) + self._to_global['start_%s' % item] = __starttimer + self._to_global['stop_%s' % item] = __stoptimer + self._to_global['get_%s' % item] = __getter + def _create_xfrrunning_functors(self): """Creates increment/decrement method of (a|i)xfr_running based on the spec file. Incrementer can be accessed by name @@ -326,51 +427,6 @@ class _Counter(): **zones_data) return statistics_data -class XfroutCounter(Counter): - """A module for holding all statistics counters of Xfrout. The - counter numbers can be accessed by the accesseers defined - according to a spec file. In this class, the structure of per-zone - counters is assumed to be like this: - - zones/example.com./notifyoutv4 - zones/example.com./notifyoutv6 - zones/example.com./xfrrej - zones/example.com./xfrreqdone - ixfr_running - axfr_running - socket/unixdomain/open - socket/unixdomain/openfail - socket/unixdomain/close - socket/unixdomain/bindfail - socket/unixdomain/acceptfail - socket/unixdomain/accept - socket/unixdomain/senderr - socket/unixdomain/recverr - """ - - def __init__(self, module_spec): - """Creates an instance. A module_spec object for the target - module Xfrout is required in the argument.""" - Counter.__init__(self) - self._statistics_spec = module_spec.get_statistics_spec() - self._zones_item_list = isc.config.spec_name_list( - isc.config.find_spec_part( - self._statistics_spec, self._perzone_prefix)\ - ['named_set_item_spec']['map_item_spec']) - self._xfrrunning_names = [ - n for n in isc.config.spec_name_list\ - (self._statistics_spec) \ - if n.find('xfr_running') == 1 ] - self._unixsocket_names = [ \ - n.split('/')[-1] for n in \ - isc.config.spec_name_list( - self._statistics_spec, "", True) \ - if n.find('socket/unixdomain/') == 0 ] - self._create_perzone_functors() - self._create_xfrrunning_functors() - self._create_unixsocket_functors() - self._to_global['dump_statistics'] = self.dump_statistics - def _create_unixsocket_functors(self): """Creates increment method of unixsocket socket. Incrementer can be accessed by name "inc_unixsocket_${item_name}".""" @@ -387,95 +443,6 @@ class XfroutCounter(Counter): self._to_global['inc_unixsocket_%s' % item] = __incrementer self._to_global['get_unixsocket_%s' % item] = __getter -class XfrinCounter(Counter): - """A module for holding all statistics counters of Xfrin. The - counter numbers can be accessed by the accesseers defined - according to a spec file. In this class, the structure of per-zone - counters is assumed to be like this: - - zones/example.com./soaoutv4 - zones/example.com./soaoutv6 - zones/example.com./axfrreqv4 - zones/example.com./axfrreqv6 - zones/example.com./ixfrreqv4 - zones/example.com./ixfrreqv6 - zones/example.com./xfrsuccess - zones/example.com./xfrfail - zones/example.com./time_to_ixfr - zones/example.com./time_to_axfr - socket/ipv4/tcp/open - socket/ipv4/tcp/openfail - socket/ipv4/tcp/close - socket/ipv4/tcp/connfail - socket/ipv4/tcp/conn - socket/ipv4/tcp/senderr - socket/ipv4/tcp/recverr - socket/ipv6/tcp/open - socket/ipv6/tcp/openfail - socket/ipv6/tcp/close - socket/ipv6/tcp/connfail - socket/ipv6/tcp/conn - socket/ipv6/tcp/senderr - socket/ipv6/tcp/recverr - """ - - def __init__(self, module_spec): - """Creates an instance. A module_spec object for the target - module Xfrin is required in the argument.""" - Counter.__init__(self) - self._statistics_spec = module_spec.get_statistics_spec() - self._zones_item_list = isc.config.spec_name_list(\ - isc.config.find_spec_part( - self._statistics_spec, self._perzone_prefix)\ - ['named_set_item_spec']['map_item_spec']) - self._xfrrunning_names = [ - n for n in isc.config.spec_name_list\ - (self._statistics_spec) \ - if n.find('xfr_running') == 1 \ - or n.find('xfr_deferred') == 1 \ - or n.find('soa_in_progress') == 0 ] - self._ipsocket_names = [ \ - (n.split('/')[-3], n.split('/')[-1]) for n in \ - isc.config.spec_name_list( - self._statistics_spec, "", True) \ - if n.find('socket/ipv4/tcp/') == 0 \ - or n.find('socket/ipv6/tcp/') == 0 ] - self._create_perzone_functors() - self._create_perzone_timer_functors() - self._create_xfrrunning_functors() - self._create_ipsocket_functors() - self._to_global['dump_statistics'] = self.dump_statistics - - def _create_perzone_timer_functors(self): - """Creates timer method of each per-zone counter based on the - spec file. Starter of the timer can be accessed by the name - "start_${item_name}". Stopper of the timer can be accessed by - the name "stop_${item_name}". These starter and stopper are - passed to the XfrinConnection class as timer handlers.""" - for item in self._zones_item_list: - if item.find('time_to_') == -1: continue - def __getter(zone_name, counter_name=item): - """A getter method for perzone timer. A zone name in - string is required in argument.""" - return self._getter( - '%s/%s/%s' % \ - (self._perzone_prefix, zone_name, counter_name)) - def __starttimer(zone_name, counter_name=item): - """A starter method for perzone timer. A zone name in - string is required in argument.""" - self._starttimer( - '%s/%s/%s' % \ - (self._perzone_prefix, zone_name, counter_name)) - def __stoptimer(zone_name, counter_name=item): - """A stopper method for perzone timer. A zone name in - string is required in argument.""" - self._stoptimer( - '%s/%s/%s' % \ - (self._perzone_prefix, zone_name, counter_name)) - self._to_global['start_%s' % item] = __starttimer - self._to_global['stop_%s' % item] = __stoptimer - self._to_global['get_%s' % item] = __getter - def _create_ipsocket_functors(self): """Creates increment method of ip socket. Incrementer can be accessed by name "inc_ipv4socket_${item_name}" for ipv4 or