Skip to content

Commit 953d322

Browse files
committed
feat: adds 4444s stats and graphing
1 parent cc0140a commit 953d322

File tree

7 files changed

+142
-6
lines changed

7 files changed

+142
-6
lines changed

entity/src/audit_stats.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub struct Model {
1616
pub success_rate_latest: f32,
1717
pub success_rate_random: f32,
1818
pub success_rate_oldest: f32,
19+
pub success_rate_four_fours: f32,
1920
pub success_rate_all_headers: f32,
2021
pub success_rate_all_bodies: f32,
2122
pub success_rate_all_receipts: f32,
@@ -25,6 +26,9 @@ pub struct Model {
2526
pub success_rate_random_headers: f32,
2627
pub success_rate_random_bodies: f32,
2728
pub success_rate_random_receipts: f32,
29+
pub success_rate_four_fours_headers: f32,
30+
pub success_rate_four_fours_bodies: f32,
31+
pub success_rate_four_fours_receipts: f32,
2832
}
2933

3034
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
@@ -40,6 +44,7 @@ pub async fn create(
4044
success_rate_latest: f32,
4145
success_rate_random: f32,
4246
success_rate_oldest: f32,
47+
success_rate_four_fours: f32,
4348
success_rate_all_headers: f32,
4449
success_rate_all_bodies: f32,
4550
success_rate_all_receipts: f32,
@@ -49,6 +54,9 @@ pub async fn create(
4954
success_rate_random_headers: f32,
5055
success_rate_random_bodies: f32,
5156
success_rate_random_receipts: f32,
57+
success_rate_four_fours_headers: f32,
58+
success_rate_four_fours_bodies: f32,
59+
success_rate_four_fours_receipts: f32,
5260
conn: &DatabaseConnection,
5361
) -> Result<Model> {
5462
let audit_stats = ActiveModel {
@@ -59,6 +67,7 @@ pub async fn create(
5967
success_rate_latest: Set(success_rate_latest),
6068
success_rate_random: Set(success_rate_random),
6169
success_rate_oldest: Set(success_rate_oldest),
70+
success_rate_four_fours: Set(success_rate_four_fours),
6271
success_rate_all_headers: Set(success_rate_all_headers),
6372
success_rate_all_bodies: Set(success_rate_all_bodies),
6473
success_rate_all_receipts: Set(success_rate_all_receipts),
@@ -68,6 +77,9 @@ pub async fn create(
6877
success_rate_random_headers: Set(success_rate_random_headers),
6978
success_rate_random_bodies: Set(success_rate_random_bodies),
7079
success_rate_random_receipts: Set(success_rate_random_receipts),
80+
success_rate_four_fours_headers: Set(success_rate_four_fours_headers),
81+
success_rate_four_fours_bodies: Set(success_rate_four_fours_bodies),
82+
success_rate_four_fours_receipts: Set(success_rate_four_fours_receipts),
7183
};
7284
Ok(audit_stats.insert(conn).await?)
7385
}

glados-audit/src/stats.rs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use glados_core::stats::{
66
};
77
use sea_orm::{DatabaseConnection, DbErr};
88
use tokio::time::{interval, Duration};
9-
use tracing::{debug, error, info};
9+
use tracing::{debug, error};
1010

1111
/// Loops indefinitely, periodically recording audit stats to the database.
1212
pub async fn periodically_record_stats(period: Duration, conn: DatabaseConnection) -> ! {
@@ -17,7 +17,6 @@ pub async fn periodically_record_stats(period: Duration, conn: DatabaseConnectio
1717
record_current_stats(&conn).await.unwrap_or_else(|e| {
1818
error!("failed to record audit stats: {e}");
1919
});
20-
info!("Successfully recorded audit stats");
2120
interval.tick().await;
2221
}
2322
}
@@ -31,6 +30,7 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
3130
latest,
3231
random,
3332
oldest,
33+
fourfours,
3434
all_headers,
3535
all_bodies,
3636
all_receipts,
@@ -40,6 +40,9 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
4040
random_headers,
4141
random_bodies,
4242
random_receipts,
43+
fourfours_headers,
44+
fourfours_bodies,
45+
fourfours_receipts,
4346
) = tokio::join!(
4447
get_audit_stats(
4548
filter_audits(AuditFilters {
@@ -77,6 +80,15 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
7780
Period::Hour,
7881
conn
7982
),
83+
get_audit_stats(
84+
filter_audits(AuditFilters {
85+
strategy: StrategyFilter::FourFours,
86+
content_type: ContentTypeFilter::All,
87+
success: SuccessFilter::All
88+
}),
89+
Period::Hour,
90+
conn
91+
),
8092
get_audit_stats(
8193
filter_audits(AuditFilters {
8294
strategy: StrategyFilter::All,
@@ -157,6 +169,33 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
157169
}),
158170
Period::Hour,
159171
conn
172+
),
173+
get_audit_stats(
174+
filter_audits(AuditFilters {
175+
strategy: StrategyFilter::FourFours,
176+
content_type: ContentTypeFilter::Headers,
177+
success: SuccessFilter::All
178+
}),
179+
Period::Hour,
180+
conn
181+
),
182+
get_audit_stats(
183+
filter_audits(AuditFilters {
184+
strategy: StrategyFilter::FourFours,
185+
content_type: ContentTypeFilter::Bodies,
186+
success: SuccessFilter::All
187+
}),
188+
Period::Hour,
189+
conn
190+
),
191+
get_audit_stats(
192+
filter_audits(AuditFilters {
193+
strategy: StrategyFilter::FourFours,
194+
content_type: ContentTypeFilter::Receipts,
195+
success: SuccessFilter::All
196+
}),
197+
Period::Hour,
198+
conn
160199
)
161200
);
162201

@@ -165,6 +204,7 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
165204
let success_rate_latest = latest?.pass_percent;
166205
let success_rate_random = random?.pass_percent;
167206
let success_rate_oldest = oldest?.pass_percent;
207+
let success_rate_fourfours = fourfours?.pass_percent;
168208
let success_rate_all_headers = all_headers?.pass_percent;
169209
let success_rate_all_bodies = all_bodies?.pass_percent;
170210
let success_rate_all_receipts = all_receipts?.pass_percent;
@@ -174,6 +214,9 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
174214
let success_rate_random_headers = random_headers?.pass_percent;
175215
let success_rate_random_bodies = random_bodies?.pass_percent;
176216
let success_rate_random_receipts = random_receipts?.pass_percent;
217+
let success_rate_fourfours_headers = fourfours_headers?.pass_percent;
218+
let success_rate_fourfours_bodies = fourfours_bodies?.pass_percent;
219+
let success_rate_fourfours_receipts = fourfours_receipts?.pass_percent;
177220

178221
// Record the values.
179222
match audit_stats::create(
@@ -183,6 +226,7 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
183226
success_rate_latest,
184227
success_rate_random,
185228
success_rate_oldest,
229+
success_rate_fourfours,
186230
success_rate_all_headers,
187231
success_rate_all_bodies,
188232
success_rate_all_receipts,
@@ -192,6 +236,9 @@ async fn record_current_stats(conn: &DatabaseConnection) -> Result<(), DbErr> {
192236
success_rate_random_headers,
193237
success_rate_random_bodies,
194238
success_rate_random_receipts,
239+
success_rate_fourfours_headers,
240+
success_rate_fourfours_bodies,
241+
success_rate_fourfours_receipts,
195242
conn,
196243
)
197244
.await

glados-core/src/stats.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ pub fn filter_audits(filters: AuditFilters) -> Select<content_audit::Entity> {
3131
StrategyFilter::Oldest => audits.filter(
3232
content_audit::Column::StrategyUsed.eq(SelectionStrategy::SelectOldestUnaudited),
3333
),
34+
StrategyFilter::FourFours => {
35+
audits.filter(content_audit::Column::StrategyUsed.eq(SelectionStrategy::FourFours))
36+
}
3437
};
3538
// Success filters
3639
let audits = match filters.success {
@@ -200,6 +203,7 @@ pub enum StrategyFilter {
200203
Random,
201204
Latest,
202205
Oldest,
206+
FourFours,
203207
}
204208

205209
#[derive(Deserialize)]

glados-web/assets/js/stats_history.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ function createMultiLineChart(height, width, dataSets) {
9898
}
9999

100100
// Select all '.legend' group elements and click on all but the first three
101+
let selectedIndexes = [0, 4, 14, 15, 16]
101102
svg.selectAll(".legend")
102-
.each(function(d, i) {
103-
if (i >= 3) { // Skip the first three
103+
.each(function (d, i) {
104+
if (!selectedIndexes.includes(i)) { // Skip the first three
104105
dispatchClick(this);
105106
}
106107
});
@@ -113,7 +114,11 @@ function createMultiLineChart(height, width, dataSets) {
113114
.attr("fill", (d, i) => colors[i % colors.length]);
114115

115116
// Add text to the legend.
116-
const labels = ["All", "Latest", "Random", "Oldest", "All Headers", "All Bodies", "All Receipts", "Latest Headers", "Latest Bodies", "Latest Receipts", "Random Headers", "Random Bodies", "Random Receipts"];
117+
const labels = ["All", "Latest", "Random", "Oldest", "4444s",
118+
"All Headers", "All Bodies", "All Receipts",
119+
"Latest Headers", "Latest Bodies", "Latest Receipts",
120+
"Random Headers", "Random Bodies", "Random Receipts",
121+
"4444s Headers", "4444s Bodies", "4444s Receipts"];
117122
legend.append("text")
118123
.attr("x", -24)
119124
.attr("y", 9)
@@ -131,6 +136,7 @@ function convertDataForChart(data) {
131136
'success_rate_latest',
132137
'success_rate_random',
133138
'success_rate_oldest',
139+
'success_rate_four_fourss',
134140
'success_rate_all_headers',
135141
'success_rate_all_bodies',
136142
'success_rate_all_receipts',
@@ -140,6 +146,9 @@ function convertDataForChart(data) {
140146
'success_rate_random_headers',
141147
'success_rate_random_bodies',
142148
'success_rate_random_receipts',
149+
'success_rate_four_fours_headers',
150+
'success_rate_four_fours_bodies',
151+
'success_rate_four_fours_receipts'
143152
];
144153

145154
return successRateKeys.map(key =>

glados-web/templates/audit_dashboard.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ <h1 class="header text-center">Audit Dashboard</h1>
2929
type="button">Random</button>
3030
<button id="oldest-button" filter="Oldest" class="btn btn-outline-secondary" type="button">Oldest
3131
Unaudited</button>
32+
<button id="fourfours-button" filter="FourFours" class="btn btn-outline-secondary"
33+
type="button">4444s</button>
3234
</div>
3335
<div id="success-buttons" class="btn-group mx-1 " role="group">
3436
<button id="all-success-button" filter="All" class="btn btn-outline-secondary"
@@ -41,7 +43,7 @@ <h1 class="header text-center">Audit Dashboard</h1>
4143
</div>
4244
</div>
4345
</div>
44-
<br/>
46+
<br />
4547
<div id="audit-table"></div>
4648
<style>
4749
.btn-outline-secondary.active {

migration/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ mod m20230511_104830_create_content_audit;
99
mod m20230511_104838_create_execution_metadata;
1010
mod m20230511_104937_create_key_value;
1111
mod m20231107_004843_create_audit_stats;
12+
mod m20240213_190221_add_fourfours_stats;
1213

1314
pub struct Migrator;
1415

@@ -25,6 +26,7 @@ impl MigratorTrait for Migrator {
2526
Box::new(m20230511_104937_create_key_value::Migration),
2627
Box::new(m20230508_111707_create_census_tables::Migration),
2728
Box::new(m20231107_004843_create_audit_stats::Migration),
29+
Box::new(m20240213_190221_add_fourfours_stats::Migration),
2830
]
2931
}
3032
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use sea_orm_migration::prelude::*;
2+
3+
#[derive(DeriveMigrationName)]
4+
pub struct Migration;
5+
6+
#[async_trait::async_trait]
7+
impl MigrationTrait for Migration {
8+
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
9+
manager
10+
.alter_table(
11+
Table::alter()
12+
.table(AuditStats::Table)
13+
.add_column_if_not_exists(
14+
ColumnDef::new(AuditStats::SuccessRateFourFours)
15+
.float()
16+
.default(0.0),
17+
)
18+
.add_column_if_not_exists(
19+
ColumnDef::new(AuditStats::SuccessRateFourFoursHeaders)
20+
.float()
21+
.default(0.0),
22+
)
23+
.add_column_if_not_exists(
24+
ColumnDef::new(AuditStats::SuccessRateFourFoursBodies)
25+
.float()
26+
.default(0.0),
27+
)
28+
.add_column_if_not_exists(
29+
ColumnDef::new(AuditStats::SuccessRateFourFoursReceipts)
30+
.float()
31+
.default(0.0),
32+
)
33+
.to_owned(),
34+
)
35+
.await
36+
}
37+
38+
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
39+
manager
40+
.alter_table(
41+
Table::alter()
42+
.table(AuditStats::Table)
43+
.drop_column(AuditStats::SuccessRateFourFours)
44+
.drop_column(AuditStats::SuccessRateFourFoursHeaders)
45+
.drop_column(AuditStats::SuccessRateFourFoursBodies)
46+
.drop_column(AuditStats::SuccessRateFourFoursReceipts)
47+
.to_owned(),
48+
)
49+
.await
50+
}
51+
}
52+
53+
#[derive(Iden)]
54+
enum AuditStats {
55+
Table,
56+
SuccessRateFourFours,
57+
SuccessRateFourFoursHeaders,
58+
SuccessRateFourFoursBodies,
59+
SuccessRateFourFoursReceipts,
60+
}

0 commit comments

Comments
 (0)