Skip to content

Commit 2b651ab

Browse files
author
Clément TURMEL
authored
Merge pull request #2546 from input-output-hk/ctl/2494-record-uage-of-client-type-in-metrics
Record usage of client type in metrics
2 parents f03f887 + c370291 commit 2b651ab

File tree

30 files changed

+748
-233
lines changed

30 files changed

+748
-233
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ As a minor extension, we have adopted a slightly different versioning convention
1313

1414
- Support for `Cardano node` `10.4.1` in the signer and the aggregator.
1515

16+
- Support for recording client types in Mithril client library, CLI and WASM in the aggregator metrics.
17+
1618
- Crates versions:
1719

1820
| Crate | Version |

Cargo.lock

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

examples/client-wasm-nodejs/package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/client-wasm-web/package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.7.56"
3+
version = "0.7.57"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/event_store/database/migration.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,17 @@ create view if not exists metrics_per_day_and_origin as select metric_date as da
9494
group by action, origin, date;
9595
"#,
9696
),
97+
SqlMigration::new(
98+
5,
99+
r#"
100+
create view if not exists metrics_per_day_and_client_type as select metric_date as date, action as counter_name, client_type, sum(counter) value from
101+
(
102+
select action, json_extract(content, '$.content.client_type') client_type, json_extract(content, '$.content.value') counter, date(json_extract(content, '$.content.date')) metric_date
103+
from event
104+
where source='Metrics'
105+
)
106+
group by action, client_type, date;
107+
"#,
108+
),
97109
]
98110
}

mithril-aggregator/src/event_store/database/repository.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@ mod tests {
112112
Ok(result)
113113
}
114114

115+
fn get_all_metrics_by_client_type(
116+
connection: Arc<ConnectionThreadSafe>,
117+
) -> StdResult<Vec<(String, String, String, i64)>> {
118+
let query = "select date, counter_name, client_type, value from metrics_per_day_and_client_type";
119+
let mut statement = connection.prepare(query)?;
120+
let mut result = Vec::new();
121+
while let Ok(sqlite::State::Row) = statement.next() {
122+
result.push((
123+
statement.read::<String, _>("date")?,
124+
statement.read::<String, _>("counter_name")?,
125+
statement
126+
.read::<Option<String>, _>("client_type")?
127+
.unwrap_or_default(),
128+
statement.read::<i64, _>("value")?,
129+
));
130+
}
131+
132+
Ok(result)
133+
}
134+
115135
/// Insert a metric event in the database.
116136
/// date format is "%Y-%m-%d %H:%M:%S %z", example: "2015-09-05 23:56:04 +0000"
117137
fn insert_metric_event_with_origin(
@@ -129,6 +149,30 @@ mod tests {
129149
value,
130150
Duration::from_secs(5),
131151
origin.to_string(),
152+
"CLIENT_TYPE_A".to_string(),
153+
metric_date.into(),
154+
);
155+
156+
let _event = persister.persist(message).unwrap();
157+
}
158+
159+
fn insert_metric_event_message(
160+
persister: &EventPersister,
161+
date: &str,
162+
metric_name: &str,
163+
origin: &str,
164+
client_type: &str,
165+
value: i64,
166+
) {
167+
let metric_date =
168+
DateTime::parse_from_str(&format!("{date} +0000"), "%Y-%m-%d %H:%M:%S %z").unwrap();
169+
170+
let message = UsageReporter::create_metrics_event_message(
171+
metric_name.to_string(),
172+
value,
173+
Duration::from_secs(5),
174+
origin.to_string(),
175+
client_type.to_string(),
132176
metric_date.into(),
133177
);
134178

@@ -300,6 +344,30 @@ mod tests {
300344
assert!(result.contains(&("2024-10-30", "metric_1", "ORIGIN_B", 7)));
301345
}
302346

347+
#[test]
348+
fn vue_metrics_per_day_and_client_type() {
349+
fn tuple_with_str(t: &(String, String, String, i64)) -> (&str, &str, &str, i64) {
350+
(t.0.as_str(), t.1.as_str(), t.2.as_str(), t.3)
351+
}
352+
353+
let connection = Arc::new(event_store_db_connection().unwrap());
354+
let persister = EventPersister::new(connection.clone());
355+
356+
insert_metric_event_message(
357+
&persister,
358+
"2024-10-29 21:00:00",
359+
"metric_1",
360+
"ORIGIN_A",
361+
"CLIENT_TYPE_A",
362+
15,
363+
);
364+
365+
let result = get_all_metrics_by_client_type(connection).unwrap();
366+
let result: Vec<_> = result.iter().map(tuple_with_str).collect();
367+
368+
assert!(result.contains(&("2024-10-29", "metric_1", "CLIENT_TYPE_A", 15)));
369+
}
370+
303371
#[test]
304372
fn sum_metric_per_day_and_origin_on_old_event() {
305373
fn tuple_with_str(t: &(String, String, String, i64)) -> (&str, &str, &str, i64) {

mithril-aggregator/src/http_server/routes/artifact_routes/cardano_database.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn artifact_cardano_database_by_id(
2828
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
2929
warp::path!("artifact" / "cardano-database" / String)
3030
.and(warp::get())
31-
.and(middlewares::with_origin_tag(dependency_manager))
31+
.and(middlewares::with_client_metadata(dependency_manager))
3232
.and(middlewares::with_logger(dependency_manager))
3333
.and(middlewares::with_http_message_service(dependency_manager))
3434
.and(middlewares::with_metrics_service(dependency_manager))
@@ -64,14 +64,16 @@ fn serve_cardano_database_dir(
6464
}
6565

6666
mod handlers {
67-
use crate::http_server::routes::reply;
68-
use crate::services::MessageService;
69-
use crate::MetricsService;
7067
use slog::{debug, warn, Logger};
7168
use std::convert::Infallible;
7269
use std::sync::Arc;
7370
use warp::http::StatusCode;
7471

72+
use crate::http_server::routes::middlewares::ClientMetadata;
73+
use crate::http_server::routes::reply;
74+
use crate::services::MessageService;
75+
use crate::MetricsService;
76+
7577
pub const LIST_MAX_ITEMS: usize = 20;
7678

7779
/// List artifacts
@@ -94,14 +96,17 @@ mod handlers {
9496
/// Get artifact by signed entity id
9597
pub async fn get_artifact_by_signed_entity_id(
9698
signed_entity_id: String,
97-
origin_tag: Option<String>,
99+
client_metadata: ClientMetadata,
98100
logger: Logger,
99101
http_message_service: Arc<dyn MessageService>,
100102
metrics_service: Arc<MetricsService>,
101103
) -> Result<impl warp::Reply, Infallible> {
102104
metrics_service
103105
.get_artifact_detail_cardano_database_total_served_since_startup()
104-
.increment(&[origin_tag.as_deref().unwrap_or_default()]);
106+
.increment(&[
107+
client_metadata.origin_tag.as_deref().unwrap_or_default(),
108+
client_metadata.client_type.as_deref().unwrap_or_default(),
109+
]);
105110

106111
match http_message_service
107112
.get_cardano_database_message(&signed_entity_id)
@@ -178,7 +183,7 @@ mod tests {
178183
CardanoDatabaseSnapshotMessage,
179184
};
180185
use mithril_common::test_utils::apispec::APISpec;
181-
use mithril_common::MITHRIL_ORIGIN_TAG_HEADER;
186+
use mithril_common::{MITHRIL_CLIENT_TYPE_HEADER, MITHRIL_ORIGIN_TAG_HEADER};
182187
use mithril_persistence::sqlite::HydrationError;
183188
use serde_json::Value::Null;
184189
use std::sync::Arc;
@@ -275,12 +280,13 @@ mod tests {
275280
let initial_counter_value = dependency_manager
276281
.metrics_service
277282
.get_artifact_detail_cardano_database_total_served_since_startup()
278-
.get(&["TEST"]);
283+
.get(&["TEST", "CLI"]);
279284

280285
request()
281286
.method(method)
282287
.path(path)
283288
.header(MITHRIL_ORIGIN_TAG_HEADER, "TEST")
289+
.header(MITHRIL_CLIENT_TYPE_HEADER, "CLI")
284290
.reply(&setup_router(RouterState::new_with_origin_tag_white_list(
285291
dependency_manager.clone(),
286292
&["TEST"],
@@ -292,7 +298,7 @@ mod tests {
292298
dependency_manager
293299
.metrics_service
294300
.get_artifact_detail_cardano_database_total_served_since_startup()
295-
.get(&["TEST"])
301+
.get(&["TEST", "CLI"]),
296302
);
297303
}
298304

0 commit comments

Comments
 (0)