feat: poolize the ops trace instance (#15947)

This commit is contained in:
Yingchun Lai 2025-03-30 13:20:23 +08:00 committed by GitHub
parent a91b780936
commit 46d235bca0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -8,6 +8,7 @@ from datetime import timedelta
from typing import Any, Optional, Union from typing import Any, Optional, Union
from uuid import UUID, uuid4 from uuid import UUID, uuid4
from cachetools import LRUCache
from flask import current_app from flask import current_app
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -70,6 +71,8 @@ provider_config_map: dict[str, dict[str, Any]] = {
class OpsTraceManager: class OpsTraceManager:
ops_trace_instances_cache: LRUCache = LRUCache(maxsize=128)
@classmethod @classmethod
def encrypt_tracing_config( def encrypt_tracing_config(
cls, tenant_id: str, tracing_provider: str, tracing_config: dict, current_trace_config=None cls, tenant_id: str, tracing_provider: str, tracing_config: dict, current_trace_config=None
@ -204,28 +207,32 @@ class OpsTraceManager:
return None return None
app_ops_trace_config = json.loads(app.tracing) if app.tracing else None app_ops_trace_config = json.loads(app.tracing) if app.tracing else None
if app_ops_trace_config is None: if app_ops_trace_config is None:
return None return None
if not app_ops_trace_config.get("enabled"):
return None
tracing_provider = app_ops_trace_config.get("tracing_provider") tracing_provider = app_ops_trace_config.get("tracing_provider")
if tracing_provider is None or tracing_provider not in provider_config_map: if tracing_provider is None or tracing_provider not in provider_config_map:
return None return None
# decrypt_token # decrypt_token
decrypt_trace_config = cls.get_decrypted_tracing_config(app_id, tracing_provider) decrypt_trace_config = cls.get_decrypted_tracing_config(app_id, tracing_provider)
if app_ops_trace_config.get("enabled"): if not decrypt_trace_config:
trace_instance, config_class = ( return None
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
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 @classmethod
def get_app_config_through_message_id(cls, message_id: str): def get_app_config_through_message_id(cls, message_id: str):