Flask 支持

编辑

轻松为您的 Flask 项目设置 Elastic APM,您可以通过多种方式对其进行调整以满足您的需求。

安装

编辑

使用 pip 安装 Elastic APM Agent

$ pip install "elastic-apm[flask]"

或者将 elastic-apm[flask] 添加到您项目的 requirements.txt 文件中。

对于 apm-server 6.2+,请确保您使用 2.0 或更高版本的 elastic-apm

如果您将 Flask 与 uwsgi 一起使用,请确保启用线程

如果您看到提到 psutil not found 的错误日志,您可以使用 pip install psutil 安装 psutil,或将 psutil 添加到您的 requirements.txt 文件中。

设置

编辑

要设置 Agent,您需要使用适当的设置对其进行初始化。

设置可以通过环境变量、应用程序设置或初始化参数进行配置。

您可以在配置页面中找到所有可用设置的列表。

要使用环境变量为您的应用程序初始化 Agent

from elasticapm.contrib.flask import ElasticAPM

app = Flask(__name__)

apm = ElasticAPM(app)

要使用应用程序设置中的 ELASTIC_APM 配置 Agent

from elasticapm.contrib.flask import ElasticAPM

app.config['ELASTIC_APM'] = {
    'SERVICE_NAME': '<SERVICE-NAME>',
    'SECRET_TOKEN': '<SECRET-TOKEN>',
}
apm = ElasticAPM(app)

最后一种选择是使用设置作为参数初始化 Agent

from elasticapm.contrib.flask import ElasticAPM

apm = ElasticAPM(app, service_name='<APP-ID>', secret_token='<SECRET-TOKEN>')
调试模式
编辑

请注意,只有当您的应用程序没有处于Flask 调试模式时,错误和事务才会发送到 APM 服务器。

要强制 Agent 在应用程序处于调试模式时发送数据,请将 ELASTIC_APM 字典中的 DEBUG 值设置为 True

app.config['ELASTIC_APM'] = {
        'SERVICE_NAME': '<SERVICE-NAME>',
        'SECRET_TOKEN': '<SECRET-TOKEN>',
        'DEBUG': True
}
动态构建应用程序?
编辑

您可以使用 Agent 的 init_app hook 动态添加应用程序

from elasticapm.contrib.flask import ElasticAPM
apm = ElasticAPM()

def create_app():
    app = Flask(__name__)
    apm.init_app(app, service_name='<SERVICE-NAME>', secret_token='<SECRET-TOKEN>')
    return app

使用

编辑

配置 Agent 后,它将自动跟踪事务并捕获 Flask 中未捕获的异常。如果您想发送其他事件,ElasticAPM Flask 中间件对象提供了一些快捷方式,可以通过引发异常或记录通用消息来实现。

通过调用 capture_exception 捕获任意异常

try:
    1 / 0
except ZeroDivisionError:
    apm.capture_exception()

使用 capture_message 记录通用消息

apm.capture_message('hello, world!')

将日志发送到 Elasticsearch

编辑

此功能已弃用,将在未来的版本中删除。

请参阅我们的日志记录文档,了解其他支持将日志发送到 Elasticsearch 的方法。

请注意,您可以始终使用capture_exceptioncapture_message将异常和消息发送到 APM 服务器。

from elasticapm import get_client

@app.route('/')
def bar():
    try:
        1 / 0
    except ZeroDivisionError:
        get_client().capture_exception()
额外数据
编辑

除了 Agent 默认记录的内容外,您还可以发送其他信息

@app.route('/')
def bar():
    try:
        1 / 0
    except ZeroDivisionError:
        app.logger.error('Math is hard',
            exc_info=True,
            extra={
                'good_at_math': False,
            }
        )
    )
Celery 任务
编辑

Elastic APM Agent 将自动将您的 Celery 任务的错误和性能数据发送到 APM 服务器。

性能指标

编辑

如果您已按照上述说明操作,则 Agent 已连接到正确的信号,并且应该正在报告性能指标。

忽略特定路由
编辑

您可以使用TRANSACTIONS_IGNORE_PATTERNS配置选项来忽略特定路由。给定的列表应为与事务名称匹配的正则表达式列表

app.config['ELASTIC_APM'] = {
    ...
    'TRANSACTIONS_IGNORE_PATTERNS': ['^OPTIONS ', '/api/']
    ...
}

这将忽略使用 OPTIONS 方法的任何请求以及包含 /api/ 的任何请求。

与 RUM Agent 集成
编辑

为了将浏览器中的性能测量与 Flask 应用程序中的测量相关联,您可以通过使用后端请求的跟踪 ID 和跨度 ID 配置 RUM(真实用户监控)Agent 来提供帮助。我们提供了一个方便的模板上下文处理器,它将所有必要的信息添加到您的模板上下文中。

初始化 ElasticAPM 时会自动安装上下文处理器。剩下要做的就是像这样更新初始化 RUM Agent 的调用(这可能发生在您的基本模板中)

elasticApm.init({
    serviceName: "my-frontend-service",
    pageLoadTraceId: "{{ apm["trace_id"] }}",
    pageLoadSpanId: "{{ apm["span_id"]() }}",
    pageLoadSampled: {{ apm["is_sampled_js"] }}
})

有关更多信息,请参阅JavaScript RUM Agent 文档

支持的 Flask 和 Python 版本

编辑

支持的FlaskPython版本的列表可以在我们的支持的技术页面上找到。