mirror of
https://github.com/ansible/awx.git
synced 2026-02-18 19:50:05 -03:30
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:
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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'))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 >>> ...'
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
PyYAML>=5.1
|
PyYAML>=5.1
|
||||||
cryptography
|
cryptography
|
||||||
flake8
|
flake8
|
||||||
prometheus-client
|
|
||||||
python-dateutil
|
python-dateutil
|
||||||
requests
|
requests
|
||||||
termcolor
|
termcolor
|
||||||
|
|||||||
Reference in New Issue
Block a user