From 0547115c52934b087cd7b87ca49b5ea504d4c0d0 Mon Sep 17 00:00:00 2001
From: Agnieszka Figiel <agnieszka.figiel@gmail.com>
Date: Mon, 5 Jun 2023 13:50:04 +0200
Subject: [PATCH] Benchmarks for Indonesia palm data endpoints

---
 lib/tasks/benchmarks.rake | 70 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 lib/tasks/benchmarks.rake

diff --git a/lib/tasks/benchmarks.rake b/lib/tasks/benchmarks.rake
new file mode 100644
index 000000000..f765a88e0
--- /dev/null
+++ b/lib/tasks/benchmarks.rake
@@ -0,0 +1,70 @@
+require "csv"
+
+namespace :benchmarks do
+  # API_ENV=[production|staging]
+  task run: :environment do
+    exit "API_ENV missing" unless ENV["API_ENV"].present? && ["production", "sandbox"].include?(ENV["API_ENV"])
+
+    api_host =
+      if ENV["API_ENV"] == "production"
+        "https://supplychains.trase.earth"
+      else
+        "https://sandbox.trase.earth"
+      end
+
+    puts "Running tests on #{api_host}"
+    test_urls = {
+      flows: {
+        no_recolor: "/api/v3/contexts/5/flows?start_year=2020&end_year=2020&include_columns=20%2C31%2C2%2C21&cont_attribute_id=1209&n_nodes=10",
+        recolor_by_zdc: "/api/v3/contexts/5/flows?start_year=2020&end_year=2020&include_columns=20%2C31%2C2%2C21&cont_attribute_id=1209&n_nodes=10&ncont_attribute_id=251"
+      }
+    }
+
+    test_results = {}
+    sample_size = 5
+    sample_size.times do |i|
+      test_urls.each do |category, subcategory_paths|
+        subcategory_paths.each do |subcategory, path|
+          label = [category, subcategory].join("-")
+          url = api_host + path
+          response_size = nil
+          pp label
+          begin
+            m = Benchmark.measure(label) { response_size = make_request(url + "&skip_cache=#{i}") }
+          rescue Net::ReadTimeout
+            puts "Timeout"
+            next
+          end
+          pp response_size
+          test_results[label] ||= {}
+          test_results[label][:url] = url
+          test_results[label][:results] ||= []
+          test_results[label][:results] << m
+        end
+      end
+    end
+    output_filename = "tmp/#{ENV["API_ENV"]}_api_performance_measurements_#{Time.now}.csv"
+    CSV.open(output_filename, "w") do |output_csv|
+      output_csv << ["label", "URL", "user", "system", "total", "real"]
+      test_results.each do |label, data|
+        # data[:results].each do |m|
+        #   output_csv << [label, data[:url], m.utime, m.stime, m.total, m.real]
+        # end
+        output_csv << [
+          label + " AVG",
+          data[:url],
+          data[:results].map(&:utime).sum / sample_size,
+          data[:results].map(&:stime).sum / sample_size,
+          data[:results].map(&:total).sum / sample_size,
+          data[:results].map(&:real).sum / sample_size
+        ]
+      end
+    end
+    pp output_filename
+  end
+
+  def make_request(url)
+    resp = Net::HTTP.get_response(URI(url))
+    resp.body.size
+  end
+end