From 48ab6b615a16e8b3ddc00e60964ba2c5d7804615 Mon Sep 17 00:00:00 2001 From: Mike Terzo Date: Mon, 23 Jan 2017 02:42:50 -0500 Subject: [PATCH] Support for PuppetDB 3.x on all environments Mbeans use type=default in puppetdb 3x, type was removed in 4x. --- puppetboard/app.py | 21 ++++++++++++++++----- puppetboard/utils.py | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/puppetboard/app.py b/puppetboard/app.py index 63cceca..8e6fa14 100644 --- a/puppetboard/app.py +++ b/puppetboard/app.py @@ -21,7 +21,7 @@ from pypuppetdb.QueryBuilder import * from puppetboard.forms import (CatalogForm, QueryForm) from puppetboard.utils import ( - get_or_abort, yield_or_stop, + get_or_abort, yield_or_stop, get_db_version, jsonprint, prettyprint ) from puppetboard.dailychart import get_daily_reports_chart @@ -173,15 +173,23 @@ def index(env): query = app.config['OVERVIEW_FILTER'] prefix = 'puppetlabs.puppetdb.population' + query_type = '' + + # Puppet DB version changed the query format from 3.2.0 + # to 4.0 when querying mbeans + if get_db_version(puppetdb) < (4, 0, 0): + query_type = 'type=default,' + num_nodes = get_or_abort( puppetdb.metric, - "{0}{1}".format(prefix, ':name=num-nodes')) + "{0}{1}".format(prefix, ':%sname=num-nodes' % query_type)) num_resources = get_or_abort( puppetdb.metric, - "{0}{1}".format(prefix, ':name=num-resources')) + "{0}{1}".format(prefix, ':%sname=num-resources' % query_type)) avg_resources_node = get_or_abort( puppetdb.metric, - "{0}{1}".format(prefix, ':name=avg-resources-per-node')) + "{0}{1}".format(prefix, + ':%sname=avg-resources-per-node' % query_type)) metrics['num_nodes'] = num_nodes['Value'] metrics['num_resources'] = num_resources['Value'] metrics['avg_resources_node'] = "{0:10.0f}".format( @@ -971,10 +979,13 @@ def radiator(env): check_env(env, envs) if env == '*': + query_type = '' + if get_db_version(puppetdb) < (4, 0, 0): + query_type = 'type=default,' query = None metrics = get_or_abort( puppetdb.metric, - 'puppetlabs.puppetdb.population:name=num-nodes') + 'puppetlabs.puppetdb.population:%sname=num-nodes' % query_type) num_nodes = metrics['Value'] else: query = AndOperator() diff --git a/puppetboard/utils.py b/puppetboard/utils.py index 0dd49b8..d21dcd3 100644 --- a/puppetboard/utils.py +++ b/puppetboard/utils.py @@ -24,6 +24,26 @@ def jsonprint(value): return json.dumps(value, indent=2, separators=(',', ': ')) +def get_db_version(puppetdb): + ''' + Get the version of puppetdb. Version form 3.2 query + interface is slightly different on mbeans + ''' + ver = () + try: + (major, minor, build) = [int(x) for x in + puppetdb.current_version().split('.')] + ver = (major, minor, build) + log.info("PuppetDB Version %d.%d.%d" % (major, minor, build)) + except HTTPError as e: + log.error(str(e)) + except ConnectionError as e: + log.error(str(e)) + except EmptyResponseError as e: + log.error(str(e)) + return ver + + def formatvalue(value): if isinstance(value, str): return value