Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(starknet_http_server): add metric tests #2962

Merged
merged 1 commit into from
Dec 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions crates/starknet_http_server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,10 @@ tracing.workspace = true
validator.workspace = true

[dev-dependencies]
blockifier = { workspace = true, features = ["testing"] }
mempool_test_utils.workspace = true
metrics-exporter-prometheus.workspace = true
serde_json.workspace = true
starknet_gateway_types = { workspace = true, features = ["testing"] }
starknet_http_server = { workspace = true, features = ["testing"] }
tokio = { workspace = true, features = ["rt"] }
1 change: 0 additions & 1 deletion crates/starknet_http_server/src/http_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ async fn add_tx(
HttpServerError::from(e)
});
record_added_transaction_status(add_tx_result.is_ok());

add_tx_result_as_json(add_tx_result)
}

Expand Down
89 changes: 88 additions & 1 deletion crates/starknet_http_server/src/http_server_test.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
use std::net::SocketAddr;
use std::sync::Arc;

use axum::body::{Bytes, HttpBody};
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use blockifier::test_utils::CairoVersion;
use infra_utils::metrics::parse_numeric_metric;
use mempool_test_utils::starknet_api_test_utils::invoke_tx;
use metrics_exporter_prometheus::PrometheusBuilder;
use starknet_api::transaction::TransactionHash;
use starknet_gateway_types::communication::{GatewayClientError, MockGatewayClient};
use starknet_sequencer_infra::component_client::ClientError;
use tokio::task;

use crate::http_server::add_tx_result_as_json;
use crate::config::HttpServerConfig;
use crate::http_server::{add_tx_result_as_json, HttpServer};
use crate::metrics::{
ADDED_TRANSACTIONS_FAILURE,
ADDED_TRANSACTIONS_SUCCESS,
ADDED_TRANSACTIONS_TOTAL,
};
use crate::test_utils::HttpTestClient;

#[tokio::test]
async fn test_tx_hash_json_conversion() {
Expand All @@ -20,3 +37,73 @@ async fn test_tx_hash_json_conversion() {
async fn to_bytes(res: Response) -> Bytes {
res.into_body().collect().await.unwrap().to_bytes()
}

#[tokio::test]
async fn get_metrics_test() {
// Create a mock gateway client that returns a successful response and a failure response.
const SUCCESS_TXS_TO_SEND: usize = 1;
const FAILURE_TXS_TO_SEND: usize = 1;

let mut mock_gateway_client = MockGatewayClient::new();
// Set the successful response.
mock_gateway_client
.expect_add_tx()
.times(1)
.return_once(move |_| Ok(TransactionHash::default()));
// Set the failure response.
mock_gateway_client.expect_add_tx().times(1).return_once(move |_| {
Err(GatewayClientError::ClientError(ClientError::UnexpectedResponse(
"mock response".to_string(),
)))
});

// Initialize the metrics directly instead of spawning a monitoring endpoint task.
let prometheus_handle = PrometheusBuilder::new()
.install_recorder()
.expect("should be able to build the recorder and install it globally");

// TODO(Tsabary): replace the const port with something that is not hardcoded.
// Create and run the server.
let http_server_config = HttpServerConfig { ip: "127.0.0.1".parse().unwrap(), port: 15123 };
let mut http_server =
HttpServer::new(http_server_config.clone(), Arc::new(mock_gateway_client));
tokio::spawn(async move { http_server.run().await });

let HttpServerConfig { ip, port } = http_server_config;
let add_tx_http_client = HttpTestClient::new(SocketAddr::from((ip, port)));

// Ensure the server starts running.
task::yield_now().await;

// Send transactions to the server.
for _ in std::iter::repeat(()).take(SUCCESS_TXS_TO_SEND + FAILURE_TXS_TO_SEND) {
let rpc_tx = invoke_tx(CairoVersion::default());
add_tx_http_client.add_tx(rpc_tx).await;
}

// Obtain and parse metrics.
let metrics = prometheus_handle.render();
let added_transactions_total_count =
parse_numeric_metric::<usize>(&metrics, ADDED_TRANSACTIONS_TOTAL.0);
let added_transactions_success_count =
parse_numeric_metric::<usize>(&metrics, ADDED_TRANSACTIONS_SUCCESS.0);
let added_transactions_failure_count =
parse_numeric_metric::<usize>(&metrics, ADDED_TRANSACTIONS_FAILURE.0);

// Ensure the metric values are as expected.
assert_eq!(
added_transactions_total_count.unwrap(),
SUCCESS_TXS_TO_SEND + FAILURE_TXS_TO_SEND,
"Total transaction count mismatch"
);
assert_eq!(
added_transactions_success_count.unwrap(),
SUCCESS_TXS_TO_SEND,
"Successful transaction count mismatch"
);
assert_eq!(
added_transactions_failure_count.unwrap(),
FAILURE_TXS_TO_SEND,
"Failing transaction count mismatch"
);
}
6 changes: 3 additions & 3 deletions crates/starknet_http_server/src/metrics.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use metrics::{absolute_counter, describe_counter, register_counter};
use tracing::info;

const ADDED_TRANSACTIONS_TOTAL: (&str, &str, u64) =
pub(crate) const ADDED_TRANSACTIONS_TOTAL: (&str, &str, u64) =
("ADDED_TRANSACTIONS_TOTAL", "Total number of transactions added", 0);
const ADDED_TRANSACTIONS_SUCCESS: (&str, &str, u64) =
pub(crate) const ADDED_TRANSACTIONS_SUCCESS: (&str, &str, u64) =
("ADDED_TRANSACTIONS_SUCCESS", "Number of successfully added transactions", 0);
const ADDED_TRANSACTIONS_FAILURE: (&str, &str, u64) =
pub(crate) const ADDED_TRANSACTIONS_FAILURE: (&str, &str, u64) =
("ADDED_TRANSACTIONS_FAILURE", "Number of faulty added transactions", 0);

pub(crate) fn init_metrics() {
Expand Down
Loading