mirror of https://github.com/langgenius/dify.git
84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
"""Telemetry gateway contracts and data structures.
|
|
|
|
This module defines the envelope format for telemetry events and the routing
|
|
configuration that determines how each event type is processed.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from enum import StrEnum
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, field_validator
|
|
|
|
|
|
class TelemetryCase(StrEnum):
|
|
"""Enumeration of all known telemetry event cases."""
|
|
|
|
WORKFLOW_RUN = "workflow_run"
|
|
NODE_EXECUTION = "node_execution"
|
|
DRAFT_NODE_EXECUTION = "draft_node_execution"
|
|
MESSAGE_RUN = "message_run"
|
|
TOOL_EXECUTION = "tool_execution"
|
|
MODERATION_CHECK = "moderation_check"
|
|
SUGGESTED_QUESTION = "suggested_question"
|
|
DATASET_RETRIEVAL = "dataset_retrieval"
|
|
GENERATE_NAME = "generate_name"
|
|
PROMPT_GENERATION = "prompt_generation"
|
|
APP_CREATED = "app_created"
|
|
APP_UPDATED = "app_updated"
|
|
APP_DELETED = "app_deleted"
|
|
FEEDBACK_CREATED = "feedback_created"
|
|
|
|
|
|
class SignalType(StrEnum):
|
|
"""Signal routing type for telemetry cases."""
|
|
|
|
TRACE = "trace"
|
|
METRIC_LOG = "metric_log"
|
|
|
|
|
|
class CaseRoute(BaseModel):
|
|
"""Routing configuration for a telemetry case.
|
|
|
|
Attributes:
|
|
signal_type: The type of signal (trace or metric_log).
|
|
ce_eligible: Whether this case is eligible for community edition tracing.
|
|
"""
|
|
|
|
signal_type: SignalType
|
|
ce_eligible: bool
|
|
|
|
|
|
class TelemetryEnvelope(BaseModel):
|
|
"""Envelope for telemetry events.
|
|
|
|
Attributes:
|
|
case: The telemetry case type.
|
|
tenant_id: The tenant identifier.
|
|
event_id: Unique event identifier for deduplication.
|
|
payload: The main event payload.
|
|
payload_fallback: Fallback payload (max 64KB).
|
|
metadata: Optional metadata dictionary.
|
|
"""
|
|
|
|
case: TelemetryCase
|
|
tenant_id: str
|
|
event_id: str
|
|
payload: dict[str, Any]
|
|
payload_fallback: bytes | None = None
|
|
metadata: dict[str, Any] | None = None
|
|
|
|
@field_validator("payload_fallback")
|
|
@classmethod
|
|
def validate_payload_fallback_size(cls, v: bytes | None) -> bytes | None:
|
|
"""Validate that payload_fallback does not exceed 64KB."""
|
|
if v is not None and len(v) > 65536: # 64 * 1024
|
|
raise ValueError("payload_fallback must not exceed 64KB")
|
|
return v
|
|
|
|
class Config:
|
|
"""Pydantic configuration."""
|
|
|
|
use_enum_values = False
|