sui_rpc_benchmark/json_rpc/
mod.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::config::BenchmarkConfig;
5use anyhow::Result;
6use request_loader::load_json_rpc_requests;
7use runner::run_queries;
8use std::{collections::HashSet, time::Duration};
9use tracing::info;
10
11pub mod request_loader;
12pub mod runner;
13
14pub async fn run_benchmark(
15    endpoint: &str,
16    file_path: &str,
17    concurrency: usize,
18    duration_secs: Option<u64>,
19    json_rpc_methods_to_skip: HashSet<String>,
20) -> Result<()> {
21    let config = BenchmarkConfig {
22        concurrency,
23        duration: duration_secs.map(Duration::from_secs),
24        json_rpc_file_path: Some(file_path.to_string()),
25        json_rpc_methods_to_skip,
26    };
27
28    info!("Loading JSON RPC requests from {}", file_path);
29    let requests = load_json_rpc_requests(file_path)?;
30    info!("Loaded {} requests", requests.len());
31
32    let metrics = run_queries(endpoint, &requests, &config).await?;
33    info!("Benchmark results:");
34    info!("=== Overall Statistics ===");
35    info!("Total requests sent: {}", metrics.total_sent);
36    info!("Total errors: {}", metrics.total_errors);
37    if metrics.total_sent > 0 {
38        let avg_latency = metrics.total_latency_ms / metrics.total_sent as f64;
39        info!("Average latency: {:.2}ms", avg_latency);
40        let success_rate = ((metrics.total_sent - metrics.total_errors) as f64
41            / metrics.total_sent as f64)
42            * 100.0;
43        info!("Success rate: {:.1}%", success_rate);
44    }
45    info!("=== Per-Method Statistics ===");
46    let mut methods: Vec<_> = metrics.per_method.iter().collect();
47    methods.sort_by_key(|(method, _)| *method);
48    for (method, stats) in methods {
49        info!("Method: {}", method);
50        info!("  Requests: {}", stats.total_sent);
51        info!("  Errors: {}", stats.total_errors);
52        if stats.total_sent > 0 {
53            let method_avg_latency = stats.total_latency_ms / stats.total_sent as f64;
54            let method_success_rate =
55                ((stats.total_sent - stats.total_errors) as f64 / stats.total_sent as f64) * 100.0;
56            info!("  Avg latency: {:.2}ms", method_avg_latency);
57            info!("  Success rate: {:.1}%", method_success_rate);
58        }
59    }
60    Ok(())
61}