diff --git a/internal/cli/list/list.go b/internal/cli/list/list.go index fdf93ff..304da18 100644 --- a/internal/cli/list/list.go +++ b/internal/cli/list/list.go @@ -27,9 +27,27 @@ func init() { log.WithError(err).Error("failed to list measurements") return err } + + msmtSummary := output.MeasurementSummaryData{ + TotalCount: 0, + AnomalyCount: 0, + DataUsageUp: 0, + DataUsageDown: 0, + } for _, msmt := range measurements { + // FIXME this logic should be adjusted for test groups that have many + // measurements in them + if msmtSummary.DataUsageUp == 0 { + msmtSummary.DataUsageUp = msmt.DataUsageUp + msmtSummary.DataUsageDown = msmt.DataUsageDown + } + if msmt.IsAnomaly.Bool == true { + msmtSummary.AnomalyCount++ + } + msmtSummary.TotalCount++ output.MeasurementItem(msmt) } + output.MeasurementSummary(msmtSummary) } else { doneResults, incompleteResults, err := database.ListResults(ctx.DB) if err != nil { diff --git a/internal/database/actions.go b/internal/database/actions.go index 88334b5..7b5ff68 100644 --- a/internal/database/actions.go +++ b/internal/database/actions.go @@ -19,8 +19,14 @@ func ListMeasurements(sess sqlbuilder.Database, resultID int64) ([]MeasurementUR req := sess.Select( "measurements.id as msmt_tbl_id", + "measurements.is_done as measurement_is_done", + "measurements.start_time as measurement_start_time", + "measurements.runtime as measurement_runtime", "networks.id as network_id", "results.id as result_id", + "results.start_time as result_start_time", + "results.is_done as result_is_done", + "results.runtime as result_runtime", "urls.id as url_id", db.Raw("networks.*"), db.Raw("urls.*"), diff --git a/internal/database/models.go b/internal/database/models.go index 6d188aa..9fb103d 100644 --- a/internal/database/models.go +++ b/internal/database/models.go @@ -21,13 +21,19 @@ type ResultNetwork struct { // MeasurementURLNetwork is used for the JOIN between Measurement and URL type MeasurementURLNetwork struct { - Measurement `db:",inline"` - MsmtTblID int64 `db:"msmt_tbl_id"` - Network `db:",inline"` - NetworkID int64 `db:"network_id"` - Result `db:",inline"` - ResultID int64 `db:"result_id"` - URL `db:",inline"` + Measurement `db:",inline"` + MeasurementStartTime time.Time `db:"measurement_start_time"` + MeasurementIsDone bool `db:"measurement_is_done"` + MeasurementRuntime float64 `db:"measurement_runtime"` + MsmtTblID int64 `db:"msmt_tbl_id"` + Network `db:",inline"` + NetworkID int64 `db:"network_id"` + Result `db:",inline"` + ResultID int64 `db:"result_id"` + ResultRuntime float64 `db:"result_runtime"` + ResultStartTime time.Time `db:"result_start_time"` + ResultIsDone bool `db:"result_is_done"` + URL `db:",inline"` } // Network represents a network tested by the user diff --git a/internal/output/output.go b/internal/output/output.go index 2c92698..466b57a 100644 --- a/internal/output/output.go +++ b/internal/output/output.go @@ -20,6 +20,23 @@ func Progress(key string, perc float64, msg string) { }).Info(msg) } +type MeasurementSummaryData struct { + TotalCount int64 + AnomalyCount int64 + DataUsageUp int64 + DataUsageDown int64 +} + +func MeasurementSummary(msmt MeasurementSummaryData) { + log.WithFields(log.Fields{ + "type": "measurement_summary", + "total_count": msmt.TotalCount, + "anomaly_count": msmt.AnomalyCount, + "data_usage_down": msmt.DataUsageDown, + "data_usage_up": msmt.DataUsageUp, + }).Info("measurement summary") +} + // MeasurementItem logs a progress type event func MeasurementItem(msmt database.MeasurementURLNetwork) { log.WithFields(log.Fields{ @@ -27,12 +44,12 @@ func MeasurementItem(msmt database.MeasurementURLNetwork) { "id": msmt.MsmtTblID, "test_name": msmt.TestName, "test_group_name": msmt.Result.TestGroupName, - "start_time": msmt.Measurement.StartTime, + "start_time": msmt.MeasurementStartTime, "test_keys": msmt.TestKeys, "probe_cc": msmt.Network.CountryCode, "network_name": msmt.Network.NetworkName, "asn": msmt.Network.ASN, - "runtime": msmt.Measurement.Runtime, + "runtime": msmt.MeasurementRuntime, "url": msmt.URL.URL.String, "url_category_code": msmt.URL.CategoryCode.String, "url_country_code": msmt.URL.CountryCode.String, @@ -42,7 +59,7 @@ func MeasurementItem(msmt database.MeasurementURLNetwork) { "upload_failure_msg": msmt.UploadFailureMsg.String, "is_failed": msmt.IsFailed, "failure_msg": msmt.FailureMsg.String, - "is_done": msmt.Measurement.IsDone, + "is_done": msmt.MeasurementIsDone, "report_file_path": msmt.ReportFilePath, }).Info("measurement") }