This guide provides comprehensive information on using IQToolkit Analyzer for MongoDB performance analysis and optimization.
IQToolkit Analyzer provides comprehensive analysis of MongoDB query performance by:
# Install required MongoDB dependencies
pip install pymongo
# Install optional visualization dependencies
pip install matplotlib # For chart generation
# Create a sample configuration file
python -m iqtoolkit_analyzer.mongodb_cli config create --output mongodb_config.yml
Edit mongodb_config.yml:
connection:
connection_string: "mongodb://localhost:27017"
# Add authentication if needed
# username: "your_username"
# password: "your_password"
databases_to_monitor:
- "your_database_name"
thresholds:
slow_threshold_ms: 100.0
critical_threshold_ms: 5000.0
python -m iqtoolkit_analyzer.mongodb_cli test-connection --config mongodb_config.yml
# Single analysis
python -m iqtoolkit_analyzer.mongodb_cli analyze --config mongodb_config.yml --database myapp
# With HTML report generation
python -m iqtoolkit_analyzer.mongodb_cli analyze --config mongodb_config.yml --database myapp --output ./reports --format html
# Continuous monitoring
python -m iqtoolkit_analyzer.mongodb_cli monitor --config mongodb_config.yml --interval 5
connection:
connection_string: "mongodb://localhost:27017"
connection_timeout_ms: 5000
username: "monitoring_user" # Optional
password: "password" # Optional
auth_source: "admin" # Optional
use_ssl: true # Optional
thresholds:
slow_threshold_ms: 100.0 # Queries slower than 100ms
very_slow_threshold_ms: 1000.0 # Very slow threshold
critical_threshold_ms: 5000.0 # Critical threshold
max_examined_ratio: 10.0 # Max examined/returned ratio
min_frequency_for_analysis: 5 # Minimum frequency for analysis
profiling:
profiling_level: 1 # 0=off, 1=slow ops, 2=all ops
enable_on_startup: true
sample_rate: 1.0 # 1.0 = 100%, 0.1 = 10%
profile_data_retention_hours: 24
analysis:
normalize_queries: true
group_similar_queries: true
analyze_collections: true
analyze_index_usage: true
suggest_new_indexes: true
include_query_examples: true
# Analyze specific database
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp
# Analyze with custom config
python -m iqtoolkit_analyzer.mongodb_cli analyze --config my_config.yml --database myapp
# Enable profiling before analysis
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp --enable-profiling
# Generate JSON report
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp --output ./reports --format json
# Generate HTML report
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp --output ./reports --format html
# Generate multiple formats
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp --output ./reports --format json html markdown
# Monitor with 5-minute intervals
python -m iqtoolkit_analyzer.mongodb_cli monitor --database myapp --interval 5
# Monitor multiple databases
python -m iqtoolkit_analyzer.mongodb_cli monitor --config config.yml --interval 10
from iqtoolkit_analyzer.mongodb_analyzer import MongoDBSlowQueryDetector
from iqtoolkit_analyzer.mongodb_config import MongoDBConfig
# Load configuration
config = MongoDBConfig.from_yaml_file('mongodb_config.yml')
# Create detector
detector = MongoDBSlowQueryDetector(
config.get_effective_connection_string(),
config.thresholds
)
# Initialize and analyze
if detector.initialize():
slow_queries = detector.detect_slow_queries('myapp', time_window_minutes=60)
for query in slow_queries:
print(f"Slow query in {query.collection}:")
print(f" Duration: {query.avg_duration_ms:.1f}ms")
print(f" Frequency: {query.frequency}")
print(f" Impact Score: {query.impact_score:.1f}/100")
from iqtoolkit_analyzer.mongodb_report_generator import MongoDBReportGenerator
# Generate comprehensive report
report = detector.generate_comprehensive_report('myapp')
# Create report generator
generator = MongoDBReportGenerator(config)
# Generate HTML report
generator.generate_html_report(report, 'analysis_report.html')
# Generate charts
chart_files = generator.generate_charts(report, './charts')
print(f"Generated charts: {chart_files}")
The system automatically identifies and groups similar queries:
// These queries are grouped as the same pattern:
db.users.find({name: "John", age: 25})
db.users.find({name: "Jane", age: 30})
db.users.find({name: "Bob", age: 45})
// Normalized pattern: {find: "?", filter: {name: "?", age: "?"}}
Each query pattern includes comprehensive metrics:
Per-collection insights include:
Automated suggestions for:
Structured data format ideal for programmatic processing:
{
"metadata": {
"generated_at": "2025-11-15T10:30:00Z",
"database_name": "myapp",
"tool_version": "1.0.0"
},
"executive_summary": {
"overview": {
"total_slow_query_patterns": 15,
"total_executions_analyzed": 1250,
"average_query_duration_ms": 450.2,
"collections_affected": 8
},
"severity_breakdown": {
"critical_queries": 3,
"high_impact_queries": 7,
"medium_impact_queries": 5
}
},
"slow_queries": [...],
"recommendations": [...]
}
Interactive web-based report with:
Human-readable format perfect for documentation:
# MongoDB Slow Query Analysis Report
## Executive Summary
- **Total Slow Query Patterns:** 15
- **Average Query Duration:** 450.2ms
- **Collections Affected:** 8
### Key Findings
- High percentage of collection scans detected
- Several queries with low efficiency scores
- Aggregation operations dominate slow queries
thresholds:
# Development
slow_threshold_ms: 50.0
# Production
slow_threshold_ms: 200.0
profiling:
sample_rate: 0.1 # Sample 10% of operations
profiling:
profile_data_retention_hours: 24
auto_cleanup_enabled: true
# Test connection
python -m iqtoolkit_analyzer.mongodb_cli test-connection --config config.yml
# Check configuration
python -m iqtoolkit_analyzer.mongodb_cli config validate --config config.yml
// Grant profiling permissions
db.grantRolesToUser("monitoring_user", ["dbAdmin"])
// Check profiling status
db.getProfilingStatus()
// Enable profiling
db.setProfilingLevel(1, { slowms: 100 })
For large datasets:
analysis:
max_collections_to_analyze: 20 # Limit collection analysis
profiling:
sample_rate: 0.1 # Reduce sampling rate
profile_collection_size_mb: 50 # Smaller profile collection
Enable verbose logging for troubleshooting:
python -m iqtoolkit_analyzer.mongodb_cli analyze --database myapp --verbose
Or in configuration:
log_level: "DEBUG"
log_file: "/tmp/mongodb-slow-query-debug.log"
For optimal performance:
databases_to_monitor: ["critical_db"] # Focus on critical databases
analysis:
max_collections_to_analyze: 10
thresholds:
min_frequency_for_analysis: 10 # Higher frequency threshold
time_window_minutes: 30 # Shorter time window
profiling:
sample_rate: 0.05 # 5% sampling for high-volume systems
from iqtoolkit_analyzer.mongodb_analyzer import MongoDBSlowQueryDetector
from iqtoolkit_analyzer.mongodb_config import MongoDBThresholdConfig
# Custom thresholds
thresholds = MongoDBThresholdConfig(
slow_threshold_ms=50.0,
critical_threshold_ms=1000.0,
min_frequency_for_analysis=3
)
# Custom analysis
detector = MongoDBSlowQueryDetector("mongodb://localhost:27017", thresholds)
if detector.initialize():
# Analyze last 2 hours
queries = detector.detect_slow_queries("myapp", time_window_minutes=120)
# Filter for specific collections
user_queries = [q for q in queries if q.collection == "users"]
# Custom reporting
for query in user_queries:
if query.impact_score > 50:
print(f"High-impact query: {query.operation_type}")
print(f"Suggestions: {', '.join(query.optimization_suggestions)}")
# Integration example for alerting systems
def check_critical_queries(database_name: str) -> bool:
detector = MongoDBSlowQueryDetector(connection_string, thresholds)
if detector.initialize():
queries = detector.detect_slow_queries(database_name, 15) # Last 15 minutes
critical_queries = [q for q in queries if q.impact_score > 80]
if critical_queries:
# Send alert
send_alert(f"Critical slow queries detected in {database_name}")
return False
return True
For more examples and advanced usage patterns, see the examples documentation.