自动跟踪¶
logfire.install_auto_tracing 将跟踪指定模块中的所有函数调用。
这是通过更改这些模块的导入方式来实现的,因此必须在导入要跟踪的模块之前调用该函数。
例如,假设您的所有代码都位于应用程序包中,例如 app.main、app.server、app.db 等。您可以在应用程序包之外创建另一个文件,而不是使用 python app/main.py 启动应用程序,例如:
import logfire
logfire.configure()
logfire.install_auto_tracing(modules=['app'])
from app.main import main
main()
过滤要跟踪的模块¶
modules 参数可以是模块名称的列表。给定模块内的任何子模块也将被跟踪,例如 app.main 和 app.server。名称以相同前缀开头的其他模块将不会被追踪,例如苹果。
如果列表中的其中一个字符串不是有效的模块名称,它将被视为正则表达式,因此例如 modules=['app.*'] 除了 app.main 等之外,还会跟踪苹果。
为了获得更多的控制,modules 参数可以是一个函数,该函数为应跟踪的模块返回 True。此函数将使用 [AutoTraceModule][logfire 调用。AutoTraceModule] 对象,该对象具有 name 和 filename 属性。例如,这应该跟踪典型 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的自动跟踪仍适用于其他未修饰的功能。
本文总阅读量次