X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d7db1f0877015228835fac67d4ad08789d39c520..c3b26754a231ec909506f2ff28af1af9f2e27f2b:/services/nodemanager/arvnodeman/status.py diff --git a/services/nodemanager/arvnodeman/status.py b/services/nodemanager/arvnodeman/status.py index 069bf16895..1e18996da6 100644 --- a/services/nodemanager/arvnodeman/status.py +++ b/services/nodemanager/arvnodeman/status.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, print_function from future import standard_library import http.server +import time import json import logging import socketserver @@ -26,6 +27,7 @@ class Server(socketserver.ThreadingMixIn, http.server.HTTPServer, object): return self._config = config self._tracker = tracker + self._tracker.update({'config_max_nodes': config.getint('Daemon', 'max_nodes')}) super(Server, self).__init__( (config.get('Manage', 'address'), port), Handler) self._thread = threading.Thread(target=self.serve_forever) @@ -75,20 +77,53 @@ class Handler(http.server.BaseHTTPRequestHandler, object): class Tracker(object): def __init__(self): self._mtx = threading.Lock() - self._latest = {} + self._latest = { + 'list_nodes_errors': 0, + 'create_node_errors': 0, + 'destroy_node_errors': 0, + 'boot_failures': 0, + 'actor_exceptions': 0 + } self._version = {'Version' : __version__} + self._idle_nodes = {} def get_json(self): with self._mtx: - return json.dumps(dict(self._latest, **self._version)) + times = {'idle_times' : {}} + now = time.time() + for node, ts in self._idle_nodes.items(): + times['idle_times'][node] = int(now - ts) + return json.dumps( + dict(dict(self._latest, **self._version), **times)) def keys(self): with self._mtx: return self._latest.keys() + def get(self, key): + with self._mtx: + return self._latest.get(key) + def update(self, updates): with self._mtx: self._latest.update(updates) + def counter_add(self, counter, value=1): + with self._mtx: + self._latest.setdefault(counter, 0) + self._latest[counter] += value + + def idle_in(self, nodename): + with self._mtx: + if self._idle_nodes.get(nodename): + return + self._idle_nodes[nodename] = time.time() + + def idle_out(self, nodename): + with self._mtx: + try: + del self._idle_nodes[nodename] + except KeyError: + pass tracker = Tracker()