Agent 工作原理
编辑Agent 工作原理
编辑为了收集 APM 事件(称为事务和跨度)、错误和指标,Python Agent 通过几种不同的方式为您的应用程序添加代码。这些事件随后被发送到 APM Server。APM Server 将它们转换为 Elasticsearch 适用的格式,并将其发送到 Elasticsearch 集群。然后,您可以使用 Kibana 中的 APM 应用程序深入了解应用程序中的延迟问题和错误原因。
总的来说,我们将收集必要数据的三个不同方法区分开来:框架集成、代码插桩和后台收集。
框架集成
编辑为了收集有关传入请求和后台任务的数据,我们集成了 Django、Flask 和 Celery 等框架。只要有可能,框架集成就会利用框架提供的钩子和信号。例如:
-
request_started
、request_finished
和got_request_exception
来自django.core.signals
的信号 -
request_started
、request_finished
和got_request_exception
来自flask.signals
的信号 -
task_prerun
、task_postrun
和task_failure
来自celery.signals
的信号
框架集成需要在您的应用程序中进行一些有限的代码更改。例如,对于 Django,您需要将 elasticapm.contrib.django
添加到 INSTALLED_APPS
中。
如果您未使用框架
编辑如果您未使用受支持的框架,例如简单的 Python 脚本,您仍然可以利用 Agent 的 自动插桩。查看我们有关 代码插桩 的文档。
代码插桩
编辑为了从数据库驱动程序、HTTP 库等收集数据,我们为这些库中的某些函数和方法添加了代码插桩。我们的插桩包装了这些可调用对象并收集了其他数据,例如:
- 在调用中花费的时间
- 数据库驱动程序执行的查询
- HTTP 库获取的 URL
我们使用第三方库 wrapt
来包装可调用对象。您可以在 Graham Dumpleton 的一系列优秀的 博文 中阅读有关 wrapt
工作原理的更多信息。
插桩会自动设置,不需要任何代码更改。请参阅 自动插桩,以了解有关我们支持哪些库的更多信息。
后台收集
编辑除了 APM 和错误数据外,Python Agent 还会定期收集系统和应用程序指标。此收集发生在 Agent 启动的后台线程中。
除了指标收集后台线程之外,Agent 还会为每个进程启动两个其他线程:
- 一个线程定期从 APM Server 获取远程配置
- 一个线程处理收集到的数据并通过 HTTP 将其发送到 APM Server。
请注意,每个实例化 Agent 的进程都会有这三个线程。这意味着当您例如使用 gunicorn 或 uwsgi 工作进程时,每个工作进程都会启动 Python Agent 启动的三个线程。