Skip to content

Commit 0c70e22

Browse files
authored
add omni-executor metrics (#3423)
1 parent 4449772 commit 0c70e22

File tree

14 files changed

+180
-2
lines changed

14 files changed

+180
-2
lines changed

tee-worker/omni-executor/Cargo.lock

+120
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tee-worker/omni-executor/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ jsonrpsee = { version = "0.24", features = ["server"] }
5252
jsonwebtoken = "9.3.0"
5353
libsecp256k1 = "0.7.1"
5454
log = "0.4.22"
55+
metrics = "0.24.1"
56+
metrics-exporter-prometheus = "0.16.2"
5557
mockall = "0.13.1"
5658
parity-scale-codec = "3.6.12"
5759
rand = "0.8.5"

tee-worker/omni-executor/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ Gramine is required for running inside TEE, please refer to [installation option
2222
2. Build omni-executor docker image:
2323

2424
```bash
25-
make docker-build
25+
make build-docker
2626
```
2727

2828
3. Start local omni-executor:
2929
```bash
3030
make start-local
3131
```
3232

33-
First service run will generate substrate account, it needs to set as omni executor in `omniAccount` pallet.
33+
First service run will generate substrate account, it needs to set as omni executor in `omniAccount` pallet.

tee-worker/omni-executor/docker/docker-compose.yml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ services:
2525
- litentry-test-network
2626
ports:
2727
- "2100:2100"
28+
- "9090:9090"
2829
healthcheck:
2930
test: [ "CMD-SHELL", "curl -X POST -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"method\":\"omni_getHealth\",\"id\":1}' http://localhost:2100 || exit 1"]
3031
interval: 30s

tee-worker/omni-executor/executor-core/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition.workspace = true
77
[dependencies]
88
async-trait = { workspace = true }
99
log = { workspace = true }
10+
metrics = { workspace = true }
1011
parity-scale-codec = { workspace = true, features = ["derive"] }
1112
rand = { workspace = true }
1213
regex = { workspace = true }

tee-worker/omni-executor/executor-core/src/intent_executor.rs

+20
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use tokio::sync::mpsc;
2020
use executor_primitives::AccountId;
2121
use executor_primitives::Intent;
2222
use executor_primitives::IntentId;
23+
use metrics::describe_gauge;
2324

2425
pub type IntentExecutionResult = (Option<Vec<u8>>, bool);
2526

@@ -32,6 +33,13 @@ pub trait IntentExecutor: Send {
3233
intent_id: IntentId,
3334
intent: Intent,
3435
) -> Result<IntentExecutionResult, ()>;
36+
37+
async fn name(&self) -> &'static str;
38+
39+
async fn on_execution_error(&self) {
40+
let name = self.name().await;
41+
describe_gauge!(executor_gauge_name(name), executor_gauge_desc(name));
42+
}
3543
}
3644

3745
pub struct MockedIntentExecutor {
@@ -55,4 +63,16 @@ impl IntentExecutor for MockedIntentExecutor {
5563
) -> Result<IntentExecutionResult, ()> {
5664
self.sender.send(()).map(|_| (None, false)).map_err(|_| ())
5765
}
66+
67+
async fn name(&self) -> &'static str {
68+
"mocked"
69+
}
70+
}
71+
72+
fn executor_gauge_name(name: &str) -> String {
73+
format!("{}_intent_execution_failures", name)
74+
}
75+
76+
fn executor_gauge_desc(name: &str) -> String {
77+
format!("Number of {} intent executor failures", name)
5878
}

tee-worker/omni-executor/executor-core/src/listener.rs

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::event_handler::{Error, EventHandler};
2323
use crate::fetcher::{EventsFetcher, LastFinalizedBlockNumFetcher};
2424
use crate::sync_checkpoint_repository::{Checkpoint, CheckpointRepository};
2525
use executor_primitives::GetEventId;
26+
use metrics::{describe_gauge, gauge};
2627

2728
/// Component, used to listen to chain and execute requested intents
2829
/// Requires specific implementations of:
@@ -65,6 +66,7 @@ impl<
6566
stop_signal: Receiver<()>,
6667
last_processed_log_repository: CheckpointRepositoryT,
6768
) -> Result<Self, ()> {
69+
describe_gauge!(synced_block_gauge_name(id), "Last synced block");
6870
Ok(Self {
6971
id: id.to_string(),
7072
handle,
@@ -185,6 +187,7 @@ impl<
185187
self.checkpoint_repository
186188
.save(CheckpointT::from(block_number_to_sync))
187189
.expect("Could not save checkpoint");
190+
gauge!(synced_block_gauge_name(&self.id)).set(block_number_to_sync as f64);
188191
log::debug!("Finished syncing block: {}", block_number_to_sync);
189192
block_number_to_sync += 1;
190193
},
@@ -205,3 +208,7 @@ impl<
205208
}
206209
}
207210
}
211+
212+
fn synced_block_gauge_name(listener_id: &str) -> String {
213+
format!("{}_synced_block", listener_id)
214+
}

tee-worker/omni-executor/executor-worker/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ clap = { workspace = true, features = ["derive"] }
1010
env_logger = { workspace = true }
1111
hex = { workspace = true }
1212
log = { workspace = true }
13+
metrics-exporter-prometheus = { workspace = true }
1314
scale-encode = { workspace = true }
1415
serde_json = { workspace = true }
1516
tokio = { workspace = true, features = ["macros", "rt-multi-thread", "signal"] }

tee-worker/omni-executor/executor-worker/src/cli.rs

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ pub struct RunArgs {
4343
pub accounting_contract_address: String,
4444
#[arg(long, value_name = "should sync with parentchain")]
4545
pub parentchain_sync: bool,
46+
#[arg(short, long, default_value = "9090", value_name = "metrics port")]
47+
pub metrics_port: String,
4648
}
4749

4850
#[derive(Args)]

tee-worker/omni-executor/executor-worker/src/main.rs

+11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use executor_crypto::{ecdsa, PairTrait};
3131
use executor_primitives::AccountId;
3232
use executor_storage::{init_storage, StorageDB};
3333
use log::{error, info};
34+
use metrics_exporter_prometheus::PrometheusBuilder;
3435
use native_task_handler::{
3536
run_native_task_handler, Aes256KeyStore, TaskHandlerContext, MAX_CONCURRENT_TASKS,
3637
};
@@ -49,7 +50,9 @@ use solana::SolanaClient;
4950
use solana_intent_executor::SolanaIntentExecutor;
5051
use std::env;
5152
use std::io::Write;
53+
use std::net::SocketAddr;
5254
use std::path::Path;
55+
use std::str::FromStr;
5356
use std::sync::Arc;
5457
use std::thread;
5558
use std::thread::JoinHandle;
@@ -80,6 +83,14 @@ async fn main() -> Result<(), ()> {
8083

8184
match cli.cmd {
8285
Commands::Run(args) => {
86+
let builder = PrometheusBuilder::new();
87+
88+
let address = SocketAddr::from_str(&format!("0.0.0.0:{}", args.metrics_port)).unwrap();
89+
builder
90+
.with_http_listener(address)
91+
.install()
92+
.expect("failed to install Prometheus recorder");
93+
8394
let auth_token_key_store = AuthTokenKeyStore::new(
8495
Path::new(&args.local_directory_path)
8596
.join("keystore/auth_token_key.bin")

tee-worker/omni-executor/intent/executors/cross-chain/src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,10 @@ impl<Provider: EthereumRpcProvider<Transaction = TransactionRequest> + Send + Sy
10781078
},
10791079
}
10801080
}
1081+
1082+
async fn name(&self) -> &'static str {
1083+
"cross-chain"
1084+
}
10811085
}
10821086

10831087
fn str_to_u256(amount: &str, decimals: u32) -> Option<U256> {

0 commit comments

Comments
 (0)