runbooks 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/assessment/compliance.py +1 -1
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cli/__init__.py +1 -1
- runbooks/cli/commands/cfat.py +64 -23
- runbooks/cli/commands/finops.py +1005 -54
- runbooks/cli/commands/inventory.py +135 -91
- runbooks/cli/commands/operate.py +9 -36
- runbooks/cli/commands/security.py +42 -18
- runbooks/cli/commands/validation.py +432 -18
- runbooks/cli/commands/vpc.py +81 -17
- runbooks/cli/registry.py +22 -10
- runbooks/cloudops/__init__.py +20 -27
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +544 -542
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +224 -225
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +177 -213
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +17 -12
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +40 -36
- runbooks/common/aws_utils.py +74 -79
- runbooks/common/business_logic.py +126 -104
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
- runbooks/common/cross_account_manager.py +197 -204
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +29 -19
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +476 -493
- runbooks/common/mcp_integration.py +99 -79
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +175 -193
- runbooks/common/patterns.py +23 -25
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +111 -37
- runbooks/common/rich_utils.py +315 -141
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +26 -30
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +484 -618
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +32 -29
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +223 -285
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +337 -174
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1512 -481
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +19 -23
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +64 -65
- runbooks/finops/scenarios.py +1277 -438
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +259 -265
- runbooks/finops/vpc_cleanup_exporter.py +189 -144
- runbooks/finops/vpc_cleanup_optimizer.py +591 -573
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/aws_decorators.py +2 -3
- runbooks/inventory/check_cloudtrail_compliance.py +2 -4
- runbooks/inventory/check_controltower_readiness.py +152 -151
- runbooks/inventory/check_landingzone_readiness.py +85 -84
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +1 -1
- runbooks/inventory/collectors/aws_networking.py +109 -99
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/core/formatter.py +11 -0
- runbooks/inventory/draw_org_structure.py +8 -9
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/ec2_vpc_utils.py +2 -2
- runbooks/inventory/find_cfn_drift_detection.py +5 -7
- runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
- runbooks/inventory/find_cfn_stackset_drift.py +5 -6
- runbooks/inventory/find_ec2_security_groups.py +48 -42
- runbooks/inventory/find_landingzone_versions.py +4 -6
- runbooks/inventory/find_vpc_flow_logs.py +7 -9
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/inventory_modules.py +103 -91
- runbooks/inventory/list_cfn_stacks.py +9 -10
- runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
- runbooks/inventory/list_cfn_stackset_operations.py +79 -57
- runbooks/inventory/list_cfn_stacksets.py +8 -10
- runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
- runbooks/inventory/list_ds_directories.py +65 -53
- runbooks/inventory/list_ec2_availability_zones.py +2 -4
- runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
- runbooks/inventory/list_ec2_instances.py +23 -28
- runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
- runbooks/inventory/list_elbs_load_balancers.py +22 -20
- runbooks/inventory/list_enis_network_interfaces.py +26 -33
- runbooks/inventory/list_guardduty_detectors.py +2 -4
- runbooks/inventory/list_iam_policies.py +2 -4
- runbooks/inventory/list_iam_roles.py +5 -7
- runbooks/inventory/list_iam_saml_providers.py +4 -6
- runbooks/inventory/list_lambda_functions.py +38 -38
- runbooks/inventory/list_org_accounts.py +6 -8
- runbooks/inventory/list_org_accounts_users.py +55 -44
- runbooks/inventory/list_rds_db_instances.py +31 -33
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/list_route53_hosted_zones.py +3 -5
- runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
- runbooks/inventory/list_sns_topics.py +2 -4
- runbooks/inventory/list_ssm_parameters.py +4 -7
- runbooks/inventory/list_vpc_subnets.py +2 -4
- runbooks/inventory/list_vpcs.py +7 -10
- runbooks/inventory/mcp_inventory_validator.py +554 -468
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +63 -55
- runbooks/inventory/recover_cfn_stack_ids.py +7 -8
- runbooks/inventory/requirements.txt +0 -1
- runbooks/inventory/rich_inventory_display.py +35 -34
- runbooks/inventory/run_on_multi_accounts.py +3 -5
- runbooks/inventory/unified_validation_engine.py +281 -253
- runbooks/inventory/verify_ec2_security_groups.py +1 -1
- runbooks/inventory/vpc_analyzer.py +735 -697
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +384 -380
- runbooks/inventory/vpc_flow_analyzer.py +1 -1
- runbooks/main.py +49 -34
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/networking_cost_heatmap.py +29 -8
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_operations.py +646 -616
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +70 -66
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +86 -60
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +46 -41
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +50 -47
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +745 -704
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +461 -454
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +185 -160
- runbooks/vpc/mcp_no_eni_validator.py +680 -639
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1297 -1124
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.6.dist-info/METADATA +327 -0
- runbooks-1.1.6.dist-info/RECORD +489 -0
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -973
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.4.dist-info/METADATA +0 -800
- runbooks-1.1.4.dist-info/RECORD +0 -468
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -16,16 +16,17 @@ from botocore.exceptions import ClientError, BotoCoreError
|
|
16
16
|
from runbooks.enterprise.logging import get_module_logger, EnterpriseRichLogger
|
17
17
|
|
18
18
|
|
19
|
-
def create_enhanced_module_logger(
|
20
|
-
|
19
|
+
def create_enhanced_module_logger(
|
20
|
+
module_name: str, log_level: Optional[str] = None, json_output: bool = False
|
21
|
+
) -> EnterpriseRichLogger:
|
21
22
|
"""
|
22
23
|
Create an enhanced logger for a module with automatic level detection.
|
23
|
-
|
24
|
+
|
24
25
|
Args:
|
25
|
-
module_name: Name of the module (e.g., 'finops', 'inventory')
|
26
|
+
module_name: Name of the module (e.g., 'finops', 'inventory')
|
26
27
|
log_level: Override log level, or None to use CLI/environment setting
|
27
28
|
json_output: Enable JSON output for programmatic use
|
28
|
-
|
29
|
+
|
29
30
|
Returns:
|
30
31
|
Configured enhanced logger
|
31
32
|
"""
|
@@ -33,15 +34,15 @@ def create_enhanced_module_logger(module_name: str, log_level: Optional[str] = N
|
|
33
34
|
if log_level is None:
|
34
35
|
import os
|
35
36
|
import sys
|
36
|
-
|
37
|
+
|
37
38
|
# Check if we're in a CLI context
|
38
|
-
log_level = os.getenv(
|
39
|
-
|
39
|
+
log_level = os.getenv("RUNBOOKS_LOG_LEVEL", "INFO")
|
40
|
+
|
40
41
|
# Check command line arguments for log level
|
41
42
|
for arg in sys.argv:
|
42
|
-
if arg.startswith(
|
43
|
-
if
|
44
|
-
log_level = arg.split(
|
43
|
+
if arg.startswith("--log-level"):
|
44
|
+
if "=" in arg:
|
45
|
+
log_level = arg.split("=")[1].upper()
|
45
46
|
else:
|
46
47
|
# Next argument should be the level
|
47
48
|
try:
|
@@ -51,35 +52,36 @@ def create_enhanced_module_logger(module_name: str, log_level: Optional[str] = N
|
|
51
52
|
except (ValueError, IndexError):
|
52
53
|
pass
|
53
54
|
break
|
54
|
-
|
55
|
-
return get_module_logger(module_name, level=log_level or
|
55
|
+
|
56
|
+
return get_module_logger(module_name, level=log_level or "INFO", json_output=json_output)
|
56
57
|
|
57
58
|
|
58
59
|
def log_aws_operation(func: Callable) -> Callable:
|
59
60
|
"""
|
60
61
|
Decorator to automatically log AWS operations with enhanced context.
|
61
|
-
|
62
|
+
|
62
63
|
Usage:
|
63
64
|
@log_aws_operation
|
64
65
|
def describe_instances(session, region):
|
65
66
|
client = session.client('ec2', region_name=region)
|
66
67
|
return client.describe_instances()
|
67
68
|
"""
|
69
|
+
|
68
70
|
@wraps(func)
|
69
71
|
def wrapper(*args, **kwargs):
|
70
72
|
# Try to extract module name from function
|
71
|
-
module_name = func.__module__.split(
|
73
|
+
module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "unknown"
|
72
74
|
logger = create_enhanced_module_logger(module_name)
|
73
|
-
|
75
|
+
|
74
76
|
# Extract operation details from function name and arguments
|
75
77
|
operation_name = func.__name__
|
76
|
-
service_name =
|
77
|
-
|
78
|
+
service_name = "aws" # Default, could be improved by parsing function or args
|
79
|
+
|
78
80
|
start_time = time.time()
|
79
81
|
success = True
|
80
82
|
result = None
|
81
83
|
error_details = None
|
82
|
-
|
84
|
+
|
83
85
|
try:
|
84
86
|
result = func(*args, **kwargs)
|
85
87
|
return result
|
@@ -90,7 +92,7 @@ def log_aws_operation(func: Callable) -> Callable:
|
|
90
92
|
f"AWS operation failed: {operation_name}",
|
91
93
|
solution=f"Check AWS permissions and service availability",
|
92
94
|
aws_error=error_details,
|
93
|
-
suggested_command=f"aws {service_name} {operation_name.replace('_', '-')} --help"
|
95
|
+
suggested_command=f"aws {service_name} {operation_name.replace('_', '-')} --help",
|
94
96
|
)
|
95
97
|
raise
|
96
98
|
except Exception as e:
|
@@ -99,7 +101,7 @@ def log_aws_operation(func: Callable) -> Callable:
|
|
99
101
|
logger.error_all(
|
100
102
|
f"Operation failed: {operation_name}",
|
101
103
|
solution="Check the error details above and verify inputs",
|
102
|
-
aws_error=error_details
|
104
|
+
aws_error=error_details,
|
103
105
|
)
|
104
106
|
raise
|
105
107
|
finally:
|
@@ -108,142 +110,142 @@ def log_aws_operation(func: Callable) -> Callable:
|
|
108
110
|
resource_count = None
|
109
111
|
# Try to extract resource count from result
|
110
112
|
if isinstance(result, dict):
|
111
|
-
if
|
112
|
-
resource_count = sum(len(r.get(
|
113
|
-
elif
|
114
|
-
resource_count = len(result[
|
115
|
-
elif isinstance(result.get(
|
113
|
+
if "Reservations" in result:
|
114
|
+
resource_count = sum(len(r.get("Instances", [])) for r in result["Reservations"])
|
115
|
+
elif "Buckets" in result:
|
116
|
+
resource_count = len(result["Buckets"])
|
117
|
+
elif isinstance(result.get("ResponseMetadata"), dict):
|
116
118
|
# It's an AWS response, try to count items
|
117
119
|
for key, value in result.items():
|
118
|
-
if isinstance(value, list) and key !=
|
120
|
+
if isinstance(value, list) and key != "ResponseMetadata":
|
119
121
|
resource_count = len(value)
|
120
122
|
break
|
121
|
-
|
123
|
+
|
122
124
|
logger.log_aws_operation(
|
123
125
|
operation=operation_name,
|
124
126
|
service=service_name,
|
125
127
|
duration=duration,
|
126
128
|
success=True,
|
127
|
-
resource_count=resource_count
|
129
|
+
resource_count=resource_count,
|
128
130
|
)
|
129
|
-
|
131
|
+
|
130
132
|
return wrapper
|
131
133
|
|
132
134
|
|
133
135
|
def log_cost_operation(func: Callable) -> Callable:
|
134
136
|
"""
|
135
137
|
Decorator to automatically log cost-related operations.
|
136
|
-
|
138
|
+
|
137
139
|
Usage:
|
138
|
-
@log_cost_operation
|
140
|
+
@log_cost_operation
|
139
141
|
def analyze_monthly_costs(cost_data):
|
140
142
|
# ... cost analysis logic ...
|
141
143
|
return {"total_cost": 1500.0, "savings": 300.0}
|
142
144
|
"""
|
145
|
+
|
143
146
|
@wraps(func)
|
144
147
|
def wrapper(*args, **kwargs):
|
145
|
-
module_name = func.__module__.split(
|
148
|
+
module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "finops"
|
146
149
|
logger = create_enhanced_module_logger(module_name)
|
147
|
-
|
150
|
+
|
148
151
|
operation_name = func.__name__
|
149
152
|
start_time = time.time()
|
150
|
-
|
153
|
+
|
151
154
|
try:
|
152
155
|
result = func(*args, **kwargs)
|
153
156
|
duration = time.time() - start_time
|
154
|
-
|
157
|
+
|
155
158
|
# Extract cost information from result
|
156
159
|
cost_impact = None
|
157
160
|
savings_opportunity = None
|
158
|
-
|
161
|
+
|
159
162
|
if isinstance(result, dict):
|
160
|
-
cost_impact = result.get(
|
161
|
-
savings_opportunity = result.get(
|
162
|
-
|
163
|
+
cost_impact = result.get("total_cost") or result.get("cost_impact")
|
164
|
+
savings_opportunity = result.get("savings") or result.get("savings_opportunity")
|
165
|
+
|
163
166
|
logger.log_cost_analysis(
|
164
|
-
operation=operation_name,
|
165
|
-
cost_impact=cost_impact,
|
166
|
-
savings_opportunity=savings_opportunity
|
167
|
+
operation=operation_name, cost_impact=cost_impact, savings_opportunity=savings_opportunity
|
167
168
|
)
|
168
|
-
|
169
|
+
|
169
170
|
# Also log performance if it's slow
|
170
171
|
logger.log_performance_metric(operation_name, duration)
|
171
|
-
|
172
|
+
|
172
173
|
return result
|
173
|
-
|
174
|
+
|
174
175
|
except Exception as e:
|
175
176
|
logger.error_all(
|
176
177
|
f"Cost analysis failed: {operation_name}",
|
177
178
|
solution="Check input data format and AWS permissions",
|
178
|
-
aws_error=str(e)
|
179
|
+
aws_error=str(e),
|
179
180
|
)
|
180
181
|
raise
|
181
|
-
|
182
|
+
|
182
183
|
return wrapper
|
183
184
|
|
184
185
|
|
185
186
|
def log_security_operation(func: Callable) -> Callable:
|
186
187
|
"""
|
187
188
|
Decorator to automatically log security operations.
|
188
|
-
|
189
|
+
|
189
190
|
Usage:
|
190
191
|
@log_security_operation
|
191
192
|
def scan_s3_permissions(bucket_name):
|
192
193
|
# ... security scan logic ...
|
193
194
|
return {"findings": [...], "severity": "medium"}
|
194
195
|
"""
|
196
|
+
|
195
197
|
@wraps(func)
|
196
198
|
def wrapper(*args, **kwargs):
|
197
|
-
module_name = func.__module__.split(
|
199
|
+
module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "security"
|
198
200
|
logger = create_enhanced_module_logger(module_name)
|
199
|
-
|
201
|
+
|
200
202
|
operation_name = func.__name__
|
201
|
-
|
203
|
+
|
202
204
|
try:
|
203
205
|
result = func(*args, **kwargs)
|
204
|
-
|
206
|
+
|
205
207
|
# Extract security findings from result
|
206
|
-
if isinstance(result, dict) and
|
207
|
-
findings = result[
|
208
|
-
severity = result.get(
|
209
|
-
|
208
|
+
if isinstance(result, dict) and "findings" in result:
|
209
|
+
findings = result["findings"]
|
210
|
+
severity = result.get("severity", "medium")
|
211
|
+
|
210
212
|
if findings:
|
211
213
|
for finding in findings:
|
212
214
|
if isinstance(finding, dict):
|
213
215
|
logger.log_security_finding(
|
214
|
-
finding=finding.get(
|
215
|
-
severity=finding.get(
|
216
|
-
remediation_steps=finding.get(
|
216
|
+
finding=finding.get("description", str(finding)),
|
217
|
+
severity=finding.get("severity", severity),
|
218
|
+
remediation_steps=finding.get("remediation_steps"),
|
217
219
|
)
|
218
220
|
else:
|
219
221
|
logger.log_security_finding(str(finding), severity=severity)
|
220
222
|
else:
|
221
223
|
logger.info_standard(f"Security scan completed: {operation_name} (no findings)")
|
222
|
-
|
224
|
+
|
223
225
|
return result
|
224
|
-
|
226
|
+
|
225
227
|
except Exception as e:
|
226
228
|
logger.error_all(
|
227
229
|
f"Security operation failed: {operation_name}",
|
228
230
|
solution="Check security scan configuration and permissions",
|
229
|
-
aws_error=str(e)
|
231
|
+
aws_error=str(e),
|
230
232
|
)
|
231
233
|
raise
|
232
|
-
|
234
|
+
|
233
235
|
return wrapper
|
234
236
|
|
235
237
|
|
236
238
|
class LoggingMigrationHelper:
|
237
239
|
"""Helper class to assist with migrating existing modules to enhanced logging."""
|
238
|
-
|
240
|
+
|
239
241
|
def __init__(self, module_name: str):
|
240
242
|
self.module_name = module_name
|
241
243
|
self.logger = create_enhanced_module_logger(module_name)
|
242
|
-
|
244
|
+
|
243
245
|
def replace_print_statements(self, message: str, level: str = "info", **kwargs):
|
244
246
|
"""
|
245
247
|
Replace print statements with appropriate logging calls.
|
246
|
-
|
248
|
+
|
247
249
|
Args:
|
248
250
|
message: The message to log
|
249
251
|
level: Log level (debug, info, warning, error)
|
@@ -257,30 +259,21 @@ class LoggingMigrationHelper:
|
|
257
259
|
self.logger.error_all(message, **kwargs)
|
258
260
|
else:
|
259
261
|
self.logger.info_standard(message, **kwargs)
|
260
|
-
|
262
|
+
|
261
263
|
def log_operation_start(self, operation: str, **context):
|
262
264
|
"""Log the start of an operation."""
|
263
265
|
return self.logger.operation_context(operation, **context)
|
264
|
-
|
265
|
-
def log_aws_call(self, service: str, operation: str, duration: float = None,
|
266
|
-
success: bool = True, **kwargs):
|
266
|
+
|
267
|
+
def log_aws_call(self, service: str, operation: str, duration: float = None, success: bool = True, **kwargs):
|
267
268
|
"""Log an AWS API call."""
|
268
269
|
self.logger.log_aws_operation(
|
269
|
-
operation=operation,
|
270
|
-
service=service,
|
271
|
-
duration=duration,
|
272
|
-
success=success,
|
273
|
-
**kwargs
|
270
|
+
operation=operation, service=service, duration=duration, success=success, **kwargs
|
274
271
|
)
|
275
|
-
|
276
|
-
def log_cost_finding(self, operation: str, cost: float = None, savings: float = None,
|
277
|
-
recommendation: str = None):
|
272
|
+
|
273
|
+
def log_cost_finding(self, operation: str, cost: float = None, savings: float = None, recommendation: str = None):
|
278
274
|
"""Log a cost-related finding."""
|
279
275
|
self.logger.log_cost_analysis(
|
280
|
-
operation=operation,
|
281
|
-
cost_impact=cost,
|
282
|
-
savings_opportunity=savings,
|
283
|
-
recommendation=recommendation
|
276
|
+
operation=operation, cost_impact=cost, savings_opportunity=savings, recommendation=recommendation
|
284
277
|
)
|
285
278
|
|
286
279
|
|
@@ -298,7 +291,7 @@ def quick_log_error(module_name: str, message: str, solution: str = None, **kwar
|
|
298
291
|
|
299
292
|
|
300
293
|
def quick_log_warning(module_name: str, message: str, recommendation: str = None, **kwargs):
|
301
|
-
"""Quick logging for warning messages."""
|
294
|
+
"""Quick logging for warning messages."""
|
302
295
|
logger = create_enhanced_module_logger(module_name)
|
303
296
|
logger.warning_business(message, recommendation=recommendation, **kwargs)
|
304
297
|
|
@@ -328,7 +321,7 @@ def print_upgrade_checklist(module_name: str):
|
|
328
321
|
print()
|
329
322
|
print("4. Use context-aware logging methods:")
|
330
323
|
print(f" • logger.debug_tech() - for technical details")
|
331
|
-
print(f" • logger.info_standard() - for standard operations")
|
324
|
+
print(f" • logger.info_standard() - for standard operations")
|
332
325
|
print(f" • logger.warning_business() - for business insights")
|
333
326
|
print(f" • logger.error_all() - for errors with solutions")
|
334
327
|
print()
|
@@ -341,4 +334,4 @@ def print_upgrade_checklist(module_name: str):
|
|
341
334
|
print(f" with logger.operation_context('operation_name'):")
|
342
335
|
print(f" # ... operation code ...")
|
343
336
|
print()
|
344
|
-
print("✅ After upgrade, users can control output with --log-level DEBUG|INFO|WARNING|ERROR")
|
337
|
+
print("✅ After upgrade, users can control output with --log-level DEBUG|INFO|WARNING|ERROR")
|