diff --git a/internal/bridge/bridge.go b/internal/bridge/bridge.go index 32024b0f..e9cadbb4 100644 --- a/internal/bridge/bridge.go +++ b/internal/bridge/bridge.go @@ -573,7 +573,7 @@ func (bridge *Bridge) Repair() { wg.Add(1) go func(userID string) { defer wg.Done() - if err = bridgeUser.ResyncIMAP(); err != nil { + if err = bridgeUser.TriggerRepair(); err != nil { logPkg.WithError(err).Error("Failed re-syncing IMAP for userID", userID) } }(userID) diff --git a/internal/telemetry/repair.go b/internal/telemetry/repair.go new file mode 100644 index 00000000..0da58e47 --- /dev/null +++ b/internal/telemetry/repair.go @@ -0,0 +1,43 @@ +// Copyright (c) 2024 Proton AG +// +// This file is part of Proton Mail Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +package telemetry + +type RepairData struct { + MeasurementGroup string + Event string + Values map[string]string + Dimensions map[string]string +} + +func NewRepairTriggerData() RepairData { + return RepairData{ + MeasurementGroup: "bridge.any.repair", + Event: "repair_trigger", + Values: map[string]string{}, + Dimensions: map[string]string{}, + } +} + +func NewRepairDeferredTriggerData() RepairData { + return RepairData{ + MeasurementGroup: "bridge.any.repair", + Event: "repair_deferred_trigger", + Values: map[string]string{}, + Dimensions: map[string]string{}, + } +} diff --git a/internal/user/repair_telemetry.go b/internal/user/repair_telemetry.go new file mode 100644 index 00000000..002f52f7 --- /dev/null +++ b/internal/user/repair_telemetry.go @@ -0,0 +1,65 @@ +// Copyright (c) 2024 Proton AG +// +// This file is part of Proton Mail Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +package user + +import ( + "context" + "encoding/json" + + "github.com/ProtonMail/proton-bridge/v3/internal/telemetry" +) + +func (user *User) SendRepairTrigger(ctx context.Context) { + if !user.IsTelemetryEnabled(ctx) { + return + } + + triggerData := telemetry.NewRepairTriggerData() + data, err := json.Marshal(triggerData) + if err != nil { + user.log.WithError(err).Error("Failed to parse repair trigger data.") + return + } + + if err := user.SendTelemetry(ctx, data); err != nil { + user.log.WithError(err).Error("Failed to send repair trigger event.") + return + } + + user.log.Info("Repair trigger event successfully sent.") +} + +func (user *User) SendRepairDeferredTrigger(ctx context.Context) { + if !user.IsTelemetryEnabled(ctx) { + return + } + + deferredTriggerData := telemetry.NewRepairDeferredTriggerData() + data, err := json.Marshal(deferredTriggerData) + if err != nil { + user.log.WithError(err).Error("Failed to parse deferred repair trigger data.") + return + } + + if err := user.SendTelemetry(ctx, data); err != nil { + user.log.WithError(err).Error("Failed to send deferred repair trigger event.") + return + } + + user.log.Info("Deferred repair trigger event successfully sent.") +} diff --git a/internal/user/user.go b/internal/user/user.go index a93a0776..40784655 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -727,12 +727,18 @@ func (user *User) VerifyResyncAndExecute() { user.log.WithError(err).Error("Failed to disable re-sync flag in user vault. UserID:", user.ID()) } - if err := user.ResyncIMAP(); err != nil { + user.SendRepairDeferredTrigger(context.Background()) + if err := user.resyncIMAP(); err != nil { user.log.WithError(err).Error("Failed re-syncing IMAP for userID", user.ID()) } } } -func (user *User) ResyncIMAP() error { +func (user *User) TriggerRepair() error { + user.SendRepairTrigger(context.Background()) + return user.resyncIMAP() +} + +func (user *User) resyncIMAP() error { return user.imapService.Resync(context.Background()) }