mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-05-23 08:25:57 +00:00
feat(tracing): add optional Langfuse support (#1717)
* feat(tracing): add optional Langfuse support * Fix tracing fail-fast behavior for explicitly enabled providers * fix(lint)
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
from deerflow.config import tracing_config as tracing_module
|
||||
|
||||
|
||||
@@ -9,6 +11,29 @@ def _reset_tracing_cache() -> None:
|
||||
tracing_module._tracing_config = None
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def clear_tracing_env(monkeypatch):
|
||||
for name in (
|
||||
"LANGSMITH_TRACING",
|
||||
"LANGCHAIN_TRACING_V2",
|
||||
"LANGCHAIN_TRACING",
|
||||
"LANGSMITH_API_KEY",
|
||||
"LANGCHAIN_API_KEY",
|
||||
"LANGSMITH_PROJECT",
|
||||
"LANGCHAIN_PROJECT",
|
||||
"LANGSMITH_ENDPOINT",
|
||||
"LANGCHAIN_ENDPOINT",
|
||||
"LANGFUSE_TRACING",
|
||||
"LANGFUSE_PUBLIC_KEY",
|
||||
"LANGFUSE_SECRET_KEY",
|
||||
"LANGFUSE_BASE_URL",
|
||||
):
|
||||
monkeypatch.delenv(name, raising=False)
|
||||
_reset_tracing_cache()
|
||||
yield
|
||||
_reset_tracing_cache()
|
||||
|
||||
|
||||
def test_prefers_langsmith_env_names(monkeypatch):
|
||||
monkeypatch.setenv("LANGSMITH_TRACING", "true")
|
||||
monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
|
||||
@@ -18,11 +43,12 @@ def test_prefers_langsmith_env_names(monkeypatch):
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.enabled is True
|
||||
assert cfg.api_key == "lsv2_key"
|
||||
assert cfg.project == "smith-project"
|
||||
assert cfg.endpoint == "https://smith.example.com"
|
||||
assert cfg.langsmith.enabled is True
|
||||
assert cfg.langsmith.api_key == "lsv2_key"
|
||||
assert cfg.langsmith.project == "smith-project"
|
||||
assert cfg.langsmith.endpoint == "https://smith.example.com"
|
||||
assert tracing_module.is_tracing_enabled() is True
|
||||
assert tracing_module.get_enabled_tracing_providers() == ["langsmith"]
|
||||
|
||||
|
||||
def test_falls_back_to_langchain_env_names(monkeypatch):
|
||||
@@ -39,11 +65,12 @@ def test_falls_back_to_langchain_env_names(monkeypatch):
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.enabled is True
|
||||
assert cfg.api_key == "legacy-key"
|
||||
assert cfg.project == "legacy-project"
|
||||
assert cfg.endpoint == "https://legacy.example.com"
|
||||
assert cfg.langsmith.enabled is True
|
||||
assert cfg.langsmith.api_key == "legacy-key"
|
||||
assert cfg.langsmith.project == "legacy-project"
|
||||
assert cfg.langsmith.endpoint == "https://legacy.example.com"
|
||||
assert tracing_module.is_tracing_enabled() is True
|
||||
assert tracing_module.get_enabled_tracing_providers() == ["langsmith"]
|
||||
|
||||
|
||||
def test_langsmith_tracing_false_overrides_langchain_tracing_v2_true(monkeypatch):
|
||||
@@ -55,8 +82,9 @@ def test_langsmith_tracing_false_overrides_langchain_tracing_v2_true(monkeypatch
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.enabled is False
|
||||
assert cfg.langsmith.enabled is False
|
||||
assert tracing_module.is_tracing_enabled() is False
|
||||
assert tracing_module.get_enabled_tracing_providers() == []
|
||||
|
||||
|
||||
def test_defaults_when_project_not_set(monkeypatch):
|
||||
@@ -68,4 +96,51 @@ def test_defaults_when_project_not_set(monkeypatch):
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.project == "deer-flow"
|
||||
assert cfg.langsmith.project == "deer-flow"
|
||||
|
||||
|
||||
def test_langfuse_config_is_loaded(monkeypatch):
|
||||
monkeypatch.setenv("LANGFUSE_TRACING", "true")
|
||||
monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "pk-lf-test")
|
||||
monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")
|
||||
monkeypatch.setenv("LANGFUSE_BASE_URL", "https://langfuse.example.com")
|
||||
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.langfuse.enabled is True
|
||||
assert cfg.langfuse.public_key == "pk-lf-test"
|
||||
assert cfg.langfuse.secret_key == "sk-lf-test"
|
||||
assert cfg.langfuse.host == "https://langfuse.example.com"
|
||||
assert tracing_module.get_enabled_tracing_providers() == ["langfuse"]
|
||||
|
||||
|
||||
def test_dual_provider_config_is_loaded(monkeypatch):
|
||||
monkeypatch.setenv("LANGSMITH_TRACING", "true")
|
||||
monkeypatch.setenv("LANGSMITH_API_KEY", "lsv2_key")
|
||||
monkeypatch.setenv("LANGFUSE_TRACING", "true")
|
||||
monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "pk-lf-test")
|
||||
monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")
|
||||
|
||||
_reset_tracing_cache()
|
||||
cfg = tracing_module.get_tracing_config()
|
||||
|
||||
assert cfg.langsmith.is_configured is True
|
||||
assert cfg.langfuse.is_configured is True
|
||||
assert tracing_module.is_tracing_enabled() is True
|
||||
assert tracing_module.get_enabled_tracing_providers() == ["langsmith", "langfuse"]
|
||||
|
||||
|
||||
def test_langfuse_enabled_requires_public_and_secret_keys(monkeypatch):
|
||||
monkeypatch.setenv("LANGFUSE_TRACING", "true")
|
||||
monkeypatch.delenv("LANGFUSE_PUBLIC_KEY", raising=False)
|
||||
monkeypatch.setenv("LANGFUSE_SECRET_KEY", "sk-lf-test")
|
||||
|
||||
_reset_tracing_cache()
|
||||
|
||||
assert tracing_module.get_tracing_config().is_configured is False
|
||||
assert tracing_module.get_enabled_tracing_providers() == []
|
||||
assert tracing_module.get_tracing_config().explicitly_enabled_providers == ["langfuse"]
|
||||
|
||||
with pytest.raises(ValueError, match="LANGFUSE_PUBLIC_KEY"):
|
||||
tracing_module.validate_enabled_tracing_providers()
|
||||
|
||||
Reference in New Issue
Block a user