From 3f75a420cda4932898c0dc3b0b3d3bf94fbd2755 Mon Sep 17 00:00:00 2001 From: GareArc Date: Wed, 4 Feb 2026 01:49:08 -0800 Subject: [PATCH 1/2] fix(telemetry): remove app_id parameter from standalone prompt generation endpoints Remove app_id=None from three prompt generation endpoints that lack proper app context. These standalone utilities only have tenant_id available, so we don't pass app_id at all rather than passing incomplete information. Affected endpoints: - /rule-generate (RuleGenerateApi) - /code-generate (RuleCodeGenerateApi) - /structured-output-generate (RuleStructuredOutputGenerateApi) --- api/controllers/console/app/generator.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/controllers/console/app/generator.py b/api/controllers/console/app/generator.py index 917d4f0753..f81bcf7c0b 100644 --- a/api/controllers/console/app/generator.py +++ b/api/controllers/console/app/generator.py @@ -88,7 +88,6 @@ class RuleGenerateApi(Resource): model_config=args.model_config_data, no_variable=args.no_variable, user_id=account.id, - app_id=None, ) except ProviderTokenNotInitError as ex: raise ProviderNotInitializeError(ex.description) @@ -124,7 +123,6 @@ class RuleCodeGenerateApi(Resource): model_config=args.model_config_data, code_language=args.code_language, user_id=account.id, - app_id=None, ) except ProviderTokenNotInitError as ex: raise ProviderNotInitializeError(ex.description) @@ -159,7 +157,6 @@ class RuleStructuredOutputGenerateApi(Resource): instruction=args.instruction, model_config=args.model_config_data, user_id=account.id, - app_id=None, ) except ProviderTokenNotInitError as ex: raise ProviderNotInitializeError(ex.description) From 8baffdb114cdd7e74004dcfe5f11c7488fda82a1 Mon Sep 17 00:00:00 2001 From: GareArc Date: Wed, 4 Feb 2026 01:52:13 -0800 Subject: [PATCH 2/2] fix(telemetry): enable metrics and logs for standalone prompt generation Remove app_id parameter from three endpoints and update trace manager to use tenant_id as storage identifier when app_id is unavailable. This allows standalone prompt generation utilities to emit telemetry. Changes: - controllers/console/app/generator.py: Remove app_id=None from 3 endpoints (RuleGenerateApi, RuleCodeGenerateApi, RuleStructuredOutputGenerateApi) - core/ops/ops_trace_manager.py: Use tenant_id fallback in send_to_celery - Extract tenant_id from task.kwargs when app_id is None - Use 'tenant-{tenant_id}' format as storage identifier - Skip traces only if neither app_id nor tenant_id available The trace metadata still contains the actual tenant_id, so enterprise telemetry correctly emits metrics and logs grouped by tenant. --- api/core/ops/ops_trace_manager.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 2927fee1d2..2f5340645c 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -1295,20 +1295,27 @@ class TraceQueueManager: def send_to_celery(self, tasks: list[TraceTask]): with self.flask_app.app_context(): for task in tasks: - if task.app_id is None: - continue + storage_id = task.app_id + if storage_id is None: + tenant_id = task.kwargs.get("tenant_id") + if tenant_id: + storage_id = f"tenant-{tenant_id}" + else: + logger.warning("Skipping trace without app_id or tenant_id, trace_type: %s", task.trace_type) + continue + file_id = uuid4().hex trace_info = task.execute() task_data = TaskData( - app_id=task.app_id, + app_id=storage_id, trace_info_type=type(trace_info).__name__, trace_info=trace_info.model_dump() if trace_info else None, ) - file_path = f"{OPS_FILE_PATH}{task.app_id}/{file_id}.json" + file_path = f"{OPS_FILE_PATH}{storage_id}/{file_id}.json" storage.save(file_path, task_data.model_dump_json().encode("utf-8")) file_info = { "file_id": file_id, - "app_id": task.app_id, + "app_id": storage_id, } process_trace_tasks.delay(file_info) # type: ignore