Skip to content

Commit 34c9b90

Browse files
committed
Merge branch 'leo-ckbtc-logs' into 'master'
feat(ckBTC) Switch logs to json. We need to switch logs to json to improve observability and store logs off-chain. Closes FI-737. Closes FI-737 See merge request dfinity-lab/public/ic!12607
2 parents 5dfa7f4 + 8f4b4de commit 34c9b90

File tree

6 files changed

+88
-24
lines changed

6 files changed

+88
-24
lines changed

Cargo.lock

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

rs/bitcoin/ckbtc/minter/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ alias(
7878
"@crate_index//:candid",
7979
"@crate_index//:ic-cdk",
8080
"@crate_index//:ic-metrics-encoder",
81+
"@crate_index//:serde_json",
8182
],
8283
)
8384
for (name, features) in [
@@ -143,11 +144,14 @@ rust_test(
143144
"//rs/rosetta-api/icrc1",
144145
"//rs/rosetta-api/icrc1/ledger",
145146
"//rs/rust_canisters/canister_test",
147+
"//rs/rust_canisters/http_types",
146148
"//rs/state_machine_tests",
147149
"//rs/test_utilities/load_wasm",
148150
"//rs/types/base_types",
149151
"@crate_index//:bitcoin",
150152
"@crate_index//:candid",
151153
"@crate_index//:ic-btc-interface",
154+
"@crate_index//:serde_bytes",
155+
"@crate_index//:serde_json",
152156
],
153157
)

rs/bitcoin/ckbtc/minter/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ ripemd = "0.1.1"
3838
scopeguard = "1.1.0"
3939
serde = "1.0.136"
4040
serde_bytes = "0.11"
41+
serde_json = "1.0.96"
4142

4243
[dev-dependencies]
4344
bitcoin = "0.28.1"

rs/bitcoin/ckbtc/minter/src/lib.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@ pub const MINTER_FEE_PER_INPUT: u64 = 246;
4747
pub const MINTER_FEE_PER_OUTPUT: u64 = 7;
4848
pub const MINTER_FEE_CONSTANT: u64 = 52;
4949

50+
#[derive(Clone, serde::Serialize, Deserialize, Debug)]
51+
pub enum Priority {
52+
P0,
53+
P1,
54+
}
55+
56+
#[derive(Clone, serde::Serialize, Deserialize, Debug)]
57+
pub struct LogEntry {
58+
pub timestamp: u64,
59+
pub priority: Priority,
60+
pub file: String,
61+
pub line: u32,
62+
pub message: String,
63+
}
64+
65+
#[derive(Clone, Default, serde::Serialize, Deserialize, Debug)]
66+
pub struct Log {
67+
pub entries: Vec<LogEntry>,
68+
}
69+
5070
#[derive(CandidType, Debug, Deserialize, Serialize)]
5171
pub struct MinterInfo {
5272
pub min_confirmations: u32,

rs/bitcoin/ckbtc/minter/src/main.rs

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use ic_ckbtc_minter::updates::{
1919
use ic_ckbtc_minter::MinterInfo;
2020
use ic_ckbtc_minter::{
2121
state::eventlog::{Event, GetEventsArg},
22-
storage,
22+
storage, {Log, LogEntry, Priority},
2323
};
2424
use icrc_ledger_types::icrc1::account::Account;
2525

@@ -209,32 +209,29 @@ fn http_request(req: HttpRequest) -> HttpResponse {
209209
.with_body_and_content_length(dashboard)
210210
.build()
211211
} else if req.path() == "/logs" {
212-
use std::io::Write;
213-
let mut buf = vec![];
214-
215-
writeln!(&mut buf, "P0 logs:").unwrap();
212+
use serde_json;
213+
let mut entries: Log = Default::default();
216214
for entry in export_logs(&ic_ckbtc_minter::logs::P0) {
217-
writeln!(
218-
&mut buf,
219-
"{} {}:{} {}",
220-
entry.timestamp, entry.file, entry.line, entry.message
221-
)
222-
.unwrap();
215+
entries.entries.push(LogEntry {
216+
timestamp: entry.timestamp,
217+
priority: Priority::P0,
218+
file: entry.file.to_string(),
219+
line: entry.line,
220+
message: entry.message,
221+
});
223222
}
224-
225-
writeln!(&mut buf, "P1 logs:").unwrap();
226223
for entry in export_logs(&ic_ckbtc_minter::logs::P1) {
227-
writeln!(
228-
&mut buf,
229-
"{} {}:{} {}",
230-
entry.timestamp, entry.file, entry.line, entry.message
231-
)
232-
.unwrap();
224+
entries.entries.push(LogEntry {
225+
timestamp: entry.timestamp,
226+
priority: Priority::P1,
227+
file: entry.file.to_string(),
228+
line: entry.line,
229+
message: entry.message,
230+
});
233231
}
234-
235232
HttpResponseBuilder::ok()
236-
.header("Content-Type", "text/plain; charset=utf-8")
237-
.with_body_and_content_length(buf)
233+
.header("Content-Type", "application/json; charset=utf-8")
234+
.with_body_and_content_length(serde_json::to_string(&entries).unwrap_or_default())
238235
.build()
239236
} else {
240237
HttpResponseBuilder::not_found().build()

rs/bitcoin/ckbtc/minter/tests/tests.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use candid::{Decode, Encode, Nat, Principal};
44
use ic_base_types::{CanisterId, PrincipalId};
55
use ic_bitcoin_canister_mock::{OutPoint, PushUtxoToAddress, Utxo};
66
use ic_btc_interface::Network;
7+
use ic_canisters_http_types::{HttpRequest, HttpResponse};
78
use ic_ckbtc_kyt::{InitArg as KytInitArg, KytMode, LifecycleArg, SetApiKeyArg};
89
use ic_ckbtc_minter::lifecycle::init::{InitArgs as CkbtcMinterInitArgs, MinterArg};
910
use ic_ckbtc_minter::lifecycle::upgrade::UpgradeArgs;
@@ -577,6 +578,24 @@ impl CkBtcSetup {
577578
.unwrap()
578579
}
579580

581+
pub fn get_logs(&self) -> HttpResponse {
582+
let request = HttpRequest {
583+
method: "".to_string(),
584+
url: "/logs".to_string(),
585+
headers: vec![],
586+
body: serde_bytes::ByteBuf::new(),
587+
};
588+
Decode!(
589+
&assert_reply(
590+
self.env
591+
.execute_ingress(self.minter_id, "http_request", Encode!(&request).unwrap(),)
592+
.expect("failed to get minter info")
593+
),
594+
HttpResponse
595+
)
596+
.unwrap()
597+
}
598+
580599
pub fn refresh_fee_percentiles(&self) {
581600
Decode!(
582601
&assert_reply(
@@ -899,3 +918,25 @@ fn test_min_retrieval_amount() {
899918
let retrieve_btc_min_amount = ckbtc.get_minter_info().retrieve_btc_min_amount;
900919
assert_eq!(retrieve_btc_min_amount, 200_000);
901920
}
921+
922+
#[test]
923+
fn test_get_logs() {
924+
use ic_ckbtc_minter::Log;
925+
let ckbtc = CkBtcSetup::new();
926+
927+
let ans = ckbtc.get_logs();
928+
let binding = ans.body.into_vec();
929+
let logs = std::str::from_utf8(&binding).unwrap();
930+
let logs_json: serde_json::Value = serde_json::from_str(logs).unwrap();
931+
let decoded_logs: Log = serde_json::from_value(logs_json).unwrap();
932+
assert_eq!(decoded_logs.entries.len(), 0);
933+
934+
let _main_address = ckbtc.get_btc_address(Principal::from(ckbtc.minter_id));
935+
936+
let ans = ckbtc.get_logs();
937+
let binding = ans.body.into_vec();
938+
let logs = std::str::from_utf8(&binding).unwrap();
939+
let logs_json: serde_json::Value = serde_json::from_str(logs).unwrap();
940+
let decoded_logs: Log = serde_json::from_value(logs_json).unwrap();
941+
assert_eq!(decoded_logs.entries.len(), 2);
942+
}

0 commit comments

Comments
 (0)