Skip to content

Commit 152feae

Browse files
collect mcp server names
1 parent 9b83471 commit 152feae

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

src/datu/app_config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ class DatuConfig(BaseSettings):
5757
schema_sample_limit (int): The maximum number of rows to sample from the schema.
5858
schema_categorical_threshold (int): The threshold for categorical columns in the schema.
5959
enable_schema_rag (bool): Enable RAG for schema extraction.
60+
enable_anonymized_telemetry (bool): Enable anonymized telemetry. Default is True.
61+
app_environment (str): The application environment (e.g., "dev", "test", "prod"). Default is "dev".
62+
telemetry (TelemetryConfig | None): Configuration settings for telemetry.
63+
enable_mcp (bool): Whether to enable MCP integration. Default is False.
64+
mcp (MCPConfig | None): Configuration settings for MCP integration.
65+
enable_schema_rag (bool): Enable RAG for schema extraction.
66+
schema_rag (SchemaRAGConfig | None): Configuration settings for schema RAG.
6067
6168
Attributes:
6269
host (str): The host address for the application.
@@ -78,7 +85,8 @@ class DatuConfig(BaseSettings):
7885
mcp (MCPConfig | None): Configuration settings for MCP integration.
7986
enable_schema_rag (bool): Enable RAG for schema extraction.
8087
schema_rag (SchemaRAGConfig | None): Configuration settings for schema RAG.
81-
88+
enable_anonymized_telemetry (bool): Enable anonymized telemetry.
89+
telemetry (TelemetryConfig | None): Configuration settings for telemetry.
8290
8391
"""
8492

src/datu/factory/llm_client_factory.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from typing import Literal
77

88
from datu.llm_clients.openai_client import OpenAIClient
9+
from datu.telemetry.product.events import MCPClientEvent
10+
from datu.telemetry.product.posthog import get_posthog_client
911

1012

1113
def get_llm_client(provider: Literal["openai"] | None = None) -> OpenAIClient | None:
@@ -20,6 +22,15 @@ def get_llm_client(provider: Literal["openai"] | None = None) -> OpenAIClient |
2022
ValueError: If the specified provider is not supported.
2123
"""
2224
if provider == "openai":
23-
return OpenAIClient()
25+
openai_client = OpenAIClient()
26+
if openai_client.agent:
27+
posthog_client = get_posthog_client()
28+
if openai_client.mcp_client and getattr(openai_client.mcp_client, "config", None):
29+
servers = openai_client.mcp_client.config.get("mcpServers", {})
30+
server_names = list(servers.keys()) if servers else []
31+
else:
32+
server_names = []
33+
posthog_client.capture(MCPClientEvent(server_names=server_names))
34+
return openai_client
2435
else:
2536
raise ValueError("Invalid LLM provider specified in configuration.")

src/datu/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from datu.app_config import get_logger, settings
1414
from datu.routers import chat, metadata, transformations
1515
from datu.schema_extractor.schema_cache import load_schema_cache
16-
from datu.telemetry.product.events import OpenAIEvents
16+
from datu.telemetry.product.events import OpenAIEvent
1717
from datu.telemetry.product.posthog import get_posthog_client
1818

1919
logger = get_logger(__name__)
@@ -59,7 +59,7 @@ def start_app() -> None:
5959
"""
6060
logger.info("Starting the FastAPI application...")
6161
posthog_client = get_posthog_client()
62-
posthog_client.capture(OpenAIEvents())
62+
posthog_client.capture(OpenAIEvent())
6363
uvicorn.run(app, host=settings.host, port=settings.port)
6464

6565

src/datu/telemetry/product/events.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Any, ClassVar, Dict
22

3-
from datu.app_config import get_app_settings, get_logger
3+
from datu.app_config import get_app_settings
44

55
app_settings = get_app_settings()
66

@@ -34,15 +34,15 @@ def batch(self, other: "ProductTelemetryEvent") -> "ProductTelemetryEvent":
3434
return self
3535

3636

37-
class MCPClientStartEvent(ProductTelemetryEvent):
37+
class MCPClientEvent(ProductTelemetryEvent):
3838
"""Event for when the MCP client starts."""
3939

40-
def __init__(self, **kwargs):
41-
super().__init__(**kwargs)
42-
self._props["mcp_client_enabled"] = app_settings.mcp_client_enabled
40+
def __init__(self, server_names: list[str]):
41+
super().__init__()
42+
self._props["mcp_server_names"] = server_names
4343

4444

45-
class OpenAIEvents(ProductTelemetryEvent):
45+
class OpenAIEvent(ProductTelemetryEvent):
4646
"""Event for OpenAI-related telemetry."""
4747

4848
def __init__(self, **kwargs):

src/datu/telemetry/product/posthog.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import posthog
1111

12-
from datu.app_config import get_app_settings, get_logger
12+
from datu.app_config import Environment, get_app_settings, get_logger
1313
from datu.telemetry.config import TelemetryConfig as TelemetrySettings
1414
from datu.telemetry.product.events import ProductTelemetryEvent
1515

@@ -30,8 +30,13 @@ def __init__(self, settings: Optional[TelemetrySettings]) -> None:
3030
self._batched_events: Dict[str, ProductTelemetryEvent] = {}
3131
self._user_id: str = ""
3232
self._user_id_path: Path = self.USER_ID_PATH
33+
self.session_id = str(uuid.uuid4())
3334

34-
if not app_settings.enable_anonymized_telemetry or "pytest" in sys.modules:
35+
if (
36+
not app_settings.enable_anonymized_telemetry
37+
or "pytest" in sys.modules
38+
or app_settings.app_environment in [Environment.TEST.value]
39+
):
3540
posthog.disabled = True
3641
else:
3742
logger.info("Enabled anonymized telemetry. See https://docs.datu.fi for more information.")
@@ -63,11 +68,21 @@ def _base_context(self) -> Dict[str, Any]:
6368
except importlib.metadata.PackageNotFoundError:
6469
pkg_version = "unknown"
6570

71+
extras_installed: Dict[str, bool] = {}
72+
try:
73+
dist = importlib.metadata.distribution(self.settings.package_name)
74+
extras = dist.metadata.get_all("Provides-Extra") or []
75+
for extra in extras:
76+
extras_installed[extra] = True
77+
except importlib.metadata.PackageNotFoundError:
78+
extras_installed = {}
79+
6680
return {
6781
"python_version": sys.version.split()[0],
6882
"os": platform.system(),
6983
"os_version": platform.release(),
7084
"package_version": pkg_version,
85+
"extras_installed": extras_installed,
7186
}
7287

7388
def capture(self, event: ProductTelemetryEvent) -> None:

0 commit comments

Comments
 (0)