Agent 工作原理

编辑

为了收集 APM 事件(称为事务和跨度)、错误和指标,Python Agent 通过几种不同的方式为您的应用程序添加代码。这些事件随后被发送到 APM Server。APM Server 将它们转换为 Elasticsearch 适用的格式,并将其发送到 Elasticsearch 集群。然后,您可以使用 Kibana 中的 APM 应用程序深入了解应用程序中的延迟问题和错误原因。

总的来说,我们将收集必要数据的三个不同方法区分开来:框架集成、代码插桩和后台收集。

框架集成

编辑

为了收集有关传入请求和后台任务的数据,我们集成了 Django、Flask 和 Celery 等框架。只要有可能,框架集成就会利用框架提供的钩子和信号。例如:

  • request_startedrequest_finishedgot_request_exception 来自 django.core.signals 的信号
  • request_startedrequest_finishedgot_request_exception 来自 flask.signals 的信号
  • task_preruntask_postruntask_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 启动的三个线程。