Flask 支持编辑

为您的 Flask 项目设置 Elastic APM 很容易,并且您可以通过多种方式进行调整以满足您的需求。

安装编辑

使用 pip 安装 Elastic APM 代理

$ 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 文件中。

设置编辑

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

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

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

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

from elasticapm.contrib.flask import ElasticAPM

app = Flask(__name__)

apm = ElasticAPM(app)

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

from elasticapm.contrib.flask import ElasticAPM

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

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

from elasticapm.contrib.flask import ElasticAPM

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

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

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

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

您可以使用代理的 init_app 钩子来动态添加应用程序

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

用法编辑

配置代理后,它将自动跟踪事务并在 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()
额外数据编辑

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

@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 代理将自动将 Celery 任务中的错误和性能数据发送到 APM 服务器。

性能指标编辑

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

忽略特定路由编辑

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

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

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

与 RUM 代理集成编辑

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

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

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

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

支持的 Flask 和 Python 版本编辑

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