From 5e33fcf5d6913d729e146361d136163166c5018f Mon Sep 17 00:00:00 2001 From: "J.C. Jones" Date: Wed, 27 Aug 2025 10:11:57 -0700 Subject: [PATCH 1/3] Wire up the "duplicate extension" metric for report upload failures. This is the counterpart to https://github.com/divviup/janus/pull/3999 Fixes #1884 --- app/src/ApiClient.ts | 4 +- app/src/tasks/TaskDetail/Metrics.tsx | 4 ++ client/src/task.rs | 1 + documentation/openapi.yml | 2 + migration/src/lib.rs | 2 + ..._170000_add_duplicate_extension_counter.rs | 39 +++++++++++++++++++ package-lock.json | 6 +++ src/api_mocks/aggregator_api.rs | 1 + src/clients/aggregator_client/api_types.rs | 3 ++ src/entity/task/model.rs | 7 ++++ src/entity/task/provisionable_task.rs | 1 + test-support/src/fixtures.rs | 1 + 12 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 migration/src/m20250827_170000_add_duplicate_extension_counter.rs create mode 100644 package-lock.json diff --git a/app/src/ApiClient.ts b/app/src/ApiClient.ts index e30405770..1d09244d4 100644 --- a/app/src/ApiClient.ts +++ b/app/src/ApiClient.ts @@ -82,6 +82,7 @@ export interface Task { report_counter_success: number; report_counter_too_early: number; report_counter_task_expired: number; + report_counter_duplicate_extension: number; aggregation_job_counter_success: number; aggregation_job_counter_helper_batch_collected: number; aggregation_job_counter_helper_report_replayed: number; @@ -92,6 +93,7 @@ export interface Task { aggregation_job_counter_helper_task_expired: number; aggregation_job_counter_helper_invalid_message: number; aggregation_job_counter_helper_report_too_early: number; + } export interface CollectorAuthToken { @@ -115,7 +117,7 @@ export type NewTask = Omit< | "report_counter_success" | "report_counter_too_early" | "report_counter_task_expired" - | "report_counter_task_expired" + | "report_counter_duplicate_extension" > & { vdaf: { type: "sum" | "count" | "histogram"; diff --git a/app/src/tasks/TaskDetail/Metrics.tsx b/app/src/tasks/TaskDetail/Metrics.tsx index 017810784..75c86351d 100644 --- a/app/src/tasks/TaskDetail/Metrics.tsx +++ b/app/src/tasks/TaskDetail/Metrics.tsx @@ -69,6 +69,10 @@ function UploadMetrics({ task }: { task: Promise }) { name="Task Expired Failure" counter={task.report_counter_task_expired} /> + )} diff --git a/client/src/task.rs b/client/src/task.rs index 97a267068..3d48c7f2a 100644 --- a/client/src/task.rs +++ b/client/src/task.rs @@ -38,6 +38,7 @@ pub struct Task { pub report_counter_success: i64, pub report_counter_too_early: i64, pub report_counter_task_expired: i64, + pub report_counter_duplicate_extension: i64, #[serde(default)] pub aggregation_job_counter_success: i64, diff --git a/documentation/openapi.yml b/documentation/openapi.yml index c6fa8b2a9..ac99ce1c3 100644 --- a/documentation/openapi.yml +++ b/documentation/openapi.yml @@ -739,6 +739,8 @@ components: type: number report_counter_task_expired: type: number + report_counter_duplicate_extension: + type: number Membership: type: object properties: diff --git a/migration/src/lib.rs b/migration/src/lib.rs index 3971eede4..33d16bb90 100644 --- a/migration/src/lib.rs +++ b/migration/src/lib.rs @@ -26,6 +26,7 @@ mod m20240214_215101_upload_metrics; mod m20240411_195358_time_bucketed_fixed_size; mod m20240416_172920_task_deleted_at; mod m20250801_164739_aggregation_job_metrics; +mod m20250827_170000_add_duplicate_extension_counter; pub struct Migrator; @@ -59,6 +60,7 @@ impl MigratorTrait for Migrator { Box::new(m20240411_195358_time_bucketed_fixed_size::Migration), Box::new(m20240416_172920_task_deleted_at::Migration), Box::new(m20250801_164739_aggregation_job_metrics::Migration), + Box::new(m20250827_170000_add_duplicate_extension_counter::Migration), ] } } diff --git a/migration/src/m20250827_170000_add_duplicate_extension_counter.rs b/migration/src/m20250827_170000_add_duplicate_extension_counter.rs new file mode 100644 index 000000000..dbe60597e --- /dev/null +++ b/migration/src/m20250827_170000_add_duplicate_extension_counter.rs @@ -0,0 +1,39 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Task::Table) + .add_column( + ColumnDef::new(Task::ReportCounterDuplicateExtension) + .big_integer() + .default(0), + ) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Task::Table) + .drop_column(Task::ReportCounterDuplicateExtension) + .to_owned(), + ) + .await + } +} + +#[derive(Iden)] +enum Task { + Table, + ReportCounterDuplicateExtension, +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..8316983a9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "divviup-api", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/src/api_mocks/aggregator_api.rs b/src/api_mocks/aggregator_api.rs index 948c603f7..fe25761ad 100644 --- a/src/api_mocks/aggregator_api.rs +++ b/src/api_mocks/aggregator_api.rs @@ -77,6 +77,7 @@ async fn get_task_upload_metrics(_: &mut Conn, (): ()) -> Json for TaskUploadMetrics { @@ -359,6 +361,7 @@ impl PartialEq for TaskUploadMetrics { && other.report_counter_success == self.report_success as i64 && other.report_counter_too_early == self.report_too_early as i64 && other.report_counter_task_expired == self.task_expired as i64 + && other.report_counter_duplicate_extension == self.report_duplicate_extension as i64 } } diff --git a/src/entity/task/model.rs b/src/entity/task/model.rs index a656a9b46..c02b01742 100644 --- a/src/entity/task/model.rs +++ b/src/entity/task/model.rs @@ -61,6 +61,7 @@ pub struct Model { pub report_counter_success: i64, pub report_counter_too_early: i64, pub report_counter_task_expired: i64, + pub report_counter_duplicate_extension: i64, // Aggregation job metrics pub aggregation_job_counter_success: i64, @@ -102,6 +103,12 @@ impl Model { ActiveValue::Set(metrics.report_too_early.try_into().unwrap_or(i64::MAX)); task.report_counter_task_expired = ActiveValue::Set(metrics.task_expired.try_into().unwrap_or(i64::MAX)); + task.report_counter_duplicate_extension = ActiveValue::Set( + metrics + .report_duplicate_extension + .try_into() + .unwrap_or(i64::MAX), + ); task.updated_at = ActiveValue::Set(OffsetDateTime::now_utc()); task.update(&db).await } diff --git a/src/entity/task/provisionable_task.rs b/src/entity/task/provisionable_task.rs index 36f5980de..da0efa546 100644 --- a/src/entity/task/provisionable_task.rs +++ b/src/entity/task/provisionable_task.rs @@ -112,6 +112,7 @@ impl ProvisionableTask { report_counter_success: 0, report_counter_too_early: 0, report_counter_task_expired: 0, + report_counter_duplicate_extension: 0, aggregation_job_counter_success: 0, aggregation_job_counter_helper_hpke_decrypt_failure: 0, aggregation_job_counter_helper_batch_collected: 0, diff --git a/test-support/src/fixtures.rs b/test-support/src/fixtures.rs index d2aa487e2..d0858c331 100644 --- a/test-support/src/fixtures.rs +++ b/test-support/src/fixtures.rs @@ -133,6 +133,7 @@ pub async fn task(app: &DivviupApi, account: &Account) -> Task { report_counter_success: 0, report_counter_too_early: 0, report_counter_task_expired: 0, + report_counter_duplicate_extension: 0, aggregation_job_counter_success: 0, aggregation_job_counter_helper_hpke_decrypt_failure: 0, aggregation_job_counter_helper_batch_collected: 0, From 37502d2f63f49025655139b6905d8f99cbe1377a Mon Sep 17 00:00:00 2001 From: "J.C. Jones" Date: Wed, 27 Aug 2025 10:23:59 -0700 Subject: [PATCH 2/3] newline --- app/src/ApiClient.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/ApiClient.ts b/app/src/ApiClient.ts index 1d09244d4..aff5dd7ea 100644 --- a/app/src/ApiClient.ts +++ b/app/src/ApiClient.ts @@ -93,7 +93,6 @@ export interface Task { aggregation_job_counter_helper_task_expired: number; aggregation_job_counter_helper_invalid_message: number; aggregation_job_counter_helper_report_too_early: number; - } export interface CollectorAuthToken { From c215842faf9b0503e0b8a4857e619b091b4b79fc Mon Sep 17 00:00:00 2001 From: "J.C. Jones" Date: Wed, 27 Aug 2025 12:13:42 -0700 Subject: [PATCH 3/3] newline --- .../src/m20250827_170000_add_duplicate_extension_counter.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration/src/m20250827_170000_add_duplicate_extension_counter.rs b/migration/src/m20250827_170000_add_duplicate_extension_counter.rs index dbe60597e..6aa18c7aa 100644 --- a/migration/src/m20250827_170000_add_duplicate_extension_counter.rs +++ b/migration/src/m20250827_170000_add_duplicate_extension_counter.rs @@ -36,4 +36,4 @@ impl MigrationTrait for Migration { enum Task { Table, ReportCounterDuplicateExtension, -} \ No newline at end of file +}