描述bug
在mlflow>=2.13.1中,mlflow支持在某些操作中强制重置全局跟踪器提供程序(相关PR:mlflow/mlflow#12137),这可能会破坏/禁用prompt flow中的跟踪功能。
如何复现bug
在prompt flow设置mlflow后执行将导致此问题。以下代码片段可以演示这一点:
from mlflow.tracing.provider import reset_tracer_setup
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter, SpanExportResult
from promptflow.tracing import trace as pf_trace
class StdoutSpanExporter(SpanExporter):
def export(self, spans):
for span in spans:
print("trace id:", span.context.trace_id)
print("span id:", span.context.span_id)
return SpanExportResult.SUCCESS
def shutdown(self):
pass
@pf_trace
def do_something():
print("Doing something")
def setup_exporter():
trace.set_tracer_provider(TracerProvider())
tracer_provider: TracerProvider = trace.get_tracer_provider()
stdout_span_exporter = StdoutSpanExporter()
tracer_provider.add_span_processor(BatchSpanProcessor(stdout_span_exporter))
def main():
setup_exporter()
reset_tracer_setup() # this line will force reset tracer provider to NoOpTracerProvider
do_something()
if __name__ == "__main__":
main()
当reset_tracer_setup
执行时,所有已注册的导出器都将被重置,因此在关闭跟踪时没有stdout。我们不确定mlflow何时调用此函数,但似乎它会通过重置导出器来破坏/禁用prompt flow中的跟踪功能。
预期行为
mlflow中的操作不应修改全局跟踪器提供程序,这应该破坏OpenTelemetry标准。看起来prompt flow对此无能为力,这个问题暂时作为参考。
附加上下文
旧版本可能会遇到AttributeError
抱怨“NoOpTracerProvider
没有add_span_processor
”,有一个PR正在处理这个问题,以跳过设置并记录警告:#3407
2条答案
按热度按时间px9o7tmv1#
在mlflow仓库中打开了一个问题:mlflow/mlflow#12341
n3ipq98p2#
mlflow已在mlflow/mlflow#12457中修复了这个问题,在mlflow/mlflow#12457中,mlflow只会运行其OTel组件,而不是全局的。问题应该得到缓解;在发布补丁并验证后将关闭此问题。