Merge pull request #4465 from ryanpetrello/json-metrics

add support for Accept:application/json to /api/v2/metrics

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
softwarefactory-project-zuul[bot]
2019-08-12 20:26:16 +00:00
committed by GitHub
5 changed files with 20 additions and 14 deletions

View File

@@ -2,6 +2,7 @@
# All Rights Reserved. # All Rights Reserved.
from django.utils.safestring import SafeText from django.utils.safestring import SafeText
from prometheus_client.parser import text_string_to_metric_families
# Django REST Framework # Django REST Framework
from rest_framework import renderers from rest_framework import renderers
@@ -103,3 +104,16 @@ class AnsiTextRenderer(PlainTextRenderer):
class AnsiDownloadRenderer(PlainTextRenderer): class AnsiDownloadRenderer(PlainTextRenderer):
format = "ansi_download" format = "ansi_download"
class PrometheusJSONRenderer(renderers.JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
parsed_metrics = text_string_to_metric_families(data)
data = {}
for family in parsed_metrics:
for sample in family.samples:
data[sample[0]] = {"labels": sample[1], "value": sample[2]}
return super(PrometheusJSONRenderer, self).render(
data, accepted_media_type, renderer_context
)

View File

@@ -31,9 +31,10 @@ class MetricsView(APIView):
swagger_topic = 'Metrics' swagger_topic = 'Metrics'
renderer_classes = [renderers.PlainTextRenderer, renderer_classes = [renderers.PlainTextRenderer,
renderers.PrometheusJSONRenderer,
renderers.BrowsableAPIRenderer,] renderers.BrowsableAPIRenderer,]
def get(self, request, format='txt'): def get(self, request):
''' Show Metrics Details ''' ''' Show Metrics Details '''
if (request.user.is_superuser or request.user.is_system_auditor): if (request.user.is_superuser or request.user.is_system_auditor):
return Response(metrics().decode('UTF-8')) return Response(metrics().decode('UTF-8'))

View File

@@ -1,5 +1,3 @@
from prometheus_client.parser import text_string_to_metric_families
from awxkit.api.resources import resources from awxkit.api.resources import resources
from . import base from . import base
from . import page from . import page
@@ -8,14 +6,8 @@ from . import page
class Metrics(base.Base): class Metrics(base.Base):
def get(self, **query_parameters): def get(self, **query_parameters):
request = self.connection.get(self.endpoint, query_parameters) request = self.connection.get(self.endpoint, query_parameters,
self.page_identity(request, ignore_json_errors=True) headers={'Accept': 'application/json'})
parsed_metrics = text_string_to_metric_families(request.text)
data = {}
for family in parsed_metrics:
for sample in family.samples:
data[sample[0]] = {"labels": sample[1], "value": sample[2]}
request.json = lambda: data
return self.page_identity(request) return self.page_identity(request)

View File

@@ -172,7 +172,7 @@ class Page(object):
resp.status_code = 200 resp.status_code = 200
return cls(r=resp) return cls(r=resp)
def page_identity(self, response, request_json=None, ignore_json_errors=False): def page_identity(self, response, request_json=None):
"""Takes a `requests.Response` and """Takes a `requests.Response` and
returns a new __item_class__ instance if the request method is not a get, or returns returns a new __item_class__ instance if the request method is not a get, or returns
a __class__ instance if the request path is different than the caller's `endpoint`. a __class__ instance if the request path is different than the caller's `endpoint`.
@@ -191,7 +191,7 @@ class Page(object):
data = response.json() data = response.json()
except ValueError as e: # If there was no json to parse except ValueError as e: # If there was no json to parse
data = dict() data = dict()
if (response.text and not ignore_json_errors) or response.status_code not in (200, 202, 204): if response.text or response.status_code not in (200, 202, 204):
text = response.text text = response.text
if len(text) > 1024: if len(text) > 1024:
text = text[:1024] + '... <<< Truncated >>> ...' text = text[:1024] + '... <<< Truncated >>> ...'

View File

@@ -1,7 +1,6 @@
PyYAML>=5.1 PyYAML>=5.1
cryptography cryptography
flake8 flake8
prometheus-client
python-dateutil python-dateutil
requests requests
termcolor termcolor