diff --git a/internal/configstatus/config_status.go b/internal/configstatus/config_status.go index 429a10a6..559fbdb3 100644 --- a/internal/configstatus/config_status.go +++ b/internal/configstatus/config_status.go @@ -95,6 +95,13 @@ func (status *ConfigurationStatus) IsPending() bool { return !status.Data.DataV1.PendingSince.IsZero() } +func (status *ConfigurationStatus) isPendingSinceMin() int { + if min := int(time.Since(status.Data.DataV1.PendingSince).Minutes()); min > 0 { + return min + } + return 0 +} + func (status *ConfigurationStatus) IsFromFailure() bool { status.DataLock.RLock() defer status.DataLock.RUnlock() diff --git a/internal/configstatus/configuration_abort.go b/internal/configstatus/configuration_abort.go index 36ad8f5c..ba2e6b4c 100644 --- a/internal/configstatus/configuration_abort.go +++ b/internal/configstatus/configuration_abort.go @@ -19,7 +19,6 @@ package configstatus import ( "strconv" - "time" ) type ConfigAbortValues struct { @@ -41,17 +40,20 @@ type ConfigAbortData struct { type ConfigAbortBuilder struct{} -func (*ConfigAbortBuilder) New(data *ConfigurationStatusData) ConfigAbortData { +func (*ConfigAbortBuilder) New(config *ConfigurationStatus) ConfigAbortData { + config.DataLock.RLock() + defer config.DataLock.RUnlock() + return ConfigAbortData{ MeasurementGroup: "bridge.any.configuration", Event: "bridge_config_abort", Values: ConfigSuccessValues{ - Duration: int(time.Since(data.DataV1.PendingSince).Minutes()), + Duration: config.isPendingSinceMin(), }, Dimensions: ConfigSuccessDimensions{ - ReportClick: strconv.FormatBool(data.DataV1.ReportClick), - ReportSent: strconv.FormatBool(data.DataV1.ReportSent), - ClickedLink: data.clickedLinkToString(), + ReportClick: strconv.FormatBool(config.Data.DataV1.ReportClick), + ReportSent: strconv.FormatBool(config.Data.DataV1.ReportSent), + ClickedLink: config.Data.clickedLinkToString(), }, } } diff --git a/internal/configstatus/configuration_abort_test.go b/internal/configstatus/configuration_abort_test.go index c9851b2a..c902e0ae 100644 --- a/internal/configstatus/configuration_abort_test.go +++ b/internal/configstatus/configuration_abort_test.go @@ -33,7 +33,7 @@ func TestConfigurationAbort_default(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigAbortBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_abort", req.Event) @@ -64,7 +64,7 @@ func TestConfigurationAbort_fed(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigAbortBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_abort", req.Event) diff --git a/internal/configstatus/configuration_progress.go b/internal/configstatus/configuration_progress.go index d25a6019..45ae4028 100644 --- a/internal/configstatus/configuration_progress.go +++ b/internal/configstatus/configuration_progress.go @@ -33,13 +33,16 @@ type ConfigProgressData struct { type ConfigProgressBuilder struct{} -func (*ConfigProgressBuilder) New(data *ConfigurationStatusData) ConfigProgressData { +func (*ConfigProgressBuilder) New(config *ConfigurationStatus) ConfigProgressData { + config.DataLock.RLock() + defer config.DataLock.RUnlock() + return ConfigProgressData{ MeasurementGroup: "bridge.any.configuration", Event: "bridge_config_progress", Values: ConfigProgressValues{ - NbDay: numberOfDay(time.Now(), data.DataV1.PendingSince), - NbDaySinceLast: numberOfDay(time.Now(), data.DataV1.LastProgress), + NbDay: numberOfDay(time.Now(), config.Data.DataV1.PendingSince), + NbDaySinceLast: numberOfDay(time.Now(), config.Data.DataV1.LastProgress), }, } } diff --git a/internal/configstatus/configuration_progress_test.go b/internal/configstatus/configuration_progress_test.go index e772af01..e34004c3 100644 --- a/internal/configstatus/configuration_progress_test.go +++ b/internal/configstatus/configuration_progress_test.go @@ -33,7 +33,7 @@ func TestConfigurationProgress_default(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigProgressBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_progress", req.Event) @@ -62,7 +62,7 @@ func TestConfigurationProgress_fed(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigProgressBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_progress", req.Event) diff --git a/internal/configstatus/configuration_recovery.go b/internal/configstatus/configuration_recovery.go index 850a7dfc..d8087a87 100644 --- a/internal/configstatus/configuration_recovery.go +++ b/internal/configstatus/configuration_recovery.go @@ -19,7 +19,6 @@ package configstatus import ( "strconv" - "time" ) type ConfigRecoveryValues struct { @@ -43,19 +42,22 @@ type ConfigRecoveryData struct { type ConfigRecoveryBuilder struct{} -func (*ConfigRecoveryBuilder) New(data *ConfigurationStatusData) ConfigRecoveryData { +func (*ConfigRecoveryBuilder) New(config *ConfigurationStatus) ConfigRecoveryData { + config.DataLock.RLock() + defer config.DataLock.RUnlock() + return ConfigRecoveryData{ MeasurementGroup: "bridge.any.configuration", Event: "bridge_config_recovery", Values: ConfigRecoveryValues{ - Duration: int(time.Since(data.DataV1.PendingSince).Minutes()), + Duration: config.isPendingSinceMin(), }, Dimensions: ConfigRecoveryDimensions{ - Autoconf: data.DataV1.Autoconf, - ReportClick: strconv.FormatBool(data.DataV1.ReportClick), - ReportSent: strconv.FormatBool(data.DataV1.ReportSent), - ClickedLink: data.clickedLinkToString(), - FailureDetails: data.DataV1.FailureDetails, + Autoconf: config.Data.DataV1.Autoconf, + ReportClick: strconv.FormatBool(config.Data.DataV1.ReportClick), + ReportSent: strconv.FormatBool(config.Data.DataV1.ReportSent), + ClickedLink: config.Data.clickedLinkToString(), + FailureDetails: config.Data.DataV1.FailureDetails, }, } } diff --git a/internal/configstatus/configuration_recovery_test.go b/internal/configstatus/configuration_recovery_test.go index c05ac32a..ab09ccb1 100644 --- a/internal/configstatus/configuration_recovery_test.go +++ b/internal/configstatus/configuration_recovery_test.go @@ -33,7 +33,7 @@ func TestConfigurationRecovery_default(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigRecoveryBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_recovery", req.Event) @@ -66,7 +66,7 @@ func TestConfigurationRecovery_fed(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigRecoveryBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_recovery", req.Event) diff --git a/internal/configstatus/configuration_success.go b/internal/configstatus/configuration_success.go index 84c421e1..4c5b1aac 100644 --- a/internal/configstatus/configuration_success.go +++ b/internal/configstatus/configuration_success.go @@ -19,7 +19,6 @@ package configstatus import ( "strconv" - "time" ) type ConfigSuccessValues struct { @@ -42,18 +41,21 @@ type ConfigSuccessData struct { type ConfigSuccessBuilder struct{} -func (*ConfigSuccessBuilder) New(data *ConfigurationStatusData) ConfigSuccessData { +func (*ConfigSuccessBuilder) New(config *ConfigurationStatus) ConfigSuccessData { + config.DataLock.RLock() + defer config.DataLock.RUnlock() + return ConfigSuccessData{ MeasurementGroup: "bridge.any.configuration", Event: "bridge_config_success", Values: ConfigSuccessValues{ - Duration: int(time.Since(data.DataV1.PendingSince).Minutes()), + Duration: config.isPendingSinceMin(), }, Dimensions: ConfigSuccessDimensions{ - Autoconf: data.DataV1.Autoconf, - ReportClick: strconv.FormatBool(data.DataV1.ReportClick), - ReportSent: strconv.FormatBool(data.DataV1.ReportSent), - ClickedLink: data.clickedLinkToString(), + Autoconf: config.Data.DataV1.Autoconf, + ReportClick: strconv.FormatBool(config.Data.DataV1.ReportClick), + ReportSent: strconv.FormatBool(config.Data.DataV1.ReportSent), + ClickedLink: config.Data.clickedLinkToString(), }, } } diff --git a/internal/configstatus/configuration_success_test.go b/internal/configstatus/configuration_success_test.go index 9f98990f..9d12ac58 100644 --- a/internal/configstatus/configuration_success_test.go +++ b/internal/configstatus/configuration_success_test.go @@ -33,7 +33,7 @@ func TestConfigurationSuccess_default(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigSuccessBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_success", req.Event) @@ -65,7 +65,7 @@ func TestConfigurationSuccess_fed(t *testing.T) { require.NoError(t, err) var builder = configstatus.ConfigSuccessBuilder{} - req := builder.New(config.Data) + req := builder.New(config) require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) require.Equal(t, "bridge_config_success", req.Event) diff --git a/internal/user/config_status.go b/internal/user/config_status.go index 1b3be672..935fa6a4 100644 --- a/internal/user/config_status.go +++ b/internal/user/config_status.go @@ -38,7 +38,7 @@ func (user *User) SendConfigStatusSuccess(ctx context.Context) { } var builder configstatus.ConfigSuccessBuilder - success := builder.New(user.configStatus.Data) + success := builder.New(user.configStatus) data, err := json.Marshal(success) if err != nil { if err := user.reporter.ReportMessageWithContext("Cannot parse config_success data.", reporter.Context{ @@ -69,7 +69,7 @@ func (user *User) SendConfigStatusAbort(ctx context.Context, withTelemetry bool) return } var builder configstatus.ConfigAbortBuilder - abort := builder.New(user.configStatus.Data) + abort := builder.New(user.configStatus) data, err := json.Marshal(abort) if err != nil { if err := user.reporter.ReportMessageWithContext("Cannot parse config_abort data.", reporter.Context{ @@ -98,7 +98,7 @@ func (user *User) SendConfigStatusRecovery(ctx context.Context) { } var builder configstatus.ConfigRecoveryBuilder - success := builder.New(user.configStatus.Data) + success := builder.New(user.configStatus) data, err := json.Marshal(success) if err != nil { if err := user.reporter.ReportMessageWithContext("Cannot parse config_recovery data.", reporter.Context{ @@ -125,7 +125,7 @@ func (user *User) SendConfigStatusProgress(ctx context.Context) { return } var builder configstatus.ConfigProgressBuilder - progress := builder.New(user.configStatus.Data) + progress := builder.New(user.configStatus) if progress.Values.NbDay == 0 { return }