claude-flow-novice 2.2.4 → 2.2.5
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.
- package/package.json +9 -8
- package/scripts/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/.claude-flow/metrics/performance.json +9 -0
- package/scripts/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/CLEANUP_OPTIMIZATION_REPORT.json +312 -0
- package/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +387 -0
- package/scripts/CLEANUP_QUICK_START.md +268 -0
- package/scripts/CLEANUP_TEST_RESULTS.md +205 -0
- package/scripts/README.md +339 -0
- package/scripts/ace-query.sh +384 -0
- package/scripts/agent-token-analysis.js +430 -0
- package/scripts/auto-setup.js +332 -0
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/build/validate-agents.js +238 -0
- package/scripts/build-index.js +43 -0
- package/scripts/build-orchestrator.js +320 -0
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/ci-validation.js +375 -0
- package/scripts/cleanup-blocking-coordination.sh +420 -0
- package/scripts/cleanup-idle-sessions.sh +59 -0
- package/scripts/collect-build-metrics.js +65 -0
- package/scripts/demo/README.md +79 -0
- package/scripts/demo/autoscaling-demo-simplified.js +963 -0
- package/scripts/demo/comprehensive-dashboard-test.js +693 -0
- package/scripts/demo/confidence-log.js +87 -0
- package/scripts/demo/confidence-report.js +82 -0
- package/scripts/demo/demo-multi-swarm-coordination.js +325 -0
- package/scripts/demo/demo-production-deployment.js +399 -0
- package/scripts/demo/demo-visualization-system.js +149 -0
- package/scripts/demo/performance-analysis.cjs +71 -0
- package/scripts/demo/performance-analysis.js +71 -0
- package/scripts/demo/test-autoscaling-demo.js +314 -0
- package/scripts/dependency-optimizer.js +349 -0
- package/scripts/dependency-security-assessment.js +331 -0
- package/scripts/deploy-sdk.sh +176 -0
- package/scripts/deployment-readiness-report.json +179 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/ecosystem.config.cjs +90 -0
- package/scripts/fix-js-extensions.js +167 -0
- package/scripts/generate-basic-types.js +73 -0
- package/scripts/generate-changelog.js +318 -0
- package/scripts/git-hooks/pre-commit.sh +143 -0
- package/scripts/health-checks.js +634 -0
- package/scripts/hook-wrapper.sh +54 -0
- package/scripts/install/README.md +375 -0
- package/scripts/install/REDIS_SETUP_VALIDATION.json +245 -0
- package/scripts/install/check-prerequisites.js +303 -0
- package/scripts/install/config-wizard.js +606 -0
- package/scripts/install/dependency-checker.js +385 -0
- package/scripts/install/health-check.js +765 -0
- package/scripts/install/install.js +256 -0
- package/scripts/install/installation-benchmark.js +461 -0
- package/scripts/install/quick-install.js +720 -0
- package/scripts/install/quick-start-wizard.js +295 -0
- package/scripts/install/redis-cli.js +289 -0
- package/scripts/install/redis-install-guides.md +407 -0
- package/scripts/install/redis-setup.js +559 -0
- package/scripts/install/redis-test.js +278 -0
- package/scripts/install/service-manager.js +672 -0
- package/scripts/install/setup.js +832 -0
- package/scripts/install/uninstall.js +526 -0
- package/scripts/install/update.js +461 -0
- package/scripts/install-pre-commit-hook.sh +127 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/memory-monitor-coordinator.js +322 -0
- package/scripts/migrate-to-sdk.sh +520 -0
- package/scripts/migration/QUICK-START.md +189 -0
- package/scripts/migration/QUICK-START.md.backup-1760135091363 +189 -0
- package/scripts/migration/README.md +464 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +500 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +500 -0
- package/scripts/migration/UPDATE-PATHS-README.md +464 -0
- package/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +464 -0
- package/scripts/migration/example-patterns.json +19 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/migration/reorganize-workspace.js +504 -0
- package/scripts/migration/test-update-paths.js +359 -0
- package/scripts/migration/update-paths.js +664 -0
- package/scripts/migration/validate-migration.js +647 -0
- package/scripts/monitor-loop.sh +65 -0
- package/scripts/monitor-memory.sh +47 -0
- package/scripts/monitor-migration.js +339 -0
- package/scripts/monitor.py +43 -0
- package/scripts/monitoring/README.md +178 -0
- package/scripts/monitoring/alert-monitor.sh +220 -0
- package/scripts/monitoring/analyze-resources.sh +199 -0
- package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
- package/scripts/monitoring/dynamic-monitor.sh +85 -0
- package/scripts/monitoring/launch-stability-test.sh +184 -0
- package/scripts/monitoring/monitor-test.sh +93 -0
- package/scripts/monitoring/pre-test-validation.sh +208 -0
- package/scripts/monitoring/quick-test-alerting.sh +118 -0
- package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
- package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
- package/scripts/monitoring/resource-monitor.sh +126 -0
- package/scripts/monitoring/stability-monitor.js +429 -0
- package/scripts/monitoring/test-monitor-quick.sh +54 -0
- package/scripts/monitoring/view-alerts.sh +307 -0
- package/scripts/npm-metrics-collector.js +482 -0
- package/scripts/npm-package-validation.cjs +299 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/optimize-package-swarm.js +54 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-monitor.js +644 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/post-deployment-monitoring.js +350 -0
- package/scripts/post-edit-pipeline.js +2091 -0
- package/scripts/post-install-claude-md.js +78 -0
- package/scripts/postinstall.js +79 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/pre-publish-validation.js +429 -0
- package/scripts/redis-lua/cleanup-blocking-coordination.lua +198 -0
- package/scripts/release-announcement.js +425 -0
- package/scripts/release-notification.js +248 -0
- package/scripts/release-rollback.js +376 -0
- package/scripts/release-validation.js +460 -0
- package/scripts/rollback-sdk.sh +66 -0
- package/scripts/run-production-validation.ts +590 -0
- package/scripts/run-stability-validation.sh +687 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/deployment-validation.cjs +279 -0
- package/scripts/security/envelope-encryption-confidence-report.cjs +422 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/install-git-secrets.sh +295 -0
- package/scripts/security/rotate-api-keys.js +469 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/security/security-audit.cjs +538 -0
- package/scripts/security/setup-redis-auth.sh +397 -0
- package/scripts/security/validate-envelope-encryption.cjs +340 -0
- package/scripts/security-scan.js +492 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/performance.json +9 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/switch-api.sh +158 -0
- package/scripts/sync-agents.js +290 -0
- package/scripts/test/50-agent-test.js +625 -0
- package/scripts/test/NEW_STABILITY_TEST_GUIDE.md +407 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/STABILITY_TEST_EXAMPLE.md +347 -0
- package/scripts/test/STABILITY_TEST_README.md +480 -0
- package/scripts/test/agent-worker.js +309 -0
- package/scripts/test/ai-coordination-test.js +650 -0
- package/scripts/test/ai-mesh-coordination-test.js +416 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/cli-agent-coordination-test.js +313 -0
- package/scripts/test/coordinator-multilingual-test.js +396 -0
- package/scripts/test/coordinator-transparency-demo.js +585 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/mesh-coordination-zero-overlap-test.js +740 -0
- package/scripts/test/multilingual-hello-world-test.js +390 -0
- package/scripts/test/quick-multilingual-demo.js +464 -0
- package/scripts/test/real-agent-test.js +312 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/run-stability-test-examples.sh +292 -0
- package/scripts/test/stability-results/stability-metrics.jsonl +83 -0
- package/scripts/test/stability-results/stability-test-report.json +128 -0
- package/scripts/test/stability-results/stability-test.log +1827 -0
- package/scripts/test/stability-test-50-agents.js +734 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/test-cleanup-performance.sh +416 -0
- package/scripts/test-dashboard-auth.cjs +203 -0
- package/scripts/test-docker-deployment.sh +207 -0
- package/scripts/test-npm-package.cjs +167 -0
- package/scripts/test-provider-routing.cjs +226 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-runner.cjs +154 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/validate-agent-hooks.js +506 -0
- package/scripts/validate-changelog.js +241 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/scripts/validate-docker-infrastructure.sh +502 -0
- package/scripts/validate-entry-points.js +300 -0
- package/scripts/validate-stage3-performance.ts +377 -0
- package/scripts/validate-template-bundling.js +180 -0
- package/scripts/validation/README.md +33 -0
- package/scripts/validation/acl-security-validation.cjs +214 -0
- package/scripts/validation/acl-security-validation.js +402 -0
- package/scripts/validation/byzantine-verification.js +407 -0
- package/scripts/validation/final-phase-2-consensus.cjs +219 -0
- package/scripts/validation/final-security-validation.js +791 -0
- package/scripts/validation/final-wasm-validation.cjs +840 -0
- package/scripts/validation/integration-test-analysis.js +105 -0
- package/scripts/validation/phase-0-comprehensive-validation.js +474 -0
- package/scripts/validation/phase-0-consensus-report.js +139 -0
- package/scripts/validation/phase-0-final-report.js +112 -0
- package/scripts/validation/phase-0-redis-consensus-report.js +129 -0
- package/scripts/validation/phase-0-validation-improved.js +490 -0
- package/scripts/validation/phase-0-validation-test.js +65 -0
- package/scripts/validation/phase-1-consensus-report.cjs +342 -0
- package/scripts/validation/phase-1-consensus-validation.cjs +551 -0
- package/scripts/validation/phase-1-consensus-validation.js +551 -0
- package/scripts/validation/phase-2-consensus-report.cjs +186 -0
- package/scripts/validation/phase-2-validation.cjs +171 -0
- package/scripts/validation/phase-2-validation.js +171 -0
- package/scripts/validation/phase-4-consensus-report.js +181 -0
- package/scripts/validation/phase-4-final-validation.js +351 -0
- package/scripts/validation/phase-5-consensus-report.cjs +113 -0
- package/scripts/validation/phase-5-consensus-report.js +113 -0
- package/scripts/validation/security-analysis.js +49 -0
- package/scripts/validation/security-validation.js +492 -0
- package/scripts/validation/simple-security-validation.js +464 -0
- package/scripts/verify-installation.js +112 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/scripts/verify-sdk-phase1.cjs +293 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/monitoring/quick-test-rate-limiting.sh - Quick validation of rate limiting monitoring
|
|
3
|
+
# Phase 1 Sprint 1.5: Rate Limiting Monitoring & Alerts
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
# CONFIGURATION
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
13
|
+
|
|
14
|
+
# Test environment
|
|
15
|
+
export CFN_BASE_DIR="/tmp/cfn-quick-test-$$"
|
|
16
|
+
export METRICS_FILE="/tmp/cfn-quick-metrics-$$.jsonl"
|
|
17
|
+
export ALERT_LOG_FILE="/tmp/cfn-quick-alerts-$$.jsonl"
|
|
18
|
+
export MONITOR_PID_FILE="/tmp/rate-limiting-quick-$$.pid"
|
|
19
|
+
export CHECK_INTERVAL=2
|
|
20
|
+
export MAX_INBOX_SIZE=100
|
|
21
|
+
|
|
22
|
+
# ==============================================================================
|
|
23
|
+
# SETUP
|
|
24
|
+
# ==============================================================================
|
|
25
|
+
|
|
26
|
+
echo "=================================="
|
|
27
|
+
echo "Quick Rate Limiting Monitor Test"
|
|
28
|
+
echo "=================================="
|
|
29
|
+
echo ""
|
|
30
|
+
|
|
31
|
+
# Create test environment
|
|
32
|
+
mkdir -p "$CFN_BASE_DIR/inbox"
|
|
33
|
+
rm -f "$METRICS_FILE" "$ALERT_LOG_FILE" "$MONITOR_PID_FILE"
|
|
34
|
+
|
|
35
|
+
# Create test agent inboxes with different utilization levels
|
|
36
|
+
create_test_inbox() {
|
|
37
|
+
local agent_id="$1"
|
|
38
|
+
local message_count="$2"
|
|
39
|
+
local inbox_dir="$CFN_BASE_DIR/inbox/$agent_id"
|
|
40
|
+
|
|
41
|
+
mkdir -p "$inbox_dir"
|
|
42
|
+
|
|
43
|
+
for i in $(seq 1 "$message_count"); do
|
|
44
|
+
echo "{\"id\":\"msg-$i\",\"content\":\"test\"}" > "$inbox_dir/msg-$i.msg"
|
|
45
|
+
done
|
|
46
|
+
|
|
47
|
+
echo "[SETUP] Created inbox for $agent_id with $message_count messages"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Create test inboxes
|
|
51
|
+
create_test_inbox "agent-low" 20 # 20% utilization
|
|
52
|
+
create_test_inbox "agent-medium" 50 # 50% utilization
|
|
53
|
+
create_test_inbox "agent-warning" 80 # 80% utilization - WARNING
|
|
54
|
+
create_test_inbox "agent-critical" 95 # 95% utilization - CRITICAL
|
|
55
|
+
|
|
56
|
+
echo ""
|
|
57
|
+
|
|
58
|
+
# ==============================================================================
|
|
59
|
+
# TEST 1: Monitor Start/Stop
|
|
60
|
+
# ==============================================================================
|
|
61
|
+
|
|
62
|
+
echo "TEST 1: Monitor lifecycle"
|
|
63
|
+
echo "-------------------------"
|
|
64
|
+
|
|
65
|
+
# Start monitor in background
|
|
66
|
+
timeout 5 bash "$SCRIPT_DIR/rate-limiting-monitor.sh" background 2>&1 || true
|
|
67
|
+
sleep 3
|
|
68
|
+
|
|
69
|
+
# Check status
|
|
70
|
+
status=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" status 2>&1)
|
|
71
|
+
if echo "$status" | grep -q "running"; then
|
|
72
|
+
echo "✅ Monitor started successfully"
|
|
73
|
+
else
|
|
74
|
+
echo "❌ Monitor failed to start"
|
|
75
|
+
echo " Status: $status"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
# ==============================================================================
|
|
81
|
+
# TEST 2: Metrics Collection
|
|
82
|
+
# ==============================================================================
|
|
83
|
+
|
|
84
|
+
echo "TEST 2: Metrics collection"
|
|
85
|
+
echo "-------------------------"
|
|
86
|
+
|
|
87
|
+
sleep 5 # Wait for at least one collection cycle
|
|
88
|
+
|
|
89
|
+
if [ -f "$METRICS_FILE" ]; then
|
|
90
|
+
metric_count=$(wc -l < "$METRICS_FILE" 2>/dev/null || echo "0")
|
|
91
|
+
echo "✅ Metrics file created with $metric_count entries"
|
|
92
|
+
|
|
93
|
+
# Check for inbox metrics
|
|
94
|
+
if grep -q "inbox.size" "$METRICS_FILE"; then
|
|
95
|
+
echo "✅ Inbox size metrics collected"
|
|
96
|
+
else
|
|
97
|
+
echo "❌ No inbox size metrics found"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if grep -q "inbox.utilization" "$METRICS_FILE"; then
|
|
101
|
+
echo "✅ Inbox utilization metrics collected"
|
|
102
|
+
else
|
|
103
|
+
echo "❌ No inbox utilization metrics found"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Show sample metrics
|
|
107
|
+
echo ""
|
|
108
|
+
echo "Sample metrics:"
|
|
109
|
+
tail -n 5 "$METRICS_FILE" | jq -r '.metric + ": " + (.value|tostring) + " (" + (.labels.agent // "N/A") + ")"' 2>/dev/null || tail -n 5 "$METRICS_FILE"
|
|
110
|
+
else
|
|
111
|
+
echo "❌ Metrics file not created"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
echo ""
|
|
115
|
+
|
|
116
|
+
# ==============================================================================
|
|
117
|
+
# TEST 3: Alert Generation
|
|
118
|
+
# ==============================================================================
|
|
119
|
+
|
|
120
|
+
echo "TEST 3: Alert generation"
|
|
121
|
+
echo "------------------------"
|
|
122
|
+
|
|
123
|
+
if [ -f "$ALERT_LOG_FILE" ]; then
|
|
124
|
+
alert_count=$(wc -l < "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
125
|
+
echo "✅ Alert file created with $alert_count alerts"
|
|
126
|
+
|
|
127
|
+
# Check for warning alerts (80% threshold)
|
|
128
|
+
warning_count=$(grep -c "warning" "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
129
|
+
echo " Warning alerts: $warning_count"
|
|
130
|
+
|
|
131
|
+
# Check for critical alerts (95% threshold)
|
|
132
|
+
critical_count=$(grep -c "critical" "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
133
|
+
echo " Critical alerts: $critical_count"
|
|
134
|
+
|
|
135
|
+
if [ "$alert_count" -gt 0 ]; then
|
|
136
|
+
echo ""
|
|
137
|
+
echo "Recent alerts:"
|
|
138
|
+
tail -n 3 "$ALERT_LOG_FILE" | jq -r '"\(.severity | ascii_upcase): \(.message)"' 2>/dev/null || tail -n 3 "$ALERT_LOG_FILE"
|
|
139
|
+
fi
|
|
140
|
+
else
|
|
141
|
+
echo "⚠️ No alerts generated (may be expected if utilization below thresholds)"
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
echo ""
|
|
145
|
+
|
|
146
|
+
# ==============================================================================
|
|
147
|
+
# TEST 4: Summary Output
|
|
148
|
+
# ==============================================================================
|
|
149
|
+
|
|
150
|
+
echo "TEST 4: Summary output"
|
|
151
|
+
echo "----------------------"
|
|
152
|
+
|
|
153
|
+
summary=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" summary 2>&1)
|
|
154
|
+
|
|
155
|
+
if echo "$summary" | grep -q "Rate Limiting Status"; then
|
|
156
|
+
echo "✅ Summary generated successfully"
|
|
157
|
+
echo ""
|
|
158
|
+
echo "$summary"
|
|
159
|
+
else
|
|
160
|
+
echo "❌ Summary generation failed"
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
echo ""
|
|
164
|
+
|
|
165
|
+
# ==============================================================================
|
|
166
|
+
# CLEANUP
|
|
167
|
+
# ==============================================================================
|
|
168
|
+
|
|
169
|
+
echo "=================================="
|
|
170
|
+
echo "Cleanup"
|
|
171
|
+
echo "=================================="
|
|
172
|
+
|
|
173
|
+
# Stop monitor
|
|
174
|
+
bash "$SCRIPT_DIR/rate-limiting-monitor.sh" stop 2>&1 || true
|
|
175
|
+
sleep 1
|
|
176
|
+
|
|
177
|
+
# Verify stopped
|
|
178
|
+
status=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" status 2>&1)
|
|
179
|
+
if echo "$status" | grep -q "stopped"; then
|
|
180
|
+
echo "✅ Monitor stopped successfully"
|
|
181
|
+
else
|
|
182
|
+
echo "⚠️ Monitor status: $status"
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
# Remove test files
|
|
186
|
+
rm -rf "$CFN_BASE_DIR"
|
|
187
|
+
rm -f "$METRICS_FILE" "$ALERT_LOG_FILE" "$MONITOR_PID_FILE"
|
|
188
|
+
|
|
189
|
+
echo "✅ Test environment cleaned up"
|
|
190
|
+
echo ""
|
|
191
|
+
|
|
192
|
+
# ==============================================================================
|
|
193
|
+
# SUMMARY
|
|
194
|
+
# ==============================================================================
|
|
195
|
+
|
|
196
|
+
echo "=================================="
|
|
197
|
+
echo "Quick Test Complete"
|
|
198
|
+
echo "=================================="
|
|
199
|
+
echo ""
|
|
200
|
+
echo "Components tested:"
|
|
201
|
+
echo " ✓ Monitor start/stop lifecycle"
|
|
202
|
+
echo " ✓ Metrics collection (inbox size, utilization)"
|
|
203
|
+
echo " ✓ Alert generation (warning/critical thresholds)"
|
|
204
|
+
echo " ✓ Summary output generation"
|
|
205
|
+
echo ""
|
|
206
|
+
echo "All deliverables validated successfully!"
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/monitoring/rate-limiting-monitor.sh - Rate limiting metrics and alerting
|
|
3
|
+
# Phase 1 Sprint 1.5: Rate Limiting Monitoring & Alerts
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
# CONFIGURATION
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
LIB_DIR="${SCRIPT_DIR}/../../lib"
|
|
13
|
+
CFN_BASE_DIR="${CFN_BASE_DIR:-/dev/shm/cfn}"
|
|
14
|
+
METRICS_FILE="${METRICS_FILE:-/dev/shm/cfn-metrics.jsonl}"
|
|
15
|
+
ALERT_LOG_FILE="${ALERT_LOG_FILE:-/dev/shm/cfn-alerts.jsonl}"
|
|
16
|
+
MONITOR_PID_FILE="${MONITOR_PID_FILE:-/dev/shm/rate-limiting-monitor.pid}"
|
|
17
|
+
|
|
18
|
+
# Check interval (seconds)
|
|
19
|
+
CHECK_INTERVAL="${CHECK_INTERVAL:-10}"
|
|
20
|
+
|
|
21
|
+
# Rate limiting thresholds
|
|
22
|
+
MAX_INBOX_SIZE="${MAX_INBOX_SIZE:-100}"
|
|
23
|
+
INBOX_CRITICAL_PCT="${INBOX_CRITICAL_PCT:-90}"
|
|
24
|
+
INBOX_WARNING_PCT="${INBOX_WARNING_PCT:-75}"
|
|
25
|
+
BACKPRESSURE_WARNING_RATE="${BACKPRESSURE_WARNING_RATE:-100}" # events/min
|
|
26
|
+
MESSAGE_FAILURE_CRITICAL_RATE="${MESSAGE_FAILURE_CRITICAL_RATE:-10}" # failures/min
|
|
27
|
+
|
|
28
|
+
# ==============================================================================
|
|
29
|
+
# DEPENDENCIES
|
|
30
|
+
# ==============================================================================
|
|
31
|
+
|
|
32
|
+
# Source libraries
|
|
33
|
+
if [ -f "$LIB_DIR/alerting.sh" ]; then
|
|
34
|
+
# shellcheck source=../../lib/alerting.sh
|
|
35
|
+
source "$LIB_DIR/alerting.sh"
|
|
36
|
+
else
|
|
37
|
+
echo "[ERROR] Alerting library not found at $LIB_DIR/alerting.sh" >&2
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if [ -f "$LIB_DIR/metrics.sh" ]; then
|
|
42
|
+
# shellcheck source=../../lib/metrics.sh
|
|
43
|
+
source "$LIB_DIR/metrics.sh"
|
|
44
|
+
else
|
|
45
|
+
echo "[ERROR] Metrics library not found at $LIB_DIR/metrics.sh" >&2
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# ==============================================================================
|
|
50
|
+
# SIGNAL HANDLERS
|
|
51
|
+
# ==============================================================================
|
|
52
|
+
|
|
53
|
+
cleanup() {
|
|
54
|
+
echo "[INFO] Shutting down rate limiting monitor (PID: $$)" >&2
|
|
55
|
+
rm -f "$MONITOR_PID_FILE"
|
|
56
|
+
exit 0
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
trap cleanup SIGTERM SIGINT
|
|
60
|
+
|
|
61
|
+
# ==============================================================================
|
|
62
|
+
# METRICS COLLECTION FUNCTIONS
|
|
63
|
+
# ==============================================================================
|
|
64
|
+
|
|
65
|
+
# collect_inbox_metrics - Gather inbox size and utilization data
|
|
66
|
+
collect_inbox_metrics() {
|
|
67
|
+
local inbox_dir="$CFN_BASE_DIR/inbox"
|
|
68
|
+
|
|
69
|
+
# Skip if inbox directory doesn't exist
|
|
70
|
+
if [ ! -d "$inbox_dir" ]; then
|
|
71
|
+
return 0
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Iterate through agent inboxes
|
|
75
|
+
for agent_inbox in "$inbox_dir"/*; do
|
|
76
|
+
[ -d "$agent_inbox" ] || continue
|
|
77
|
+
|
|
78
|
+
local agent_id
|
|
79
|
+
agent_id=$(basename "$agent_inbox")
|
|
80
|
+
|
|
81
|
+
# Count messages in inbox (use ls -1 instead of find for performance)
|
|
82
|
+
local message_count=0
|
|
83
|
+
if ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l > /dev/null 2>&1; then
|
|
84
|
+
message_count=$(ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l)
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Calculate utilization percentage
|
|
88
|
+
local utilization_pct=0
|
|
89
|
+
if [ "$MAX_INBOX_SIZE" -gt 0 ]; then
|
|
90
|
+
utilization_pct=$((message_count * 100 / MAX_INBOX_SIZE))
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Emit metrics
|
|
94
|
+
emit_metric "inbox.size" "$message_count" "count" "{\"agent\":\"$agent_id\"}"
|
|
95
|
+
emit_metric "inbox.utilization" "$utilization_pct" "percent" "{\"agent\":\"$agent_id\"}"
|
|
96
|
+
|
|
97
|
+
# Check alert thresholds
|
|
98
|
+
check_inbox_thresholds "$agent_id" "$utilization_pct" "$message_count"
|
|
99
|
+
done
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# check_inbox_thresholds - Evaluate inbox against alert thresholds
|
|
103
|
+
check_inbox_thresholds() {
|
|
104
|
+
local agent_id="$1"
|
|
105
|
+
local utilization_pct="$2"
|
|
106
|
+
local message_count="$3"
|
|
107
|
+
|
|
108
|
+
if [ "$utilization_pct" -ge "$INBOX_CRITICAL_PCT" ]; then
|
|
109
|
+
emit_alert "inbox_high_utilization" \
|
|
110
|
+
"Agent $agent_id inbox at critical level: ${utilization_pct}% (${message_count}/${MAX_INBOX_SIZE} messages)" \
|
|
111
|
+
"critical" \
|
|
112
|
+
"{\"agent\":\"$agent_id\",\"utilization\":$utilization_pct,\"count\":$message_count,\"max\":$MAX_INBOX_SIZE}"
|
|
113
|
+
elif [ "$utilization_pct" -ge "$INBOX_WARNING_PCT" ]; then
|
|
114
|
+
emit_alert "inbox_high_utilization" \
|
|
115
|
+
"Agent $agent_id inbox utilization elevated: ${utilization_pct}% (${message_count}/${MAX_INBOX_SIZE} messages)" \
|
|
116
|
+
"warning" \
|
|
117
|
+
"{\"agent\":\"$agent_id\",\"utilization\":$utilization_pct,\"count\":$message_count,\"max\":$MAX_INBOX_SIZE}"
|
|
118
|
+
fi
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# collect_backpressure_metrics - Track backpressure events
|
|
122
|
+
collect_backpressure_metrics() {
|
|
123
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
124
|
+
return 0
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# Count backpressure events in last minute (last 6 samples at 10s interval)
|
|
128
|
+
local backpressure_events
|
|
129
|
+
backpressure_events=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
130
|
+
jq -r 'select(.metric == "backpressure.wait") | .value' | wc -l)
|
|
131
|
+
|
|
132
|
+
# Emit backpressure rate metric
|
|
133
|
+
emit_metric "backpressure.events_per_min" "$backpressure_events" "count"
|
|
134
|
+
|
|
135
|
+
# Check alert threshold
|
|
136
|
+
if [ "$backpressure_events" -gt "$BACKPRESSURE_WARNING_RATE" ]; then
|
|
137
|
+
emit_alert "backpressure_high_rate" \
|
|
138
|
+
"Backpressure events exceed threshold: ${backpressure_events} events/min (threshold: ${BACKPRESSURE_WARNING_RATE}/min)" \
|
|
139
|
+
"warning" \
|
|
140
|
+
"{\"events_per_min\":$backpressure_events,\"threshold\":$BACKPRESSURE_WARNING_RATE}"
|
|
141
|
+
fi
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
# collect_message_failure_metrics - Track message delivery failures
|
|
145
|
+
collect_message_failure_metrics() {
|
|
146
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
147
|
+
return 0
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Count message send failures in last minute
|
|
151
|
+
local send_failures
|
|
152
|
+
send_failures=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
153
|
+
jq -r 'select(.metric == "coordination.send_failure") | .value' | wc -l)
|
|
154
|
+
|
|
155
|
+
# Emit failure rate metric
|
|
156
|
+
emit_metric "coordination.send_failures_per_min" "$send_failures" "count"
|
|
157
|
+
|
|
158
|
+
# Check critical threshold
|
|
159
|
+
if [ "$send_failures" -gt "$MESSAGE_FAILURE_CRITICAL_RATE" ]; then
|
|
160
|
+
emit_alert "message_send_failures_critical" \
|
|
161
|
+
"Message send failures exceed critical threshold: ${send_failures} failures/min (threshold: ${MESSAGE_FAILURE_CRITICAL_RATE}/min)" \
|
|
162
|
+
"critical" \
|
|
163
|
+
"{\"failures_per_min\":$send_failures,\"threshold\":$MESSAGE_FAILURE_CRITICAL_RATE}"
|
|
164
|
+
fi
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
# collect_overflow_metrics - Track inbox overflow events
|
|
168
|
+
collect_overflow_metrics() {
|
|
169
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
170
|
+
return 0
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Count overflow events in last minute
|
|
174
|
+
local overflow_events
|
|
175
|
+
overflow_events=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
176
|
+
jq -r 'select(.metric == "inbox.overflow") | .value' | wc -l)
|
|
177
|
+
|
|
178
|
+
if [ "$overflow_events" -gt 0 ]; then
|
|
179
|
+
emit_metric "inbox.overflow_events_per_min" "$overflow_events" "count"
|
|
180
|
+
|
|
181
|
+
emit_alert "inbox_overflow_detected" \
|
|
182
|
+
"Inbox overflow detected: ${overflow_events} events in last minute" \
|
|
183
|
+
"critical" \
|
|
184
|
+
"{\"overflow_events\":$overflow_events}"
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# ==============================================================================
|
|
189
|
+
# MONITORING LOOP
|
|
190
|
+
# ==============================================================================
|
|
191
|
+
|
|
192
|
+
# start_monitor - Begin continuous rate limiting monitoring
|
|
193
|
+
start_monitor() {
|
|
194
|
+
local iteration=0
|
|
195
|
+
|
|
196
|
+
echo "[INFO] Rate limiting monitor started (PID: $$)" >&2
|
|
197
|
+
echo "[INFO] Check interval: ${CHECK_INTERVAL}s" >&2
|
|
198
|
+
echo "[INFO] Inbox size limit: $MAX_INBOX_SIZE messages" >&2
|
|
199
|
+
echo "[INFO] Alert thresholds: Critical=${INBOX_CRITICAL_PCT}%, Warning=${INBOX_WARNING_PCT}%" >&2
|
|
200
|
+
echo "[INFO] Metrics file: $METRICS_FILE" >&2
|
|
201
|
+
echo "[INFO] Alert log: $ALERT_LOG_FILE" >&2
|
|
202
|
+
|
|
203
|
+
# Write PID file
|
|
204
|
+
echo $$ > "$MONITOR_PID_FILE"
|
|
205
|
+
|
|
206
|
+
while true; do
|
|
207
|
+
iteration=$((iteration + 1))
|
|
208
|
+
|
|
209
|
+
# Collect all rate limiting metrics
|
|
210
|
+
collect_inbox_metrics
|
|
211
|
+
collect_backpressure_metrics
|
|
212
|
+
collect_message_failure_metrics
|
|
213
|
+
collect_overflow_metrics
|
|
214
|
+
|
|
215
|
+
# Log iteration status (every 30 iterations = 5 minutes at 10s interval)
|
|
216
|
+
if [ $((iteration % 30)) -eq 0 ]; then
|
|
217
|
+
echo "[INFO] Rate limiting monitor iteration $iteration completed" >&2
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
# Sleep until next check
|
|
221
|
+
sleep "$CHECK_INTERVAL"
|
|
222
|
+
done
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
# ==============================================================================
|
|
226
|
+
# CONTROL FUNCTIONS
|
|
227
|
+
# ==============================================================================
|
|
228
|
+
|
|
229
|
+
# get_monitor_status - Check if monitor is running
|
|
230
|
+
get_monitor_status() {
|
|
231
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
232
|
+
local pid
|
|
233
|
+
pid=$(cat "$MONITOR_PID_FILE")
|
|
234
|
+
|
|
235
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
236
|
+
echo "running (PID: $pid)"
|
|
237
|
+
return 0
|
|
238
|
+
else
|
|
239
|
+
echo "stale (PID file exists but process not running)"
|
|
240
|
+
rm -f "$MONITOR_PID_FILE"
|
|
241
|
+
return 1
|
|
242
|
+
fi
|
|
243
|
+
else
|
|
244
|
+
echo "stopped"
|
|
245
|
+
return 1
|
|
246
|
+
fi
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# stop_monitor - Stop running monitor
|
|
250
|
+
stop_monitor() {
|
|
251
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
252
|
+
local pid
|
|
253
|
+
pid=$(cat "$MONITOR_PID_FILE")
|
|
254
|
+
|
|
255
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
256
|
+
echo "[INFO] Stopping rate limiting monitor (PID: $pid)" >&2
|
|
257
|
+
kill -TERM "$pid"
|
|
258
|
+
|
|
259
|
+
# Wait for graceful shutdown (max 5 seconds)
|
|
260
|
+
for i in {1..10}; do
|
|
261
|
+
if ! kill -0 "$pid" 2>/dev/null; then
|
|
262
|
+
echo "[INFO] Rate limiting monitor stopped successfully" >&2
|
|
263
|
+
return 0
|
|
264
|
+
fi
|
|
265
|
+
sleep 0.5
|
|
266
|
+
done
|
|
267
|
+
|
|
268
|
+
# Force kill if still running
|
|
269
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
270
|
+
echo "[WARN] Monitor did not stop gracefully, forcing..." >&2
|
|
271
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
272
|
+
fi
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
rm -f "$MONITOR_PID_FILE"
|
|
276
|
+
else
|
|
277
|
+
echo "[INFO] No rate limiting monitor running" >&2
|
|
278
|
+
fi
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
# get_rate_limiting_summary - Display current rate limiting status
|
|
282
|
+
get_rate_limiting_summary() {
|
|
283
|
+
echo "=== Rate Limiting Status ==="
|
|
284
|
+
echo ""
|
|
285
|
+
|
|
286
|
+
# Inbox utilization summary
|
|
287
|
+
if [ -d "$CFN_BASE_DIR/inbox" ]; then
|
|
288
|
+
echo "Inbox Utilization:"
|
|
289
|
+
for agent_inbox in "$CFN_BASE_DIR/inbox"/*; do
|
|
290
|
+
[ -d "$agent_inbox" ] || continue
|
|
291
|
+
|
|
292
|
+
local agent_id
|
|
293
|
+
agent_id=$(basename "$agent_inbox")
|
|
294
|
+
|
|
295
|
+
local message_count=0
|
|
296
|
+
if ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l > /dev/null 2>&1; then
|
|
297
|
+
message_count=$(ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l)
|
|
298
|
+
fi
|
|
299
|
+
|
|
300
|
+
local utilization_pct=0
|
|
301
|
+
if [ "$MAX_INBOX_SIZE" -gt 0 ]; then
|
|
302
|
+
utilization_pct=$((message_count * 100 / MAX_INBOX_SIZE))
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
printf " %-30s %3d messages (%3d%% utilization)\n" "$agent_id:" "$message_count" "$utilization_pct"
|
|
306
|
+
done
|
|
307
|
+
else
|
|
308
|
+
echo " No inbox directory found"
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
echo ""
|
|
312
|
+
|
|
313
|
+
# Recent alerts
|
|
314
|
+
if [ -f "$ALERT_LOG_FILE" ]; then
|
|
315
|
+
echo "Recent Rate Limiting Alerts (last hour):"
|
|
316
|
+
tail -n 100 "$ALERT_LOG_FILE" 2>/dev/null | \
|
|
317
|
+
jq -r 'select(.alert | contains("inbox") or contains("backpressure") or contains("overflow")) |
|
|
318
|
+
"\(.timestamp) [\(.severity)] \(.alert): \(.message)"' | \
|
|
319
|
+
tail -n 10 || echo " No recent alerts"
|
|
320
|
+
else
|
|
321
|
+
echo " No alerts logged"
|
|
322
|
+
fi
|
|
323
|
+
|
|
324
|
+
echo ""
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
# ==============================================================================
|
|
328
|
+
# MAIN EXECUTION
|
|
329
|
+
# ==============================================================================
|
|
330
|
+
|
|
331
|
+
case "${1:-start}" in
|
|
332
|
+
start)
|
|
333
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
334
|
+
echo "[ERROR] Rate limiting monitor already running (PID: $(cat "$MONITOR_PID_FILE"))" >&2
|
|
335
|
+
exit 1
|
|
336
|
+
fi
|
|
337
|
+
start_monitor
|
|
338
|
+
;;
|
|
339
|
+
|
|
340
|
+
stop)
|
|
341
|
+
stop_monitor
|
|
342
|
+
;;
|
|
343
|
+
|
|
344
|
+
restart)
|
|
345
|
+
stop_monitor
|
|
346
|
+
sleep 1
|
|
347
|
+
start_monitor
|
|
348
|
+
;;
|
|
349
|
+
|
|
350
|
+
status)
|
|
351
|
+
get_monitor_status
|
|
352
|
+
;;
|
|
353
|
+
|
|
354
|
+
summary)
|
|
355
|
+
get_rate_limiting_summary
|
|
356
|
+
;;
|
|
357
|
+
|
|
358
|
+
background)
|
|
359
|
+
# Start in background
|
|
360
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
361
|
+
echo "[ERROR] Rate limiting monitor already running (PID: $(cat "$MONITOR_PID_FILE"))" >&2
|
|
362
|
+
exit 1
|
|
363
|
+
fi
|
|
364
|
+
nohup "$0" start > /dev/shm/rate-limiting-monitor.log 2>&1 &
|
|
365
|
+
echo "[INFO] Rate limiting monitor started in background (PID: $!)" >&2
|
|
366
|
+
;;
|
|
367
|
+
|
|
368
|
+
*)
|
|
369
|
+
echo "Usage: $0 {start|stop|restart|status|summary|background}" >&2
|
|
370
|
+
echo "" >&2
|
|
371
|
+
echo "Commands:" >&2
|
|
372
|
+
echo " start - Start monitoring in foreground" >&2
|
|
373
|
+
echo " stop - Stop running monitor" >&2
|
|
374
|
+
echo " restart - Restart monitor" >&2
|
|
375
|
+
echo " status - Check monitor status" >&2
|
|
376
|
+
echo " summary - Display current rate limiting status" >&2
|
|
377
|
+
echo " background - Start monitor in background" >&2
|
|
378
|
+
exit 1
|
|
379
|
+
;;
|
|
380
|
+
esac
|