自动跟踪¶
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
的自动跟踪仍适用于其他未修饰的功能。
本文总阅读量次