88import logging
99import os
1010from datetime import datetime , timedelta
11- from typing import Any , Dict , List
11+ from typing import Any , Dict , List , Optional
1212
1313import boto3
1414from strands import tool
1515
16- from ..config import create_error_response , safe_int_conversion
16+ from ..config import create_error_response
1717from .dynamodb_tool import fetch_document_record
1818from .xray_tool import extract_lambda_request_ids
1919
2727
2828@tool
2929def search_cloudwatch_logs (
30- document_id : str = None ,
30+ document_id : str = "" ,
3131 filter_pattern : str = "ERROR" ,
32- hours_back : int = None ,
33- max_log_events : int = None ,
32+ hours_back : int = 24 ,
33+ max_log_events : int = 10 ,
3434 max_log_groups : int = 20 ,
3535) -> Dict [str , Any ]:
3636 """
@@ -57,9 +57,7 @@ def search_cloudwatch_logs(
5757 Dict containing error events, search metadata, and processing context
5858 """
5959 try :
60- max_log_events = safe_int_conversion (max_log_events , 10 )
61- max_log_groups = safe_int_conversion (max_log_groups , 20 )
62- hours_back = safe_int_conversion (hours_back , 24 )
60+ # Parameters already have proper defaults, no conversion needed
6361
6462 if document_id :
6563 # Document-specific search mode
@@ -82,14 +80,14 @@ def search_cloudwatch_logs(
8280# =============================================================================
8381
8482
85- def _get_stack_name (document_record : Dict [str , Any ] = None ) -> str :
83+ def _get_stack_name (document_record : Optional [ Dict [str , Any ] ] = None ) -> str :
8684 """
8785 Get stack name with priority: document ARN > environment variable.
8886 """
8987 # First priority: Extract from document execution ARN
9088 if document_record :
9189 try :
92- extracted_name = _extract_stack_name (document_record , None )
90+ extracted_name = _extract_stack_name (document_record )
9391 if extracted_name :
9492 return extracted_name
9593 except Exception as e :
@@ -115,7 +113,7 @@ def _search_document_logs(
115113 return context
116114
117115 # Get stack name from document context
118- actual_stack_name = _get_stack_name (context [ "document_record" ] )
116+ actual_stack_name = _get_stack_name (context . get ( "document_record" ) )
119117
120118 # Get log groups for the stack
121119 log_groups = _get_log_groups_from_stack_prefix (actual_stack_name )
@@ -180,7 +178,7 @@ def _search_stack_logs(
180178 "events_found" : 0 ,
181179 }
182180
183- log_prefix = prefix_info .get ("log_group_prefix" )
181+ log_prefix = prefix_info .get ("log_group_prefix" , "" )
184182
185183 # Get log groups with the prefix
186184 log_groups = _get_cloudwatch_log_groups (prefix = log_prefix )
@@ -266,9 +264,7 @@ def _get_document_context(document_id: str) -> Dict[str, Any]:
266264 }
267265
268266
269- def _extract_stack_name (
270- document_record : Dict [str , Any ], fallback_stack_name : str
271- ) -> str :
267+ def _extract_stack_name (document_record : Dict [str , Any ]) -> str :
272268 """
273269 Extract actual stack name from Step Functions execution ARN.
274270 """
@@ -283,7 +279,7 @@ def _extract_stack_name(
283279 if state_machine_name :
284280 return state_machine_name
285281
286- return fallback_stack_name
282+ return ""
287283
288284
289285def _get_processing_time_window (document_record : Dict [str , Any ]) -> Dict [str , Any ]:
@@ -383,8 +379,8 @@ def _search_by_request_ids(
383379 log_group_name = log_group ["name" ],
384380 filter_pattern = "ERROR" ,
385381 max_events = max_log_events * 3 ,
386- start_time = time_window [ "start_time" ] ,
387- end_time = time_window [ "end_time" ] ,
382+ start_time = time_window . get ( "start_time" ) ,
383+ end_time = time_window . get ( "end_time" ) ,
388384 request_id = request_id ,
389385 )
390386
@@ -440,8 +436,8 @@ def _search_by_document_fallback(
440436 log_group_name = log_group ["name" ],
441437 filter_pattern = doc_identifier ,
442438 max_events = max_log_events ,
443- start_time = time_window [ "start_time" ] ,
444- end_time = time_window [ "end_time" ] ,
439+ start_time = time_window . get ( "start_time" ) ,
440+ end_time = time_window . get ( "end_time" ) ,
445441 )
446442
447443 if search_result .get ("events_found" , 0 ) > 0 :
@@ -533,7 +529,7 @@ def _search_cloudwatch_logs(
533529 max_events : int = 10 ,
534530 start_time : datetime = None ,
535531 end_time : datetime = None ,
536- request_id : str = None ,
532+ request_id : str = "" ,
537533) -> Dict [str , Any ]:
538534 """
539535 Search CloudWatch logs within a specific log group for matching patterns.
@@ -542,7 +538,7 @@ def _search_cloudwatch_logs(
542538 client = boto3 .client ("logs" )
543539
544540 # Use provided time window or default to hours_back from now
545- if start_time and end_time :
541+ if start_time is not None and end_time is not None :
546542 search_start = start_time
547543 search_end = end_time
548544 else :
@@ -623,7 +619,7 @@ def _search_cloudwatch_logs(
623619 return create_error_response (str (e ), events_found = 0 , events = [])
624620
625621
626- def _build_filter_pattern (base_pattern : str , request_id : str = None ) -> str :
622+ def _build_filter_pattern (base_pattern : str , request_id : str = "" ) -> str :
627623 """
628624 Build CloudWatch filter pattern. Use ERROR pattern and filter by request ID in post-processing.
629625 """
0 commit comments