Apply Composer changes: comprehensive API updates, migrations, middleware, and infrastructure improvements
- Add comprehensive database migrations (001-024) for schema evolution - Enhance API schema with expanded type definitions and resolvers - Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth - Implement new services: AI optimization, billing, blockchain, compliance, marketplace - Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage) - Update Crossplane provider with enhanced VM management capabilities - Add comprehensive test suite for API endpoints and services - Update frontend components with improved GraphQL subscriptions and real-time updates - Enhance security configurations and headers (CSP, CORS, etc.) - Update documentation and configuration files - Add new CI/CD workflows and validation scripts - Implement design system improvements and UI enhancements
This commit is contained in:
190
scripts/performance-test.sh
Executable file
190
scripts/performance-test.sh
Executable file
@@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
# Performance Testing Script
|
||||
# Uses k6, Apache Bench, or curl for load testing
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
API_URL="${API_URL:-https://api.sankofa.nexus}"
|
||||
PORTAL_URL="${PORTAL_URL:-https://portal.sankofa.nexus}"
|
||||
TEST_DURATION="${TEST_DURATION:-60s}"
|
||||
VUS="${VUS:-10}" # Virtual Users
|
||||
|
||||
# Colors
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Check for k6
|
||||
if command -v k6 &> /dev/null; then
|
||||
log_info "Using k6 for load testing"
|
||||
USE_K6=true
|
||||
elif command -v ab &> /dev/null; then
|
||||
log_info "Using Apache Bench for load testing"
|
||||
USE_K6=false
|
||||
USE_AB=true
|
||||
else
|
||||
log_error "Neither k6 nor Apache Bench found. Install k6: https://k6.io/docs/getting-started/installation/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create k6 test script
|
||||
create_k6_script() {
|
||||
cat > /tmp/k6_test.js << 'EOF'
|
||||
import http from 'k6/http';
|
||||
import { check, sleep } from 'k6';
|
||||
import { Rate } from 'k6/metrics';
|
||||
|
||||
const errorRate = new Rate('errors');
|
||||
|
||||
export const options = {
|
||||
stages: [
|
||||
{ duration: '30s', target: 10 }, // Ramp up
|
||||
{ duration: '1m', target: 10 }, // Stay at 10 VUs
|
||||
{ duration: '30s', target: 20 }, // Ramp up to 20
|
||||
{ duration: '1m', target: 20 }, // Stay at 20 VUs
|
||||
{ duration: '30s', target: 0 }, // Ramp down
|
||||
],
|
||||
thresholds: {
|
||||
'http_req_duration': ['p(95)<200'], // 95% of requests should be below 200ms
|
||||
'http_req_failed': ['rate<0.01'], // Error rate should be less than 1%
|
||||
'errors': ['rate<0.01'],
|
||||
},
|
||||
};
|
||||
|
||||
const API_URL = __ENV.API_URL || 'https://api.sankofa.nexus';
|
||||
|
||||
export default function () {
|
||||
// Test health endpoint
|
||||
const healthRes = http.get(`${API_URL}/health`);
|
||||
const healthCheck = check(healthRes, {
|
||||
'health status is 200': (r) => r.status === 200,
|
||||
'health response time < 100ms': (r) => r.timings.duration < 100,
|
||||
});
|
||||
errorRate.add(!healthCheck);
|
||||
|
||||
// Test GraphQL endpoint
|
||||
const graphqlPayload = JSON.stringify({
|
||||
query: '{ __typename }',
|
||||
});
|
||||
const graphqlRes = http.post(`${API_URL}/graphql`, graphqlPayload, {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
});
|
||||
const graphqlCheck = check(graphqlRes, {
|
||||
'graphql status is 200': (r) => r.status === 200,
|
||||
'graphql response time < 200ms': (r) => r.timings.duration < 200,
|
||||
'graphql has data': (r) => JSON.parse(r.body).data !== undefined,
|
||||
});
|
||||
errorRate.add(!graphqlCheck);
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
# Run k6 test
|
||||
run_k6_test() {
|
||||
log_info "Starting k6 load test..."
|
||||
log_info "Duration: ${TEST_DURATION}"
|
||||
log_info "Virtual Users: ${VUS}"
|
||||
log_info "API URL: ${API_URL}"
|
||||
echo ""
|
||||
|
||||
k6 run --env API_URL="${API_URL}" \
|
||||
--duration "${TEST_DURATION}" \
|
||||
--vus "${VUS}" \
|
||||
/tmp/k6_test.js
|
||||
}
|
||||
|
||||
# Run Apache Bench test
|
||||
run_ab_test() {
|
||||
log_info "Starting Apache Bench load test..."
|
||||
log_info "Requests: 1000"
|
||||
log_info "Concurrency: ${VUS}"
|
||||
log_info "API URL: ${API_URL}"
|
||||
echo ""
|
||||
|
||||
# Test health endpoint
|
||||
log_info "Testing /health endpoint..."
|
||||
ab -n 1000 -c "${VUS}" -k "${API_URL}/health"
|
||||
|
||||
echo ""
|
||||
log_info "Testing GraphQL endpoint..."
|
||||
echo '{"query": "{ __typename }"}' > /tmp/graphql_payload.json
|
||||
ab -n 1000 -c "${VUS}" -k -p /tmp/graphql_payload.json \
|
||||
-T 'application/json' \
|
||||
"${API_URL}/graphql"
|
||||
}
|
||||
|
||||
# Simple curl-based test
|
||||
run_curl_test() {
|
||||
log_info "Running simple curl-based performance test..."
|
||||
log_info "This is a basic test. For comprehensive testing, install k6."
|
||||
echo ""
|
||||
|
||||
local total_time=0
|
||||
local success_count=0
|
||||
local fail_count=0
|
||||
local iterations=100
|
||||
|
||||
for i in $(seq 1 $iterations); do
|
||||
start=$(date +%s%N)
|
||||
if curl -sf "${API_URL}/health" > /dev/null; then
|
||||
end=$(date +%s%N)
|
||||
duration=$(( (end - start) / 1000000 )) # Convert to milliseconds
|
||||
total_time=$((total_time + duration))
|
||||
((success_count++))
|
||||
else
|
||||
((fail_count++))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $success_count -gt 0 ]; then
|
||||
avg_time=$((total_time / success_count))
|
||||
echo "Results:"
|
||||
echo " Success: ${success_count}/${iterations}"
|
||||
echo " Failed: ${fail_count}/${iterations}"
|
||||
echo " Average response time: ${avg_time}ms"
|
||||
|
||||
if [ $avg_time -lt 200 ]; then
|
||||
log_info "✓ Average response time is below 200ms target"
|
||||
else
|
||||
log_error "✗ Average response time exceeds 200ms target"
|
||||
fi
|
||||
else
|
||||
log_error "All requests failed!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
echo "=========================================="
|
||||
echo "Sankofa Phoenix Performance Test"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
if [ "$USE_K6" = true ]; then
|
||||
create_k6_script
|
||||
run_k6_test
|
||||
elif [ "$USE_AB" = true ]; then
|
||||
run_ab_test
|
||||
else
|
||||
run_curl_test
|
||||
fi
|
||||
|
||||
echo ""
|
||||
log_info "Performance test completed!"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user