upload-benchmark.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env bash
  2. set -e
  3. usage() {
  4. cat <<EOF >&2
  5. USAGE:
  6. $0 <BENCHMARK_FILEPATH>
  7. REQUIRED ENVIRONMENTS:
  8. INFLUX_HOST Hostname or IP address of the InfluxDB server
  9. INFLUX_DB Name of the InfluxDB database
  10. INFLUX_USER Username for InfluxDB
  11. INFLUX_PASSWORD Password for InfluxDB
  12. INFLUX_MEASUREMENT Measurement for InfluxDB
  13. OPTIONAL ENVIRONMENTS:
  14. COMMIT_HASH Commit hash of the benchmark file
  15. TEST_SUITE The group name for all tests in the benchmark file
  16. DRY_RUN Dry run
  17. ARGS:
  18. <BENCHMARK_FILEPATH> The output file generated by running
  19. \`cargo bench -- -Z unstable-options --format=json\`
  20. contains the benchmark results in JSON format
  21. EOF
  22. }
  23. print_error_and_exit() {
  24. local msg="$1"
  25. echo "error: $msg" >&2
  26. echo ""
  27. usage
  28. exit 1
  29. }
  30. check_env() {
  31. local var_name="$1"
  32. if [ -z "${!var_name}" ]; then
  33. print_error_and_exit "Environment variable $var_name is required"
  34. fi
  35. }
  36. filepath="$1"
  37. if [ ! -f "$filepath" ]; then
  38. print_error_and_exit "invalid <BENCHMARK_FILEPATH>"
  39. fi
  40. if [ -z "$COMMIT_HASH" ]; then
  41. COMMIT_HASH=$(uuidgen)
  42. fi
  43. if [ -z "$TEST_SUITE" ]; then
  44. TEST_SUITE="$(basename "${BENCHMARK_FILEPATH}")-$(date +%s)"
  45. fi
  46. if [ -z "$DRY_RUN" ]; then
  47. required_env_vars=(
  48. "INFLUX_HOST"
  49. "INFLUX_DB"
  50. "INFLUX_USER"
  51. "INFLUX_PASSWORD"
  52. "INFLUX_MEASUREMENT"
  53. )
  54. for var in "${required_env_vars[@]}"; do
  55. check_env "$var"
  56. done
  57. fi
  58. while IFS= read -r line; do
  59. if [[ $line =~ ^test\ (.*)\ \.\.\.\ bench:\ *([0-9,\.]+)\ ns\/iter\ \(\+\/-\ *([0-9,\.]+)\) ]]; then
  60. test_name="${BASH_REMATCH[1]}"
  61. ns_iter="${BASH_REMATCH[2]}"
  62. plus_minus="${BASH_REMATCH[3]}"
  63. ns_iter=$(echo "$ns_iter" | tr -d ',' | cut -d'.' -f1)
  64. plus_minus=$(echo "$plus_minus" | tr -d ',' | cut -d'.' -f1)
  65. datapoint="${INFLUX_MEASUREMENT},commit=${COMMIT_HASH},test_suite=${TEST_SUITE},name=${test_name} median=${ns_iter}i,deviation=${plus_minus}i"
  66. echo "datapoint: $datapoint"
  67. if [[ -z "$DRY_RUN" ]]; then
  68. curl -s -X POST "${INFLUX_HOST}/write?db=${INFLUX_DB}" --data-binary "$datapoint"
  69. fi
  70. fi
  71. done <"$filepath"