如何从flask端点返回纯文本?普罗米修斯需要

问题描述 投票:0回答:1

我需要设置一个

/metrics
端点,以便 Prometheus 可以使用有关端点的统计信息。我该怎么做呢?

我的 Flask 应用程序中有这个:

@app.route('/metrics')
def metrics():
    def generateMetrics():
        metrics = ""
        ... some string builder logic
        return metrics

    response = make_response(generateMetrics(), 200)
    response.mimetype = "text/plain"
    return response

这是最好的方法吗?返回字符串(这里只返回

metrics
)和返回纯文本有什么区别?为什么我需要 mimetype?

python flask plaintext
1个回答
31
投票

这是最好的方法吗?

有多种方法可以设置 MIME 类型,在此 StackOverflow 问题中有更好的解释和讨论。你的方法很有效并且完成了工作。

返回字符串和返回纯文本有什么区别?

如果您返回一个字符串,Flask 将自动为您处理一些响应逻辑。这意味着使用一些默认值。如果您设置两个不同的端点,您会发现差异在于您的代码返回以下标头:

Content-Type:"text/plain; charset=utf-8"

仅返回字符串(和默认 MIME 类型)时将返回以下标头:

Content-Type:"text/html; charset=utf-8"

为什么我需要 mimetype?

您可能会说这在技术上更正确,因为您的响应只是纯文本,而不是 HTML。然而,需要它的一个更强有力的原因是您正在使用的第三方系统(Prometheus)依赖或关心“Content-Type”标头的内容。如果他们这样做,那么您必须设置让他们接受。

示例代码

对于 Content-Type 标头演示,我使用了以下示例 Python 代码:

from flask import Flask, make_response
app = Flask(__name__)


def generateMetrics():
    return "hello world"


@app.route('/metrics')
def metrics():
    response = make_response(generateMetrics(), 200)
    response.mimetype = "text/plain"
    return response


@app.route('/metrics2')
def metrics2():
    return generateMetrics()

然后我使用 Postman 查看返回的正文和标头。

© www.soinside.com 2019 - 2024. All rights reserved.