#!/bin/bash # Monitor Workflow Performance # Collects metrics about workflow execution times, Gitea load, and resource usage set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" OUTPUT_DIR="${REPO_ROOT}/monitoring/workflow-metrics" TIMESTAMP=$(date +%Y%m%d_%H%M%S) METRICS_FILE="${OUTPUT_DIR}/workflow_metrics_${TIMESTAMP}.json" # Create output directory mkdir -p "$OUTPUT_DIR" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}📊 Workflow Performance Monitor${NC}" echo "==================================" echo "" # Check if Gitea API credentials are available GITEA_URL="${GITEA_URL:-https://git.michaelschiemer.de}" GITEA_TOKEN="${GITEA_TOKEN:-${CI_TOKEN:-}}" REPO="${GITHUB_REPOSITORY:-michael/michaelschiemer}" if [ -z "$GITEA_TOKEN" ]; then echo -e "${YELLOW}⚠️ GITEA_TOKEN not set, some metrics will be unavailable${NC}" fi # Function to get workflow runs from Gitea API get_workflow_runs() { local workflow_name="$1" local limit="${2:-10}" if [ -z "$GITEA_TOKEN" ]; then echo "[]" return fi local api_url="${GITEA_URL}/api/v1/repos/${REPO}/actions/runs" if [ -n "$workflow_name" ]; then api_url="${api_url}?workflow=${workflow_name}&limit=${limit}" else api_url="${api_url}?limit=${limit}" fi curl -sfL \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Accept: application/json" \ "$api_url" 2>/dev/null || echo "[]" } # Function to calculate average duration calculate_average_duration() { local runs_json="$1" local total=0 local count=0 if [ "$runs_json" = "[]" ] || [ -z "$runs_json" ]; then echo "0" return fi # Extract durations (in seconds) from workflow runs # Note: This is a simplified parser - in production, use jq echo "$runs_json" | grep -o '"duration":[0-9]*' | grep -o '[0-9]*' | while read -r duration; do if [ -n "$duration" ] && [ "$duration" -gt 0 ]; then total=$((total + duration)) count=$((count + 1)) fi done if [ "$count" -eq 0 ]; then echo "0" else echo "$((total / count))" fi } # Collect metrics echo -e "${BLUE}📥 Collecting workflow metrics...${NC}" # Get recent workflow runs BUILD_WORKFLOW_RUNS=$(get_workflow_runs "build-image.yml" 20) DEPLOY_WORKFLOW_RUNS=$(get_workflow_runs "manual-deploy.yml" 10) # Calculate metrics BUILD_AVG_DURATION=$(calculate_average_duration "$BUILD_WORKFLOW_RUNS") DEPLOY_AVG_DURATION=$(calculate_average_duration "$DEPLOY_WORKFLOW_RUNS") # Get system metrics (if running on server) SYSTEM_LOAD="unknown" DOCKER_CONTAINERS="unknown" GITEA_RUNNER_STATUS="unknown" if command -v uptime >/dev/null 2>&1; then SYSTEM_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | tr -d ' ') fi if command -v docker >/dev/null 2>&1; then DOCKER_CONTAINERS=$(docker ps --format '{{.Names}}' | wc -l) if docker ps --format '{{.Names}}' | grep -q "gitea-runner"; then GITEA_RUNNER_STATUS="running" else GITEA_RUNNER_STATUS="stopped" fi fi # Create metrics JSON cat > "$METRICS_FILE" <