From 8dd401e66823d84a58f8eeae197beab821fd7665 Mon Sep 17 00:00:00 2001 From: Yingchun Lai Date: Sun, 16 Mar 2025 23:57:21 +0800 Subject: [PATCH 1/3] feat: poolize the ops trace instance --- api/core/ops/ops_trace_manager.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 9e4672ce52..b9e217d994 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 @@ -62,6 +63,8 @@ provider_config_map: dict[str, dict[str, Any]] = { }, } +ops_trace_instances_cache = LRUCache(maxsize=128) + class OpsTraceManager: @classmethod @@ -198,28 +201,31 @@ 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 = ops_trace_instances_cache.get(decrypt_trace_config_key) + if tracing_instance is None: + tracing_instance = trace_instance(config_class(**decrypt_trace_config)) + 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): From ebbddb9250dee063be3a850bb68f5c174a29eb75 Mon Sep 17 00:00:00 2001 From: Yingchun Lai Date: Mon, 17 Mar 2025 22:40:33 +0800 Subject: [PATCH 2/3] linter --- api/core/ops/ops_trace_manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index b9e217d994..94cf543cc5 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -63,10 +63,10 @@ provider_config_map: dict[str, dict[str, Any]] = { }, } -ops_trace_instances_cache = LRUCache(maxsize=128) - 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 @@ -220,10 +220,10 @@ class OpsTraceManager: provider_config_map[tracing_provider]["config_class"], ) decrypt_trace_config_key = str(decrypt_trace_config) - tracing_instance = ops_trace_instances_cache.get(decrypt_trace_config_key) + tracing_instance = cls.ops_trace_instances_cache.get(decrypt_trace_config_key) if tracing_instance is None: tracing_instance = trace_instance(config_class(**decrypt_trace_config)) - ops_trace_instances_cache[decrypt_trace_config_key] = tracing_instance + 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 From aed03e63890c985c23cebb7650521e5e8fe57764 Mon Sep 17 00:00:00 2001 From: Yingchun Lai Date: Tue, 18 Mar 2025 23:38:38 +0800 Subject: [PATCH 3/3] comments --- api/core/ops/ops_trace_manager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/core/ops/ops_trace_manager.py b/api/core/ops/ops_trace_manager.py index 94cf543cc5..2c401a616c 100644 --- a/api/core/ops/ops_trace_manager.py +++ b/api/core/ops/ops_trace_manager.py @@ -222,6 +222,7 @@ class OpsTraceManager: 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}")