跳转至

自动跟踪

logfire.install_auto_tracing 将跟踪指定模块中的所有函数调用。

这是通过更改这些模块的导入方式来实现的,因此必须在导入要跟踪的模块之前调用该函数。

例如,假设您的所有代码都位于应用程序包中,例如 app.mainapp.serverapp.db 等。您可以在应用程序包之外创建另一个文件,而不是使用 python app/main.py 启动应用程序,例如:

main.py
import logfire

logfire.configure()
logfire.install_auto_tracing(modules=['app'])

from app.main import main

main()

过滤要跟踪的模块

modules 参数可以是模块名称的列表。给定模块内的任何子模块也将被跟踪,例如 app.mainapp.server。名称以相同前缀开头的其他模块将不会被追踪,例如苹果

如果列表中的其中一个字符串不是有效的模块名称,它将被视为正则表达式,因此例如 modules=['app.*'] 除了 app.main 等之外,还会跟踪苹果

为了获得更多的控制,modules 参数可以是一个函数,该函数为应跟踪的模块返回 True。此函数将使用 [AutoTraceModule][logfire 调用。AutoTraceModule] 对象,该对象具有 namefilename 属性。例如,这应该跟踪典型 Python 安装中不属于标准库或第三方包的所有模块:

import pathlib

import logfire

PYTHON_LIB_ROOT = str(pathlib.Path(pathlib.__file__).parent)


def should_trace(module: logfire.AutoTraceModule) -> bool:
    return not module.filename.startswith(PYTHON_LIB_ROOT)


logfire.install_auto_tracing(should_trace)

从跟踪中排除函数

一旦您选择了要跟踪的模块,您可能不想跟踪这些模块中的_每个_函数。要从自动跟踪中排除函数,请向其添加 no_auto_trace 装饰器:

import logfire

@logfire.no_auto_trace
def my_function():
    # 嵌套函数也将被排除在外
    def inner_function():
        ...

    return other_function()


    # 此功能*不*从自动跟踪中排除。
    # 即使从上面排除的 'my_function' 调用,它仍然会被追踪。
def other_function():
    ...


# 修饰类的所有方法也将被排除在外
@no_auto_trace
class MyClass:
    def my_method(self):
        ...

在导入时检测到装饰器。仅支持 @no_auto_trace@logfire.no_auto_trace。重命名/别名函数或模块将不起作用。也不会通过另一个函数间接调用它。

此装饰器仅返回未更改的参数,因此运行时开销为零。

仅跟踪超过最短持续时间的函数

从跟踪中排除函数的更方便的方法是设置 min_duration 参数,例如:

# Only trace functions that take longer than 0.1 seconds
logfire.install_auto_tracing(modules=['app'], min_duration=0.1)

这意味着您可以自动获得应用程序中较重部分的可观察性,而无需太多的开销或数据。请注意,有一些注意事项:

  • 函数只有在运行超过 min_duration 次后才会开始被跟踪。这意味着:

    • 如果它的运行速度快于前几次min_duration,您将无法获得有关这些第一次调用的数据。

    • 如果第一次运行超过 min_duration,您也不会获取有关该调用的数据。

  • 如果函数运行超过 min_duration 次,则无论花费多长时间,每次调用该函数时都会跟踪该函数。

  • 测量函数调用的持续时间仍然会增加一小部分开销。对于非常频繁调用的微小函数,最好仍使用 @no_auto_trace装饰器以避免任何开销。使用 min_duration 的自动跟踪仍适用于其他未修饰的功能。


本文总阅读量