mirror of
https://github.com/langgenius/dify.git
synced 2026-04-29 04:26:30 +08:00
fix(telemetry): add resolved_trace_id property to eliminate trace_id inconsistencies
Add computed property to BaseTraceInfo that provides intelligent fallback: 1. External trace_id (from X-Trace-Id header) 2. workflow_run_id (for workflow-related traces) 3. message_id (as final fallback) This ensures attribute dify.trace_id always matches log-level trace_id, eliminating inconsistencies where attribute was null but log-level had value. Changes: - Add resolved_trace_id property to BaseTraceInfo (trace_entity.py) - Replace 4 direct trace_id attribute assignments with resolved_trace_id - Add trace_id_source parameter to 5 emit_metric_only_event calls Fixes trace_id inconsistency found in MESSAGE_RUN, TOOL_EXECUTION, MODERATION_CHECK, SUGGESTED_QUESTION_GENERATION, GENERATE_NAME_EXECUTION, DATASET_RETRIEVAL, and PROMPT_GENERATION_EXECUTION events. All 78 telemetry tests passing.
This commit is contained in:
parent
abcf14a571
commit
ff877ee39c
@ -27,6 +27,26 @@ class BaseTraceInfo(BaseModel):
|
|||||||
|
|
||||||
model_config = ConfigDict(protected_namespaces=())
|
model_config = ConfigDict(protected_namespaces=())
|
||||||
|
|
||||||
|
@property
|
||||||
|
def resolved_trace_id(self) -> str | None:
|
||||||
|
"""Get trace_id with intelligent fallback.
|
||||||
|
|
||||||
|
Priority:
|
||||||
|
1. External trace_id (from X-Trace-Id header)
|
||||||
|
2. workflow_run_id (if this trace type has it)
|
||||||
|
3. message_id (as final fallback)
|
||||||
|
"""
|
||||||
|
if self.trace_id:
|
||||||
|
return self.trace_id
|
||||||
|
|
||||||
|
# Try workflow_run_id (only exists on workflow-related traces)
|
||||||
|
workflow_run_id = getattr(self, "workflow_run_id", None)
|
||||||
|
if workflow_run_id:
|
||||||
|
return workflow_run_id
|
||||||
|
|
||||||
|
# Final fallback to message_id
|
||||||
|
return str(self.message_id) if self.message_id else None
|
||||||
|
|
||||||
@field_serializer("start_time", "end_time")
|
@field_serializer("start_time", "end_time")
|
||||||
def serialize_datetime(self, dt: datetime | None) -> str | None:
|
def serialize_datetime(self, dt: datetime | None) -> str | None:
|
||||||
if dt is None:
|
if dt is None:
|
||||||
|
|||||||
@ -102,7 +102,7 @@ class EnterpriseOtelTrace:
|
|||||||
metadata = self._metadata(trace_info)
|
metadata = self._metadata(trace_info)
|
||||||
tenant_id, app_id, user_id = self._context_ids(trace_info, metadata)
|
tenant_id, app_id, user_id = self._context_ids(trace_info, metadata)
|
||||||
return {
|
return {
|
||||||
"dify.trace_id": trace_info.trace_id,
|
"dify.trace_id": trace_info.resolved_trace_id,
|
||||||
"dify.tenant_id": tenant_id,
|
"dify.tenant_id": tenant_id,
|
||||||
"dify.app_id": app_id,
|
"dify.app_id": app_id,
|
||||||
"dify.app.name": metadata.get("app_name"),
|
"dify.app.name": metadata.get("app_name"),
|
||||||
@ -163,7 +163,7 @@ class EnterpriseOtelTrace:
|
|||||||
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
||||||
# -- Slim span attrs: identity + structure + status + timing only --
|
# -- Slim span attrs: identity + structure + status + timing only --
|
||||||
span_attrs: dict[str, Any] = {
|
span_attrs: dict[str, Any] = {
|
||||||
"dify.trace_id": info.trace_id,
|
"dify.trace_id": info.resolved_trace_id,
|
||||||
"dify.tenant_id": tenant_id,
|
"dify.tenant_id": tenant_id,
|
||||||
"dify.app_id": app_id,
|
"dify.app_id": app_id,
|
||||||
"dify.workflow.id": info.workflow_id,
|
"dify.workflow.id": info.workflow_id,
|
||||||
@ -307,7 +307,7 @@ class EnterpriseOtelTrace:
|
|||||||
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
||||||
# -- Slim span attrs: identity + structure + status + timing --
|
# -- Slim span attrs: identity + structure + status + timing --
|
||||||
span_attrs: dict[str, Any] = {
|
span_attrs: dict[str, Any] = {
|
||||||
"dify.trace_id": info.trace_id,
|
"dify.trace_id": info.resolved_trace_id,
|
||||||
"dify.tenant_id": tenant_id,
|
"dify.tenant_id": tenant_id,
|
||||||
"dify.app_id": app_id,
|
"dify.app_id": app_id,
|
||||||
"dify.workflow.id": info.workflow_id,
|
"dify.workflow.id": info.workflow_id,
|
||||||
@ -563,6 +563,7 @@ class EnterpriseOtelTrace:
|
|||||||
emit_metric_only_event(
|
emit_metric_only_event(
|
||||||
event_name=EnterpriseTelemetryEvent.TOOL_EXECUTION,
|
event_name=EnterpriseTelemetryEvent.TOOL_EXECUTION,
|
||||||
attributes=attrs,
|
attributes=attrs,
|
||||||
|
trace_id_source=info.resolved_trace_id,
|
||||||
span_id_source=node_execution_id,
|
span_id_source=node_execution_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@ -617,6 +618,7 @@ class EnterpriseOtelTrace:
|
|||||||
emit_metric_only_event(
|
emit_metric_only_event(
|
||||||
event_name=EnterpriseTelemetryEvent.MODERATION_CHECK,
|
event_name=EnterpriseTelemetryEvent.MODERATION_CHECK,
|
||||||
attributes=attrs,
|
attributes=attrs,
|
||||||
|
trace_id_source=info.resolved_trace_id,
|
||||||
span_id_source=node_execution_id,
|
span_id_source=node_execution_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@ -662,6 +664,7 @@ class EnterpriseOtelTrace:
|
|||||||
emit_metric_only_event(
|
emit_metric_only_event(
|
||||||
event_name=EnterpriseTelemetryEvent.SUGGESTED_QUESTION_GENERATION,
|
event_name=EnterpriseTelemetryEvent.SUGGESTED_QUESTION_GENERATION,
|
||||||
attributes=attrs,
|
attributes=attrs,
|
||||||
|
trace_id_source=info.resolved_trace_id,
|
||||||
span_id_source=node_execution_id,
|
span_id_source=node_execution_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@ -818,6 +821,7 @@ class EnterpriseOtelTrace:
|
|||||||
emit_metric_only_event(
|
emit_metric_only_event(
|
||||||
event_name=EnterpriseTelemetryEvent.GENERATE_NAME_EXECUTION,
|
event_name=EnterpriseTelemetryEvent.GENERATE_NAME_EXECUTION,
|
||||||
attributes=attrs,
|
attributes=attrs,
|
||||||
|
trace_id_source=info.resolved_trace_id,
|
||||||
span_id_source=node_execution_id,
|
span_id_source=node_execution_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@ -840,7 +844,7 @@ class EnterpriseOtelTrace:
|
|||||||
metadata = self._metadata(info)
|
metadata = self._metadata(info)
|
||||||
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
tenant_id, app_id, user_id = self._context_ids(info, metadata)
|
||||||
attrs = {
|
attrs = {
|
||||||
"dify.trace_id": info.trace_id,
|
"dify.trace_id": info.resolved_trace_id,
|
||||||
"dify.tenant_id": tenant_id,
|
"dify.tenant_id": tenant_id,
|
||||||
"dify.user.id": user_id,
|
"dify.user.id": user_id,
|
||||||
"dify.app.id": app_id or "",
|
"dify.app.id": app_id or "",
|
||||||
@ -871,6 +875,7 @@ class EnterpriseOtelTrace:
|
|||||||
emit_metric_only_event(
|
emit_metric_only_event(
|
||||||
event_name=EnterpriseTelemetryEvent.PROMPT_GENERATION_EXECUTION,
|
event_name=EnterpriseTelemetryEvent.PROMPT_GENERATION_EXECUTION,
|
||||||
attributes=attrs,
|
attributes=attrs,
|
||||||
|
trace_id_source=info.resolved_trace_id,
|
||||||
span_id_source=node_execution_id,
|
span_id_source=node_execution_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user