Skip to content
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
17 changes: 17 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ evm_rpc_client = { path = "evm_rpc_client" }
ic-crypto-test-utils-reproducible-rng = { git = "https://github.com/dfinity/ic", rev = "release-2024-09-26_01-31-base" }
ic-error-types = { workspace = true }
ic-management-canister-types = { workspace = true }
ic-metrics-assert = { workspace = true }
ic-test-utilities-load-wasm = { git = "https://github.com/dfinity/ic", rev = "release-2024-09-26_01-31-base" }
maplit = "1"
pocket-ic = { workspace = true }
Expand Down Expand Up @@ -94,6 +95,7 @@ ic-cdk-macros = "0.17.2"
ic-certified-map = "0.4"
ic-error-types = "0.2"
ic-management-canister-types = "0.3"
ic-metrics-assert = { version = "0.1.1", features = ["pocket_ic"] }
ic-metrics-encoder = "1.1"
ic-stable-structures = "0.6.8"
itertools = "0.14.0"
Expand Down
13 changes: 1 addition & 12 deletions candid/evm_rpc.did
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,6 @@ type LogEntry = record {
logIndex : opt nat;
removed : bool;
};
type Metrics = record {
requests : vec record { record { text; text }; nat64 };
responses : vec record { record { text; text; text }; nat64 };
inconsistentResponses : vec record { record { text; text }; nat64 };
cyclesCharged : vec record { record { text; text }; nat };
errHttpOutcall : vec record { record { text; text; RejectionCode }; nat64 };
errMaxResponseSizeExceeded : vec record { record { text; text }; nat64 };
};
type MultiFeeHistoryResult = variant {
Consistent : FeeHistoryResult;
Inconsistent : vec record { RpcService; FeeHistoryResult };
Expand Down Expand Up @@ -312,10 +304,7 @@ service : (InstallArgs) -> {
eth_call : (RpcServices, opt RpcConfig, CallArgs) -> (MultiCallResult);
request : (RpcService, json : text, maxResponseBytes : nat64) -> (RequestResult);
requestCost : (RpcService, json : text, maxResponseBytes : nat64) -> (RequestCostResult) query;

// DEBUG endpoint to retrieve metrics accumulated by the EVM RPC canister.
// NOTE: this method exists for debugging purposes, backward compatibility is not guaranteed.
getMetrics : () -> (Metrics) query;

getNodesInSubnet : () -> (numberOfNodes : nat32) query;
getProviders : () -> (vec Provider) query;
getServiceProviderMap : () -> (vec record { RpcService; ProviderId }) query;
Expand Down
37 changes: 15 additions & 22 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
use candid::candid_method;
use canhttp::multi::Timestamp;
use canhttp::{CyclesChargingPolicy, CyclesCostEstimator};
use canhttp::{multi::Timestamp, CyclesChargingPolicy, CyclesCostEstimator};
use canlog::{Log, Sort};
use evm_rpc::candid_rpc::CandidRpcClient;
use evm_rpc::http::{service_request_builder, ChargingPolicyWithCollateral};
use evm_rpc::logs::{Priority, INFO};
use evm_rpc::memory::{
get_num_subnet_nodes, insert_api_key, is_api_key_principal, is_demo_active, remove_api_key,
set_api_key_principals, set_demo_active, set_log_filter, set_num_subnet_nodes,
set_override_provider,
};
use evm_rpc::metrics::encode_metrics;
use evm_rpc::providers::{find_provider, resolve_rpc_service, PROVIDERS, SERVICE_PROVIDER_MAP};
use evm_rpc::types::{OverrideProvider, Provider, ProviderId, RpcAccess, RpcAuth};
use evm_rpc::{
http::{json_rpc_request, json_rpc_request_arg, transform_http_request},
memory::UNSTABLE_METRICS,
types::Metrics,
candid_rpc::CandidRpcClient,
http::{
json_rpc_request, json_rpc_request_arg, service_request_builder, transform_http_request,
ChargingPolicyWithCollateral,
},
logs::{Priority, INFO},
memory::{
get_num_subnet_nodes, insert_api_key, is_api_key_principal, is_demo_active, remove_api_key,
set_api_key_principals, set_demo_active, set_log_filter, set_num_subnet_nodes,
set_override_provider,
},
metrics::encode_metrics,
providers::{find_provider, resolve_rpc_service, PROVIDERS, SERVICE_PROVIDER_MAP},
types::{OverrideProvider, Provider, ProviderId, RpcAccess, RpcAuth},
};
use evm_rpc_types::{Hex32, HttpOutcallError, MultiRpcResult, RpcConfig, RpcResult};
use ic_canister_log::log;
Expand Down Expand Up @@ -406,12 +405,6 @@ fn http_request(request: HttpRequest) -> HttpResponse {
}
}

#[query(name = "getMetrics")]
#[candid_method(query, rename = "getMetrics")]
fn get_metrics() -> Metrics {
UNSTABLE_METRICS.with(|metrics| (*metrics.borrow()).clone())
}

fn now() -> Timestamp {
Timestamp::from_nanos_since_unix_epoch(ic_cdk::api::time())
}
Expand Down
31 changes: 21 additions & 10 deletions tests/setup/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use crate::{
};
use candid::{CandidType, Decode, Encode, Nat, Principal};
use canlog::{Log, LogEntry};
use evm_rpc::types::Metrics;
use evm_rpc::{
logs::Priority,
providers::PROVIDERS,
Expand All @@ -15,15 +14,18 @@ use evm_rpc_types::{InstallArgs, Provider, RpcResult, RpcService};
use ic_cdk::api::management_canister::main::CanisterId;
use ic_http_types::{HttpRequest, HttpResponse};
use ic_management_canister_types::CanisterSettings;
use ic_metrics_assert::{MetricsAssert, PocketIcAsyncHttpQuery};
use ic_test_utilities_load_wasm::load_wasm;
use pocket_ic::{nonblocking, ErrorCode, PocketIcBuilder, RejectResponse};
use pocket_ic::{nonblocking::PocketIc, ErrorCode, PocketIcBuilder, RejectResponse};
use serde::de::DeserializeOwned;
use std::sync::{Arc, Mutex};
use std::time::Duration;
use std::{
sync::{Arc, Mutex},
time::Duration,
};

#[derive(Clone)]
pub struct EvmRpcSetup {
pub env: Arc<nonblocking::PocketIc>,
pub env: Arc<PocketIc>,
pub caller: Principal,
pub controller: Principal,
pub canister_id: CanisterId,
Expand Down Expand Up @@ -169,11 +171,6 @@ impl EvmRpcSetup {
.entries
}

pub async fn get_metrics(&self) -> Metrics {
self.call_query("getMetrics", Encode!().unwrap(), Principal::anonymous())
.await
}

pub async fn get_service_provider_map(&self) -> Vec<(RpcService, ProviderId)> {
self.call_query(
"getServiceProviderMap",
Expand All @@ -197,6 +194,10 @@ impl EvmRpcSetup {
.await
}

pub async fn check_metrics(self) -> MetricsAssert<Self> {
MetricsAssert::from_async_http_query(self).await
}

// Legacy endpoint, not supported by the `evm_rpc_client::EvmRpcClient`
pub async fn request(
&self,
Expand Down Expand Up @@ -258,6 +259,16 @@ impl EvmRpcSetup {
}
}

impl PocketIcAsyncHttpQuery for EvmRpcSetup {
fn get_pocket_ic(&self) -> &PocketIc {
&self.env
}

fn get_canister_id(&self) -> ic_management_canister_types::CanisterId {
self.canister_id
}
}

fn evm_rpc_wasm() -> Vec<u8> {
load_wasm(std::env::var("CARGO_MANIFEST_DIR").unwrap(), "evm_rpc", &[])
}
Expand Down
Loading
Loading