A Python decorator for comprehensive function monitoring with execution timing, memory usage tracking, CPU monitoring, input/output validation, and structured logging.
Project description
PyFuncMonitor
A Python decorator for comprehensive function monitoring with execution timing, memory usage tracking, CPU monitoring, input/output validation, and structured logging.
Features
- Execution Monitoring: Track function execution time, memory usage, and CPU utilization
- Input/Output Validation: Automatic validation using Pydantic models and type hints
- Structured Logging: Configurable structured logging with support for file output
- Error Handling: Comprehensive exception handling and error reporting
- Flexible Configuration: Global and per-function configuration options
- Production Ready: Designed for production use with proper error handling and performance considerations
Installation
pip install pyfuncmonitor
Quick Start
from pyfuncmonitor import monitor_function
@monitor_function()
def add_numbers(a: int, b: int) -> int:
return a + b
result = add_numbers(5, 3)
print(result)
This will output a dictionary containing the function result, execution metrics, and monitoring data:
{
'result': 8,
'status': 'success',
'errors': None,
'execution_time': 0.0001,
'memory_usage': {
'before': 15728640,
'after': 15728640,
'peak': 15728640,
'delta': 0
},
'cpu_usage': 0.0,
'timestamp': '2024-01-15T10:30:45.123456',
'function_name': 'add_numbers'
}
Configuration
Global Configuration
Configure the monitor globally for your application:
from pyfuncmonitor import configure_monitor
configure_monitor(
log_to_file=True,
log_file_path="./app_monitor.log",
log_level=20, # INFO level
default_return_raw_result=True
)
Environment Variables
You can also configure using environment variables:
export PYFUNCMONITOR_LOG_LEVEL=10 # DEBUG level
export PYFUNCMONITOR_LOG_TO_FILE=true
export PYFUNCMONITOR_LOG_FILE=./debug.log
Per-Function Configuration
Override global settings for specific functions:
@monitor_function(
validate_input=True,
validate_output=False,
log_level="DEBUG",
return_raw_result=True
)
def my_function(x: int) -> str:
return str(x * 2)
Advanced Usage
Input/Output Validation with Pydantic
from pydantic import BaseModel
from pyfuncmonitor import monitor_function
class User(BaseModel):
name: str
age: int
email: str
class UserResponse(BaseModel):
user: User
message: str
@monitor_function(validate_input=True, validate_output=True)
def create_user(user_data: User) -> UserResponse:
return UserResponse(
user=user_data,
message=f"User {user_data.name} created successfully"
)
# Usage
user = User(name="John Doe", age=30, email="john@example.com")
result = create_user(user)
Custom Monitor Instances
from pyfuncmonitor import FunctionMonitor
# Create custom monitor with specific settings
production_monitor = FunctionMonitor(
validate_input=True,
validate_output=True,
log_execution=True,
return_raw_result=True
)
debug_monitor = FunctionMonitor(
validate_input=True,
validate_output=False,
log_level="DEBUG",
return_raw_result=False
)
@production_monitor
def critical_function(data: dict) -> dict:
# Process critical data
return {"processed": True}
@debug_monitor
def experimental_function(x: int) -> int:
# Experimental code
return x ** 2
Error Handling
The monitor automatically captures and reports errors:
@monitor_function()
def divide_numbers(a: float, b: float) -> float:
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
result = divide_numbers(10, 0)
print(result["status"]) # "error"
print(result["errors"]) # List of error messages
Memory and CPU Monitoring
Monitor resource usage:
@monitor_function(
enable_memory_monitoring=True,
enable_cpu_monitoring=True
)
def memory_intensive_function(size: int) -> list:
# Create a large list
return list(range(size))
result = memory_intensive_function(1000000)
print(result["memory_usage"]) # Memory usage statistics
print(result["cpu_usage"]) # CPU usage percentage
Configuration Options
Global Configuration Parameters
log_level: Logging level (default: INFO)log_to_file: Enable file logging (default: False)log_file_path: Path to log file (default: "./pyfuncmonitor.log")log_file_max_size: Maximum log file size in bytes (default: 10MB)log_file_backup_count: Number of backup log files (default: 5)default_validate_input: Default input validation setting (default: True)default_validate_output: Default output validation setting (default: True)default_log_execution: Default execution logging setting (default: True)default_return_raw_result: Default return format setting (default: False)enable_memory_monitoring: Enable memory monitoring (default: True)enable_cpu_monitoring: Enable CPU monitoring (default: True)
Decorator Parameters
validate_input: Enable input validation using type hintsvalidate_output: Enable output validation using type hintslog_execution: Enable structured logginglog_level: Log level for the function ("DEBUG", "INFO", "WARNING", "ERROR")return_raw_result: Return original result on success, structured format on errorenable_memory_monitoring: Enable memory usage monitoringenable_cpu_monitoring: Enable CPU usage monitoring
Logging
The monitor uses structured logging with configurable output formats:
Console Logging (Development)
configure_monitor(log_to_file=False) # Logs to console with readable format
File Logging (Production)
configure_monitor(
log_to_file=True,
log_file_path="/var/log/myapp/monitor.log"
) # Logs to file in JSON format
Custom Log Levels
@monitor_function(log_level="DEBUG")
def debug_function():
pass
@monitor_function(log_level="ERROR") # Only log errors
def critical_function():
pass
Best Practices
- Production Usage: Use
return_raw_result=Truein production to avoid overhead - Input Validation: Enable input validation for external-facing functions
- Log File Management: Configure log rotation to prevent disk space issues
- Selective Monitoring: Disable CPU/memory monitoring for high-frequency functions if needed
- Error Handling: Always handle the case where monitoring might return error status
# Production configuration example
configure_monitor(
log_to_file=True,
log_file_path="/var/log/myapp/pyfuncmonitor.log",
log_level=20, # INFO
default_return_raw_result=True,
default_validate_input=True,
default_validate_output=False # Disable output validation for performance
)
@monitor_function()
def api_endpoint(request_data: RequestModel) -> ResponseModel:
# Your business logic here
return process_request(request_data)
# Usage with error handling
result = api_endpoint(request)
if isinstance(result, dict) and result.get("status") == "error":
# Handle error case
logger.error("Function failed", errors=result["errors"])
return error_response()
else:
# Success case - result is the actual return value
return result
Performance Considerations
- Minimal Overhead: The monitor is designed to have minimal impact on function performance
- Selective Monitoring: Disable features you don't need for better performance
- Memory Monitoring: Uses
psutilfor accurate memory measurements - CPU Monitoring: Lightweight CPU usage tracking
- Logging: Structured logging with configurable levels to reduce I/O overhead
Error Handling and Debugging
Common Issues
- Import Errors: Ensure all dependencies are installed
- Permission Issues: Check file permissions for log files
- Memory Monitoring: Requires
psutilpackage - Type Validation: Requires proper type hints for validation to work
Debug Mode
Enable debug mode for detailed logging:
from pyfuncmonitor import configure_monitor
configure_monitor(
log_level=10, # DEBUG level
log_to_file=True,
log_file_path="./debug.log"
)
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
- Issues: GitHub Issues
- PyPI: PyPI Package
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyfuncmonitor-0.1.2.tar.gz.
File metadata
- Download URL: pyfuncmonitor-0.1.2.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2582fc3fa37c09ee24240a308897afae1c946773f0ba5ce047c747e725031a9c
|
|
| MD5 |
800ed5f88158e0707f92aa936435e07a
|
|
| BLAKE2b-256 |
37dfbf10dd09b3aa02e5d228ca8d38cbc9277b11de01bb324513936aaf2c62d9
|
File details
Details for the file pyfuncmonitor-0.1.2-py3-none-any.whl.
File metadata
- Download URL: pyfuncmonitor-0.1.2-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0d2642d03e0d0bd25b25396599a7d9c3a017708629760faac24e3aac6ff5c9f
|
|
| MD5 |
6436a09701176fbe0df0ac0e20440c66
|
|
| BLAKE2b-256 |
e9a10f63ecd351317e2441bcdb13e9ac1fa373078cc86ec6970f341268c7d91e
|