#!/bin/bash # Artifact Management Script # Manage local benchmark artifacts set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" LOCAL_ARTIFACTS_DIR="$PROJECT_ROOT/.local-artifacts" # Create artifacts directory if it doesn't exist mkdir -p "$LOCAL_ARTIFACTS_DIR" case "${1:-help}" in "list") echo "=== Benchmark Runs ===" if [ -d "$LOCAL_ARTIFACTS_DIR" ]; then ls -lt "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | while read -r line; do run_dir=$(echo "$line" | awk '{print $9}') if [ -n "$run_dir" ]; then timestamp=$(basename "$run_dir" | sed 's/run_//') echo "Run: $timestamp" echo " Path: $run_dir" if [ -f "$run_dir/report.html" ]; then echo " Report: $run_dir/report.html" fi if [ -f "$run_dir/prometheus_metrics.txt" ]; then metrics_count=$(grep -c "benchmark_" "$run_dir/prometheus_metrics.txt" 2>/dev/null || echo "0") echo " Metrics: $metrics_count benchmarks" fi echo "" fi done else echo "No artifacts found" fi ;; "clean") echo "=== Cleaning Artifacts ===" case "${2:-all}" in "all") echo "Removing all artifacts..." rm -rf "$LOCAL_ARTIFACTS_DIR" echo "All artifacts removed" ;; "old") keep_count="${3:-10}" echo "Keeping last $keep_count runs, removing older ones..." cd "$LOCAL_ARTIFACTS_DIR" ls -1t run_* 2>/dev/null | tail -n +$((keep_count + 1)) | while read -r run; do echo "Removing: $run" rm -rf "$run" done ;; "run") run_id="${3:-}" if [ -z "$run_id" ]; then echo "Usage: $0 clean run " echo "Available runs:" ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found" exit 1 fi run_dir="$LOCAL_ARTIFACTS_DIR/run_$run_id" if [ -d "$run_dir" ]; then echo "Removing run: $run_id" rm -rf "$run_dir" else echo "Run not found: $run_id" fi ;; *) echo "Usage: $0 clean [all|old|run ]" exit 1 ;; esac ;; "compare") run1="${2:-}" run2="${3:-}" if [ -z "$run1" ] || [ -z "$run2" ]; then echo "Usage: $0 compare " echo "Available runs:" ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found" exit 1 fi echo "=== Comparing Runs ===" echo "Run 1: $run1" echo "Run 2: $run2" echo "" metrics1="$LOCAL_ARTIFACTS_DIR/run_$run1/prometheus_metrics.txt" metrics2="$LOCAL_ARTIFACTS_DIR/run_$run2/prometheus_metrics.txt" if [ ! -f "$metrics1" ] || [ ! -f "$metrics2" ]; then echo "One or both runs not found" exit 1 fi echo "Benchmark Comparison:" printf "%-40s %-15s %-15s %-10s\n" "Benchmark" "Run 1 (ns)" "Run 2 (ns)" "Change" printf "%-40s %-15s %-15s %-10s\n" "--------" "----------" "----------" "------" grep "benchmark_time_per_op" "$metrics1" | while read -r line1; do benchmark=$(echo "$line1" | sed 's/.*benchmark="\([^"]*\)".*/\1/') value1=$(echo "$line1" | awk '{print $2}') line2=$(grep "benchmark_time_per_op.*benchmark=\"$benchmark\"" "$metrics2" || true) if [ -n "$line2" ]; then value2=$(echo "$line2" | awk '{print $2}') # Calculate percentage change if [ "$value1" != "0" ]; then change=$(echo "scale=2; (($value2 - $value1) / $value1) * 100" | bc 2>/dev/null || echo "N/A") printf "%-40s %-15s %-15s %-10s\n" "$benchmark" "$value1" "$value2" "${change}%" else printf "%-40s %-15s %-15s %-10s\n" "$benchmark" "$value1" "$value2" "N/A" fi fi done ;; "export") run_id="${2:-}" format="${3:-json}" if [ -z "$run_id" ]; then echo "Usage: $0 export [json|csv]" echo "Available runs:" ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found" exit 1 fi run_dir="$LOCAL_ARTIFACTS_DIR/run_$run_id" if [ ! -d "$run_dir" ]; then echo "Run not found: $run_id" exit 1 fi output_file="$LOCAL_ARTIFACTS_DIR/export_${run_id}.$format" case "$format" in "json") echo "Exporting run $run_id to JSON..." python3 -c " import json import sys metrics = [] with open('$run_dir/prometheus_metrics.txt', 'r') as f: for line in f: if line.startswith('benchmark_time_per_op'): parts = line.strip().split() benchmark = parts[0].split('benchmark=\"')[1].rstrip('\"') value = parts[1] metrics.append({ 'benchmark': benchmark, 'time_per_op_ns': int(value), 'run_id': '$run_id' }) export_data = { 'run_id': '$run_id', 'timestamp': '$run_id', 'metrics': metrics } with open('$output_file', 'w') as f: json.dump(export_data, f, indent=2) " ;; "csv") echo "Exporting run $run_id to CSV..." echo "benchmark,time_per_op_ns,run_id" > "$output_file" grep "benchmark_time_per_op" "$run_dir/prometheus_metrics.txt" | while read -r line; do benchmark=$(echo "$line" | sed 's/.*benchmark="\([^"]*\)".*/\1/') value=$(echo "$line" | awk '{print $2}') echo "$benchmark,$value,$run_id" >> "$output_file" done ;; *) echo "Unsupported format: $format" exit 1 ;; esac echo "Exported to: $output_file" ;; "help"|*) echo "Artifact Management Tool" echo "" echo "Usage: $0 [args]" echo "" echo "Commands:" echo " list List all benchmark runs" echo " clean [all|old|run] Clean artifacts" echo " all Remove all artifacts" echo " old [count] Keep last N runs (default: 10)" echo " run Remove specific run" echo " compare Compare two benchmark runs" echo " export [format] Export run data (json|csv)" echo " help Show this help" echo "" echo "Examples:" echo " $0 list" echo " $0 clean old 5" echo " $0 compare 20241204_220000 20241204_230000" echo " $0 export 20241204_220000 json" ;; esac