From 1101aec193ec51fc7420c9283cc7294cdb563b52 Mon Sep 17 00:00:00 2001 From: Christian Schnidrig Date: Tue, 4 Sep 2018 15:16:30 +0200 Subject: [PATCH] get new token if token is invalid added token_refresh counter --- exporter/main.py | 2 +- exporter/oscache.py | 7 ++++++- exporter/osclient.py | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/exporter/main.py b/exporter/main.py index 5199085..e89e0ce 100755 --- a/exporter/main.py +++ b/exporter/main.py @@ -134,7 +134,7 @@ def handler(*args, **kwargs): os_region, os_timeout, os_retries) - oscache = OSCache(os_polling_interval, os_region) + oscache = OSCache(os_polling_interval, os_region, osclient) collectors.append(oscache) check_os_api = CheckOSApi(oscache, osclient) diff --git a/exporter/oscache.py b/exporter/oscache.py index 50f6ffd..bd5e571 100644 --- a/exporter/oscache.py +++ b/exporter/oscache.py @@ -39,7 +39,7 @@ def __exit__(self, type, value, traceback): class OSCache(Thread): - def __init__(self, refresh_interval, region): + def __init__(self, refresh_interval, region, osclient): Thread.__init__(self) self.daemon = True self.duration = 0 @@ -47,6 +47,7 @@ def __init__(self, refresh_interval, region): self.cache = ThreadSafeDict() self.region = region self.osclients = [] + self.osclient = osclient def cache_me(self, osclient): self.osclients.append(osclient) @@ -81,4 +82,8 @@ def get_stats(self): 'Cache refresh duration in seconds.', labels, registry=registry) duration.labels(*label_values).set(self.duration) + tokenRefresh = Gauge('openstack_exporter_token_refresh_count', + 'Number of times the keystone token needed to be refreshed.', + labels, registry=registry) + tokenRefresh.labels(*label_values).set(self.osclient.get_token_refresh_counter()) return generate_latest(registry) diff --git a/exporter/osclient.py b/exporter/osclient.py index c99ff35..e672b03 100644 --- a/exporter/osclient.py +++ b/exporter/osclient.py @@ -63,6 +63,11 @@ def __init__( self.session.mount( 'https://', requests.adapters.HTTPAdapter(max_retries=retries)) self._service_catalog = [] + self.token_refresh_counter = 0; + + + def get_token_refresh_counter(self): + return self.token_refresh_counter def is_valid_token(self): now = datetime.datetime.now(tz=dateutil.tz.tzutc()) @@ -73,6 +78,7 @@ def clear_token(self): self.valid_until = None def get_token(self): + self.token_refresh_counter += 1; self.clear_token() data = json.dumps({ "auth": { @@ -102,6 +108,7 @@ def get_token(self): logger.error( "Cannot get a valid token from {}".format( self.keystone_url)) + return None if r.status_code < 200 or r.status_code > 299: logger.error( @@ -249,6 +256,8 @@ def get_workers(self, service): msg = "{}: Got {} ({})".format( msg, ost_services_r.status_code, ost_services_r.content) logger.warning(msg) + if ost_services_r.status_code == 401: # authorizaton problem -> token failed? + self.clear_token() else: try: r_json = ost_services_r.json()