自定义检测

分布式跟踪对于支持的框架和启用了跟踪的情况下是开箱即用的。如果你使用的是不支持的框架或不想打开跟踪,你可以为分布式跟踪设置自定义仪器。

此页面描述了如何手动将跟踪信息传播到你的 Python 应用程序中和从应用程序中传出。你只需要确保你的应用程序提取传入的头部信息,并在应用程序内发出请求时再次设置这些头部信息。

传入的跟踪信息需要被提取并存储在内存中以供后续使用。Sentry 提供了 continue_trace() 函数来帮助你完成此操作。传入的跟踪信息可以来自不同的地方:

  • 在 Web 环境中,它通过 HTTP 头部发送,例如,由你在前端项目中使用的另一个 Sentry SDK 发送。
  • 在作业队列(如 Celery)中,可以从元数据或头部变量中检索。
  • 你也可以从环境变量中获取跟踪信息。

以下是一个如何使用 continue_trace() 提取和存储传入跟踪信息的示例:

Copied
import sentry_sdk
from my_project import get_incoming_headers_as_dict

headers = get_incoming_headers_as_dict()

transaction = sentry_sdk.continue_trace(headers)
with sentry_sdk.start_transaction(transaction):
   ...

在这个示例中,get_incoming_headers_as_dict() 返回一个包含来自 HTTP 头部、环境变量或你的项目用于与外部世界通信的任何其他机制的跟踪信息的字典。

Sentry 的 continue_trace() 函数将提取给定的头部信息,尝试找到 sentry-tracebaggage 头部,并将它们存储在内存中以供后续使用。

continue_trace() 返回一个事务,但不会启动它。要启动事务,请使用 start_transaction()

为了让分布式跟踪工作,必须将两个头部 sentry-tracebaggage 添加到传出请求中。如果你在服务器端预生成 HTML,你可能需要查看将跟踪信息注入渲染的 HTML,它描述了如何通过 HTML 元标签传递跟踪信息。

如果你使用 RequestsAIOHTTP、低级别的 http.client 或 Python 2 上的 httplib 发送传出 HTTP 请求,这些跟踪信息会自动添加到传出请求中。

如果你没有使用上述任何库,你可以使用 Sentry SDK 的 get_traceparent()get_baggage() 函数生成此跟踪信息。

Copied
import sentry_sdk
from my_project import make_an_outgoing_request

headers = {}
headers["sentry-trace"] = sentry_sdk.get_traceparent()
headers["baggage"] = sentry_sdk.get_baggage()

make_an_outgoing_request(to="https://example.com", headers=headers)

在这个示例中,跟踪信息被传播到运行在 https://example.com 的项目。如果该项目使用 Sentry Python SDK,它将提取并保存跟踪信息以供后续使用。

这两个服务现在通过你的自定义分布式跟踪实现连接起来了。

要将跟踪信息传播到渲染的 HTML 中运行的 JavaScript,你必须将 sentry-tracebaggage 数据的 HTML meta 标签注入到渲染的 HTML 中。以下是一个示例:

Copied
import sentry_sdk
from my_project import render

meta = ""
meta += '<meta name="sentry-trace" content="%s">' % sentry_sdk.get_traceparent()
meta += '<meta name="baggage" content="%s">' % sentry_sdk.get_baggage()

html = """
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        {additional_meta}
    </head>
    <body>
        <p>This is a website.</p>
    </body>
</html>
""".format(additional_meta=meta)

render(html)

如果你的项目向其他服务发出传出请求,检查请求中是否包含 sentry-tracebaggage 头部。如果是,则分布式跟踪正在工作。