Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion exporter/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 6 additions & 1 deletion exporter/oscache.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,15 @@ 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
self.refresh_interval = refresh_interval
self.cache = ThreadSafeDict()
self.region = region
self.osclients = []
self.osclient = osclient

def cache_me(self, osclient):
self.osclients.append(osclient)
Expand Down Expand Up @@ -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)
9 changes: 9 additions & 0 deletions exporter/osclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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": {
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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()
Expand Down