|
| 1 | +#!/bin/bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +WEBHOOK_URL="$1" |
| 5 | + |
| 6 | +if [ -z "$WEBHOOK_URL" ]; then |
| 7 | + echo "SLACK_WEBHOOK not configured, skipping notification." |
| 8 | + exit 0 |
| 9 | +fi |
| 10 | + |
| 11 | +METRICS_FILE="bench_vs_artifacts/metrics.txt" |
| 12 | + |
| 13 | +if [ ! -f "$METRICS_FILE" ]; then |
| 14 | + curl -X POST "$WEBHOOK_URL" \ |
| 15 | + -H 'Content-Type: application/json; charset=utf-8' \ |
| 16 | + --data '{"blocks":[{"type":"header","text":{"type":"plain_text","text":"Lambda VM vs SP1 v6 - Nightly Benchmark"}},{"type":"section","text":{"type":"mrkdwn","text":":x: Benchmark failed - no metrics found. Check the workflow logs."}}]}' |
| 17 | + exit 0 |
| 18 | +fi |
| 19 | + |
| 20 | +parse_metric() { |
| 21 | + { grep "^${1}=" "$METRICS_FILE" || true; } | cut -d= -f2- |
| 22 | +} |
| 23 | + |
| 24 | +TARGET_STEPS_SERIES=$(parse_metric "target_steps_series") |
| 25 | +LAMBDA_TIMES=$(parse_metric "lambda_times") |
| 26 | +SP1_TIMES=$(parse_metric "sp1_times") |
| 27 | +RATIOS=$(parse_metric "ratios") |
| 28 | +TARGET_CYCLES=$(parse_metric "target_cycles") |
| 29 | +TARGET_CYCLES="${TARGET_CYCLES:-500000000}" |
| 30 | +LAMBDA_PROJECTED_H=$(parse_metric "lambda_projected_time_h") |
| 31 | +SP1_PROJECTED_H=$(parse_metric "sp1_projected_time_h") |
| 32 | +LAMBDA_R2=$(parse_metric "lambda_r2") |
| 33 | +SP1_R2=$(parse_metric "sp1_r2") |
| 34 | + |
| 35 | +IFS='/' read -ra STEPS_ARR <<< "${TARGET_STEPS_SERIES:-}" |
| 36 | +IFS='/' read -ra LAMBDA_ARR <<< "${LAMBDA_TIMES:-}" |
| 37 | +IFS='/' read -ra SP1_ARR <<< "${SP1_TIMES:-}" |
| 38 | +IFS='/' read -ra RATIO_ARR <<< "${RATIOS:-}" |
| 39 | + |
| 40 | +RESULTS_MRKDWN="" |
| 41 | +for i in "${!STEPS_ARR[@]}"; do |
| 42 | + steps="${STEPS_ARR[$i]}" |
| 43 | + [ -z "$steps" ] && continue |
| 44 | + lambda_t="${LAMBDA_ARR[$i]:-n/a}" |
| 45 | + sp1_t="${SP1_ARR[$i]:-n/a}" |
| 46 | + ratio="${RATIO_ARR[$i]:-n/a}" |
| 47 | + steps_m=$(LC_NUMERIC=C awk -v s="$steps" 'BEGIN { printf "%dM", s/1000000 }') |
| 48 | + if [ "$ratio" != "n/a" ]; then |
| 49 | + ratio_fmt=$(LC_NUMERIC=C awk -v r="$ratio" 'BEGIN { printf "%.2fx", r }') |
| 50 | + line="*${steps_m} steps:* Lambda ${lambda_t}s / SP1 ${sp1_t}s - ratio ${ratio_fmt}" |
| 51 | + else |
| 52 | + line="*${steps_m} steps:* Lambda ${lambda_t}s / SP1 ${sp1_t}s" |
| 53 | + fi |
| 54 | + if [ -n "$RESULTS_MRKDWN" ]; then |
| 55 | + RESULTS_MRKDWN="${RESULTS_MRKDWN}\\n${line}" |
| 56 | + else |
| 57 | + RESULTS_MRKDWN="$line" |
| 58 | + fi |
| 59 | +done |
| 60 | + |
| 61 | +if [ -z "$RESULTS_MRKDWN" ]; then |
| 62 | + RESULTS_MRKDWN="(no data)" |
| 63 | +fi |
| 64 | + |
| 65 | +PROJ_SECTION="" |
| 66 | +if [ -n "$LAMBDA_PROJECTED_H" ] || [ -n "$SP1_PROJECTED_H" ]; then |
| 67 | + TARGET_M=$(LC_NUMERIC=C awk -v c="$TARGET_CYCLES" 'BEGIN { printf "%dM", c/1000000 }') |
| 68 | + PROJ_MRKDWN="Projected @ ${TARGET_M} cycles:" |
| 69 | + if [ -n "$LAMBDA_PROJECTED_H" ]; then |
| 70 | + line="*Lambda VM:* ${LAMBDA_PROJECTED_H}h" |
| 71 | + [ -n "$LAMBDA_R2" ] && line="$line (R2=${LAMBDA_R2})" |
| 72 | + PROJ_MRKDWN="${PROJ_MRKDWN}\\n${line}" |
| 73 | + fi |
| 74 | + if [ -n "$SP1_PROJECTED_H" ]; then |
| 75 | + line="*SP1 v6:* ${SP1_PROJECTED_H}h" |
| 76 | + [ -n "$SP1_R2" ] && line="$line (R2=${SP1_R2})" |
| 77 | + PROJ_MRKDWN="${PROJ_MRKDWN}\\n${line}" |
| 78 | + fi |
| 79 | + PROJ_SECTION=',{"type":"divider"},{"type":"header","text":{"type":"plain_text","text":"Linear Projection"}},{"type":"section","text":{"type":"mrkdwn","text":"'"$PROJ_MRKDWN"'"}}' |
| 80 | +fi |
| 81 | + |
| 82 | +curl -X POST "$WEBHOOK_URL" \ |
| 83 | + -H 'Content-Type: application/json; charset=utf-8' \ |
| 84 | + --data '{"blocks":[{"type":"header","text":{"type":"plain_text","text":"Lambda VM vs SP1 v6 - Nightly Benchmark"}},{"type":"divider"},{"type":"section","text":{"type":"mrkdwn","text":"'"$RESULTS_MRKDWN"'"}}'"$PROJ_SECTION"']}' |
0 commit comments