Skip to content

Commit c60f684

Browse files
author
Clément Turmel
committed
feat(aggregator): add a view to retrieve client_type metric
1 parent 9e563ac commit c60f684

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

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: 67 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(
@@ -136,6 +156,29 @@ mod tests {
136156
let _event = persister.persist(message).unwrap();
137157
}
138158

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(),
176+
metric_date.into(),
177+
);
178+
179+
let _event = persister.persist(message).unwrap();
180+
}
181+
139182
/// Insert a metric event with the old format (without origin) in the database.
140183
fn insert_metric_event(
141184
persister: &EventPersister,
@@ -301,6 +344,30 @@ mod tests {
301344
assert!(result.contains(&("2024-10-30", "metric_1", "ORIGIN_B", 7)));
302345
}
303346

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+
304371
#[test]
305372
fn sum_metric_per_day_and_origin_on_old_event() {
306373
fn tuple_with_str(t: &(String, String, String, i64)) -> (&str, &str, &str, i64) {

0 commit comments

Comments
 (0)