mirror of
https://github.com/langgenius/dify.git
synced 2026-05-04 01:18:05 +08:00
refactor(telemetry): introduce TelemetryFacade to centralize event emission
Migrate from direct TraceQueueManager.add_trace_task calls to TelemetryFacade.emit with TelemetryEvent abstraction. This reduces CE code invasion by consolidating telemetry logic in core/telemetry/ with a single guard in ops_trace_manager.py.
This commit is contained in:
4
api/core/telemetry/__init__.py
Normal file
4
api/core/telemetry/__init__.py
Normal file
@ -0,0 +1,4 @@
|
||||
from core.telemetry.events import TelemetryContext, TelemetryEvent
|
||||
from core.telemetry.facade import TelemetryFacade, emit, is_telemetry_enabled
|
||||
|
||||
__all__ = ["TelemetryContext", "TelemetryEvent", "TelemetryFacade", "emit", "is_telemetry_enabled"]
|
||||
18
api/core/telemetry/events.py
Normal file
18
api/core/telemetry/events.py
Normal file
@ -0,0 +1,18 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TelemetryContext:
|
||||
tenant_id: str | None = None
|
||||
user_id: str | None = None
|
||||
app_id: str | None = None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TelemetryEvent:
|
||||
name: str
|
||||
context: TelemetryContext
|
||||
payload: dict[str, Any]
|
||||
55
api/core/telemetry/facade.py
Normal file
55
api/core/telemetry/facade.py
Normal file
@ -0,0 +1,55 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from core.telemetry.events import TelemetryEvent
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from core.ops.ops_trace_manager import TraceQueueManager
|
||||
|
||||
|
||||
class TelemetryFacade:
|
||||
@staticmethod
|
||||
def emit(event: TelemetryEvent, trace_manager: TraceQueueManager | None = None) -> None:
|
||||
from core.ops.ops_trace_manager import TraceQueueManager, TraceTask, TraceTaskName
|
||||
|
||||
trace_task_name_map = {
|
||||
"draft_node_execution": TraceTaskName.DRAFT_NODE_EXECUTION_TRACE,
|
||||
"dataset_retrieval": TraceTaskName.DATASET_RETRIEVAL_TRACE,
|
||||
"generate_name": TraceTaskName.GENERATE_NAME_TRACE,
|
||||
"message": TraceTaskName.MESSAGE_TRACE,
|
||||
"moderation": TraceTaskName.MODERATION_TRACE,
|
||||
"node_execution": TraceTaskName.NODE_EXECUTION_TRACE,
|
||||
"prompt_generation": TraceTaskName.PROMPT_GENERATION_TRACE,
|
||||
"suggested_question": TraceTaskName.SUGGESTED_QUESTION_TRACE,
|
||||
"tool": TraceTaskName.TOOL_TRACE,
|
||||
"workflow": TraceTaskName.WORKFLOW_TRACE,
|
||||
}
|
||||
|
||||
trace_task_name = trace_task_name_map.get(event.name)
|
||||
if not trace_task_name:
|
||||
return
|
||||
|
||||
trace_queue_manager = trace_manager or TraceQueueManager(
|
||||
app_id=event.context.app_id,
|
||||
user_id=event.context.user_id,
|
||||
)
|
||||
trace_queue_manager.add_trace_task(
|
||||
TraceTask(
|
||||
trace_task_name,
|
||||
**event.payload,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def is_telemetry_enabled() -> bool:
|
||||
try:
|
||||
from enterprise.telemetry.exporter import is_enterprise_telemetry_enabled
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
return is_enterprise_telemetry_enabled()
|
||||
|
||||
|
||||
def emit(event: TelemetryEvent, trace_manager: TraceQueueManager | None = None) -> None:
|
||||
TelemetryFacade.emit(event, trace_manager=trace_manager)
|
||||
Reference in New Issue
Block a user