From 46d235bca06d6b7b32f40072b728012eca3dc5dd Mon Sep 17 00:00:00 2001 From: Yingchun Lai Date: Sun, 30 Mar 2025 13:20:23 +0800 Subject: [PATCH] feat: poolize the ops trace instance (#15947) --- api/core/ops/ops_trace_manager.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 916509cd99..f388225cc4 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -8,6 +8,7 @@ from datetime import timedelta from typing import Any, Optional, Union from uuid import UUID, uuid4 +from cachetools import LRUCache from flask import current_app from sqlalchemy import select from sqlalchemy.orm import Session @@ -70,6 +71,8 @@ provider_config_map: dict[str, dict[str, Any]] = { class OpsTraceManager: + ops_trace_instances_cache: LRUCache = LRUCache(maxsize=128) + @classmethod def encrypt_tracing_config( cls, tenant_id: str, tracing_provider: str, tracing_config: dict, current_trace_config=None @@ -204,28 +207,32 @@ class OpsTraceManager: return None app_ops_trace_config = json.loads(app.tracing) if app.tracing else None - if app_ops_trace_config is None: return None + if not app_ops_trace_config.get("enabled"): + return None tracing_provider = app_ops_trace_config.get("tracing_provider") - if tracing_provider is None or tracing_provider not in provider_config_map: return None # decrypt_token decrypt_trace_config = cls.get_decrypted_tracing_config(app_id, tracing_provider) - if app_ops_trace_config.get("enabled"): - trace_instance, config_class = ( - provider_config_map[tracing_provider]["trace_instance"], - provider_config_map[tracing_provider]["config_class"], - ) - if not decrypt_trace_config: - return None - tracing_instance = trace_instance(config_class(**decrypt_trace_config)) - return tracing_instance + if not decrypt_trace_config: + return None - return None + trace_instance, config_class = ( + provider_config_map[tracing_provider]["trace_instance"], + provider_config_map[tracing_provider]["config_class"], + ) + decrypt_trace_config_key = str(decrypt_trace_config) + tracing_instance = cls.ops_trace_instances_cache.get(decrypt_trace_config_key) + if tracing_instance is None: + # create new tracing_instance and update the cache if it absent + tracing_instance = trace_instance(config_class(**decrypt_trace_config)) + cls.ops_trace_instances_cache[decrypt_trace_config_key] = tracing_instance + logging.info(f"new tracing_instance for app_id: {app_id}") + return tracing_instance @classmethod def get_app_config_through_message_id(cls, message_id: str):