首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何去除Django中的Prometheus响应内容?

如何去除Django中的Prometheus响应内容?
EN

Stack Overflow用户
提问于 2020-03-03 13:24:42
回答 1查看 532关注 0票数 1

我试图在Django应用程序上实现Prometheus客户端。但是,我得到的输出是无效的,这就是Prometheus服务器无法解析度量标准的原因。

这是我的Prometheus视图

代码语言:javascript
复制
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from prometheus_client import (
    multiprocess,
    CollectorRegistry,
    generate_latest,
    CONTENT_TYPE_LATEST,
)


class PrometheusAPIView(APIView):
    def get(self, request, format=None):
        registry = CollectorRegistry()
        multiprocess.MultiProcessCollector(registry)
        return (
            Response(
                generate_latest(registry),
                status=status.HTTP_200_OK,
                content_type=CONTENT_TYPE_LATEST,
            )
        )

这是URL模式

代码语言:javascript
复制
urlpatterns = [
        url(r'^metrics/', PrometheusAPIView.as_view()),
    ]

当我卷曲metrics/端点时,我得到以下信息

代码语言:javascript
复制
❯ curl localhost:8000/metrics/                                                                                      
"# HELP model_latency Multiprocess metric\n# TYPE model_latency histogram\nmodel_latency_bucket{app=\"app-name\",le=\"10.0\"} 4.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.1\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.005\"} 0.0\nmodel_latency_sum{app=\"app-name\"} 7.6447835210005906\nmodel_latency_bucket{app=\"app-name\",le=\"0.25\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.75\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"7.5\"} 4.0\nmodel_latency_bucket{app=\"app-name\",le=\"5.0\"} 4.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.5\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"2.5\"} 3.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.075\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.01\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.05\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"+Inf\"} 4.0\nmodel_latency_bucket{app=\"app-name\",le=\"1.0\"} 0.0\nmodel_latency_bucket{app=\"app-name\",le=\"0.025\"} 0.0\nmodel_latency_count{app=\"app-name\"} 4.0\n# HELP log_count_total Multiprocess metric\n# TYPE log_count_total counter\nlog_count_total{app=\"app-name\",level=\"INFO\"} 8.0\n"

但是,我所期望的是

代码语言:javascript
复制
# HELP model_latency Multiprocess metric
# TYPE model_latency histogram
model_latency_bucket{app="app-name",le="10.0"} 2.0
model_latency_bucket{app="app-name",le="0.1"} 0.0
model_latency_bucket{app="app-name",le="0.005"} 0.0
model_latency_sum{app="app-name"} 4.431863597000756
model_latency_bucket{app="app-name",le="0.25"} 0.0
model_latency_bucket{app="app-name",le="0.75"} 0.0
model_latency_bucket{app="app-name",le="7.5"} 2.0
model_latency_bucket{app="app-name",le="5.0"} 2.0
model_latency_bucket{app="app-name",le="0.5"} 0.0
model_latency_bucket{app="app-name",le="2.5"} 1.0
model_latency_bucket{app="app-name",le="0.075"} 0.0
model_latency_bucket{app="app-name",le="0.01"} 0.0
model_latency_bucket{app="app-name",le="0.05"} 0.0
model_latency_bucket{app="app-name",le="+Inf"} 2.0
model_latency_bucket{app="app-name",le="1.0"} 0.0
model_latency_bucket{app="app-name",le="0.025"} 0.0
model_latency_count{app="app-name"} 2.0
# HELP log_count_total Multiprocess metric
# TYPE log_count_total counter
log_count_total{app="app-name",level="INFO"} 4.0

所以,基本上,我需要去掉那些转义字符的输出。

我试着在下面的反应中删除,但这是一个错误

代码语言:javascript
复制
return (
            Response(
                generate_latest(registry),
                status=status.HTTP_200_OK,
                content_type=CONTENT_TYPE_LATEST,
            )
            .__str__()
            .strip()

我该如何解决这个问题?提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 15:24:38

如果您想/必须为您的处理程序使用APIView基类,那么您需要使用StaticHTMLRenderer,这样就不会转义Prometheus度量数据。

代码语言:javascript
复制
from rest_framework.renderers import StaticHTMLRenderer

class PrometheusAPIView(APIView):

    renderer_classes = [StaticHTMLRenderer]

    def get(self, request, format=None):
        registry = CollectorRegistry()
        multiprocess.MultiProcessCollector(registry)
        return (
            Response(
                generate_latest(registry),
                status=status.HTTP_200_OK,
                content_type=CONTENT_TYPE_LATEST,
            )
        )

您还可以考虑完全放弃APIView,并使用标准的Django处理程序:

代码语言:javascript
复制
from django.http import HttpResponse


def metrics(request):
    registry = CollectorRegistry()
    multiprocess.MultiProcessCollector(registry)
    return HttpResponse(
        generate_latest(registry),
        content_type=CONTENT_TYPE_LATEST)



urlpatterns = [
    path('metrics/', metrics),
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60508272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档