Skip to content

Commit def1529

Browse files
eudelins-zamadvdplm
andcommitted
feat(kms-connector): event listening via eth_getLogs (#2166)
* feat(kms-connector): eth_getLogs event listening * chore(kms-connector): event listener error handling * chore(kms-connector): code cleaning * fix(kms-connector): error metric handling * fix(kms-connector): fix flaky tests * chore(kms-connector): batch db insertion * chore(kms-connector): rename metric * chore(kms-connector): code cleaning * fix(kms-connector): fix ob1 error * chore(kms-connector): docs * chore(kms-connector): docs Co-authored-by: David <dvdplm@gmail.com> * chore(kms-connector): u8 to usize --------- Co-authored-by: David <dvdplm@gmail.com>
1 parent 36be3a6 commit def1529

File tree

14 files changed

+436
-450
lines changed

14 files changed

+436
-450
lines changed

docs/metrics/metrics.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,11 @@ Metrics for zkproof-worker are to be added in future releases, if/when needed. C
228228
- **Alarm**: If the counter is a flat line over a period of time, only for `event_type` `public_decryption_request` and `user_decryption_request`.
229229
- **Recommendation**: 0 for more than 1 minute, i.e. `increase(counter{event_type="..."}[1m]) == 0`.
230230

231-
#### Metric Name: `kms_connector_gw_listener_event_received_errors`
231+
#### Metric Name: `kms_connector_gw_listener_event_listening_errors`
232232
- **Type**: Counter
233233
- **Labels**:
234-
- `event_type`: see [description](#metric-name-kms_connector_gw_listener_event_received_counter)
235-
- **Description**: Counts the number of errors encountered by the GW listener while receiving events.
234+
- `contract`: can be used to filter by contract (decryption, kmsgeneration).
235+
- **Description**: Counts the number of errors encountered by the GW listener while listening for events.
236236
- **Alarm**: If the counter increases over a period of time.
237237
- **Recommendation**: more than 60 failures in 1 minute, i.e. `sum(increase(counter[1m])) > 60`.
238238

kms-connector/.sqlx/query-08628a859406ce5a66dda3b9729847a3846a59691b8dde5f518c2cb40b687742.json

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kms-connector/.sqlx/query-7e6031fa69c6a6884bb9b3a7b2e19db0fef204f71ad8dde9bd8bc808b0cb25fd.json

Lines changed: 0 additions & 31 deletions
This file was deleted.

kms-connector/config/gw-listener.toml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,22 @@ database_url = "postgres://postgres:postgres@localhost/kms-connector"
4242
# ENV: KMS_CONNECTOR_TASK_LIMIT
4343
# task_limit = 1000
4444

45-
# The polling interval for decryption requests (optional, defaults to 1s)
45+
# The polling interval for decryption requests (optional, defaults to 500ms)
4646
# ENV: KMS_CONNECTOR_DECRYPTION_POLLING (format: https://docs.rs/humantime/latest/humantime/)
47-
# decryption_polling = "1s"
47+
# decryption_polling = "500ms"
4848

4949
# The polling interval for key management requests (optional, defaults to 30s)
5050
# ENV: KMS_CONNECTOR_KMS_GENERATION_POLLING (format: https://docs.rs/humantime/latest/humantime/)
5151
# key_management_polling = "30s"
5252

53+
# Maximum number of blocks per eth_getLogs RPC call (optional, defaults to 100)
54+
# ENV: KMS_CONNECTOR_GET_LOGS_BATCH_SIZE
55+
# get_logs_batch_size = 100
56+
57+
# Maximum consecutive polling errors before the listener stops (optional, defaults to 20)
58+
# ENV: KMS_CONNECTOR_MAX_CONSECUTIVE_POLLING_ERRORS
59+
# max_consecutive_polling_errors = 20
60+
5361
# Block number to start processing decryption events from (optional, defaults to latest block if not set)
5462
# ENV: KMS_CONNECTOR_DECRYPTION_FROM_BLOCK_NUMBER
5563
# decryption_from_block_number = 1234

kms-connector/crates/gw-listener/src/core/config.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ pub struct Config {
6262
#[serde(with = "humantime_serde", default = "default_key_management_polling")]
6363
pub key_management_polling: Duration,
6464

65+
/// The maximum number of blocks to fetch per `eth_getLogs` request.
66+
#[serde(default = "default_get_logs_batch_size")]
67+
pub get_logs_batch_size: u64,
68+
69+
/// Maximum number of consecutive polling errors before stopping the loop.
70+
#[serde(default = "default_max_consecutive_polling_errors")]
71+
pub max_consecutive_polling_errors: usize,
72+
6573
/// Optional block number to start processing decryption events from.
6674
pub decryption_from_block_number: Option<u64>,
6775
/// Optional block number to start processing KMS operation events from.
@@ -75,13 +83,21 @@ fn default_service_name() -> String {
7583
}
7684

7785
fn default_decryption_polling() -> Duration {
78-
Duration::from_secs(1)
86+
Duration::from_millis(500)
7987
}
8088

8189
fn default_key_management_polling() -> Duration {
8290
Duration::from_secs(30)
8391
}
8492

93+
fn default_get_logs_batch_size() -> u64 {
94+
100
95+
}
96+
97+
fn default_max_consecutive_polling_errors() -> usize {
98+
20
99+
}
100+
85101
// Default implementation for testing purpose
86102
impl Default for Config {
87103
fn default() -> Self {
@@ -101,6 +117,8 @@ impl Default for Config {
101117
healthcheck_timeout: default_healthcheck_timeout(),
102118
decryption_polling: default_decryption_polling(),
103119
key_management_polling: default_key_management_polling(),
120+
get_logs_batch_size: default_get_logs_batch_size(),
121+
max_consecutive_polling_errors: default_max_consecutive_polling_errors(),
104122
decryption_from_block_number: None,
105123
kms_operation_from_block_number: None,
106124
}
@@ -125,6 +143,8 @@ mod tests {
125143
env::remove_var("KMS_CONNECTOR_DECRYPTION_CONTRACT__ADDRESS");
126144
env::remove_var("KMS_CONNECTOR_KMS_GENERATION_CONTRACT__ADDRESS");
127145
env::remove_var("KMS_CONNECTOR_SERVICE_NAME");
146+
env::remove_var("KMS_CONNECTOR_GET_LOGS_BATCH_SIZE");
147+
env::remove_var("KMS_CONNECTOR_MAX_CONSECUTIVE_POLLING_ERRORS");
128148
}
129149
}
130150

@@ -207,15 +227,27 @@ mod tests {
207227
// Set an environment variable to override the file
208228
let gateway_chain_id = 77737;
209229
let service_name = "kms-connector-override";
230+
let get_logs_batch_size: u64 = 500;
231+
let max_consecutive_polling_errors = 5;
210232
let mut expected_config = example_config.clone();
211233
expected_config.gateway_chain_id = gateway_chain_id;
212234
expected_config.service_name = service_name.to_string();
235+
expected_config.get_logs_batch_size = get_logs_batch_size;
236+
expected_config.max_consecutive_polling_errors = max_consecutive_polling_errors;
213237
unsafe {
214238
env::set_var(
215239
"KMS_CONNECTOR_GATEWAY_CHAIN_ID",
216240
gateway_chain_id.to_string(),
217241
);
218242
env::set_var("KMS_CONNECTOR_SERVICE_NAME", service_name);
243+
env::set_var(
244+
"KMS_CONNECTOR_GET_LOGS_BATCH_SIZE",
245+
get_logs_batch_size.to_string(),
246+
);
247+
env::set_var(
248+
"KMS_CONNECTOR_MAX_CONSECUTIVE_POLLING_ERRORS",
249+
max_consecutive_polling_errors.to_string(),
250+
);
219251
}
220252

221253
// Load config from both sources

0 commit comments

Comments
 (0)