From c884a40537731919f3d5c293e1ab58631b8d2b9c Mon Sep 17 00:00:00 2001 From: melionel Date: Fri, 6 Feb 2026 11:39:27 -0800 Subject: [PATCH] minor improve logging --- .../agentframework/_workflow_agent_adapter.py | 2 +- .../azure/ai/agentserver/core/logger.py | 34 +++++++++++-------- .../azure/ai/agentserver/core/server/base.py | 11 ++++-- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/sdk/agentserver/azure-ai-agentserver-agentframework/azure/ai/agentserver/agentframework/_workflow_agent_adapter.py b/sdk/agentserver/azure-ai-agentserver-agentframework/azure/ai/agentserver/agentframework/_workflow_agent_adapter.py index d5cf61ad62ae..2f46b0294c78 100644 --- a/sdk/agentserver/azure-ai-agentserver-agentframework/azure/ai/agentserver/agentframework/_workflow_agent_adapter.py +++ b/sdk/agentserver/azure-ai-agentserver-agentframework/azure/ai/agentserver/agentframework/_workflow_agent_adapter.py @@ -56,7 +56,7 @@ def __init__( # Handle managed checkpoints if managed_checkpoints: - resolved_endpoint = get_project_endpoint() or project_endpoint + resolved_endpoint = get_project_endpoint(logger=logger) or project_endpoint if not resolved_endpoint: raise ValueError( "project_endpoint is required when managed_checkpoints=True. " diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/logger.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/logger.py index e15ccd86f9cc..b9b0153f281a 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/logger.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/logger.py @@ -42,9 +42,11 @@ def get_dimensions(): return res -def get_project_endpoint(): +def get_project_endpoint(logger=None): project_endpoint = os.environ.get(Constants.AZURE_AI_PROJECT_ENDPOINT) if project_endpoint: + if logger: + logger.info(f"Using project endpoint from {Constants.AZURE_AI_PROJECT_ENDPOINT}: {project_endpoint}") return project_endpoint project_resource_id = os.environ.get(Constants.AGENT_PROJECT_RESOURCE_ID) if project_resource_id: @@ -52,35 +54,39 @@ def get_project_endpoint(): parts = last_part.split("@") if len(parts) < 2: - print(f"invalid project resource id: {project_resource_id}") + if logger: + logger.warning(f"Invalid project resource id format: {project_resource_id}") return None account = parts[0] project = parts[1] - return f"https://{account}.services.ai.azure.com/api/projects/{project}" - print("environment variable AGENT_PROJECT_RESOURCE_ID not set.") + endpoint = f"https://{account}.services.ai.azure.com/api/projects/{project}" + if logger: + logger.info(f"Using project endpoint derived from {Constants.AGENT_PROJECT_RESOURCE_ID}: {endpoint}") + return endpoint return None -def get_application_insights_connstr(): +def get_application_insights_connstr(logger=None): try: conn_str = os.environ.get(APPINSIGHT_CONNSTR_ENV_NAME) if not conn_str: - print(f"environment variable {APPINSIGHT_CONNSTR_ENV_NAME} not set.") - project_endpoint = get_project_endpoint() + project_endpoint = get_project_endpoint(logger=logger) if project_endpoint: # try to get the project connected application insights from azure.ai.projects import AIProjectClient from azure.identity import DefaultAzureCredential - project_client = AIProjectClient(credential=DefaultAzureCredential(), endpoint=project_endpoint) conn_str = project_client.telemetry.get_application_insights_connection_string() - if not conn_str: - print(f"no connected application insights found for project:{project_endpoint}") - else: + if not conn_str and logger: + logger.info(f"No Application Insights connection found for project: {project_endpoint}") + elif conn_str: os.environ[APPINSIGHT_CONNSTR_ENV_NAME] = conn_str + elif logger: + logger.info("Application Insights not configured, telemetry export disabled.") return conn_str except Exception as e: - print(f"failed to get application insights with error: {e}") + if logger: + logger.warning(f"Failed to get Application Insights connection string, telemetry export disabled: {e}") return None @@ -107,8 +113,9 @@ def configure(log_config: dict = default_log_config): """ try: config.dictConfig(log_config) + app_logger = logging.getLogger("azure.ai.agentserver") - application_insights_connection_string = get_application_insights_connstr() + application_insights_connection_string = get_application_insights_connstr(logger=app_logger) enable_application_insights_logger = ( os.environ.get(Constants.ENABLE_APPLICATION_INSIGHTS_LOGGER, "true").lower() == "true" ) @@ -137,7 +144,6 @@ def configure(log_config: dict = default_log_config): handler.addFilter(custom_filter) # Only add to azure.ai.agentserver namespace to avoid infrastructure logs - app_logger = logging.getLogger("azure.ai.agentserver") app_logger.setLevel(get_log_level()) app_logger.addHandler(handler) diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/server/base.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/server/base.py index 4f0032b64bd3..74688d7772f1 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/server/base.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/server/base.py @@ -99,7 +99,7 @@ def __init__(self, credentials: Optional[Union[AsyncTokenCredential, TokenCredential]] = None, project_endpoint: Optional[str] = None) -> None: self.credentials = AsyncTokenCredentialAdapter(credentials) if credentials else AsyncDefaultTokenCredential() - project_endpoint = get_project_endpoint() or project_endpoint + project_endpoint = get_project_endpoint(logger=logger) or project_endpoint AgentServerContext(create_tool_runtime(project_endpoint, self.credentials)) async def runs_endpoint(request): @@ -198,9 +198,14 @@ async def readiness_endpoint(request): self.app.add_middleware(AgentRunContextMiddleware, agent=self) @self.app.on_event("startup") - async def attach_appinsights_logger(): + async def on_startup(): import logging + # Log server started successfully + port = getattr(self, '_port', 'unknown') + logger.info(f"FoundryCBAgent server started successfully on port {port}") + + # Attach App Insights handler to uvicorn loggers for handler in logger.handlers: if handler.name == "appinsights_handler": for logger_name in ["uvicorn", "uvicorn.error", "uvicorn.access"]: @@ -348,6 +353,7 @@ async def run_async( self.init_tracing() config = uvicorn.Config(self.app, host="0.0.0.0", port=port, loop="asyncio") server = uvicorn.Server(config) + self._port = port logger.info(f"Starting FoundryCBAgent server async on port {port}") await server.serve() @@ -363,6 +369,7 @@ def run(self, port: int = int(os.environ.get("DEFAULT_AD_PORT", 8088))) -> None: :type port: int """ self.init_tracing() + self._port = port logger.info(f"Starting FoundryCBAgent server on port {port}") uvicorn.run(self.app, host="0.0.0.0", port=port)