RecordTelemetryStatus records the telemetry status in the database. If the status changed from enabled to disabled, returns a snapshot to be sent to the telemetry server.
( //nolint:revive ctx context.Context, logger slog.Logger, db database.Store, telemetryEnabled bool, )
| 201 | // If the status changed from enabled to disabled, returns a snapshot to |
| 202 | // be sent to the telemetry server. |
| 203 | func RecordTelemetryStatus( //nolint:revive |
| 204 | ctx context.Context, |
| 205 | logger slog.Logger, |
| 206 | db database.Store, |
| 207 | telemetryEnabled bool, |
| 208 | ) (*Snapshot, error) { |
| 209 | item, err := db.GetTelemetryItem(ctx, string(TelemetryItemKeyTelemetryEnabled)) |
| 210 | if err != nil && !errors.Is(err, sql.ErrNoRows) { |
| 211 | return nil, xerrors.Errorf("get telemetry enabled: %w", err) |
| 212 | } |
| 213 | var recordedTelemetryEnabled *bool |
| 214 | if !errors.Is(err, sql.ErrNoRows) { |
| 215 | value, err := strconv.ParseBool(item.Value) |
| 216 | if err != nil { |
| 217 | logger.Debug(ctx, "parse telemetry enabled", slog.Error(err)) |
| 218 | } |
| 219 | // If ParseBool fails, value will default to false. |
| 220 | // This may happen if an admin manually edits the telemetry item |
| 221 | // in the database. |
| 222 | recordedTelemetryEnabled = &value |
| 223 | } |
| 224 | |
| 225 | if err := db.UpsertTelemetryItem(ctx, database.UpsertTelemetryItemParams{ |
| 226 | Key: string(TelemetryItemKeyTelemetryEnabled), |
| 227 | Value: strconv.FormatBool(telemetryEnabled), |
| 228 | }); err != nil { |
| 229 | return nil, xerrors.Errorf("upsert telemetry enabled: %w", err) |
| 230 | } |
| 231 | |
| 232 | shouldReport := ShouldReportTelemetryDisabled(recordedTelemetryEnabled, telemetryEnabled) |
| 233 | if !shouldReport { |
| 234 | return nil, nil //nolint:nilnil |
| 235 | } |
| 236 | // If any of the following calls fail, we will never report that telemetry changed |
| 237 | // from enabled to disabled. This is okay. We only want to ping the telemetry server |
| 238 | // once, and never again. If that attempt fails, so be it. |
| 239 | item, err = db.GetTelemetryItem(ctx, string(TelemetryItemKeyTelemetryEnabled)) |
| 240 | if err != nil { |
| 241 | return nil, xerrors.Errorf("get telemetry enabled after upsert: %w", err) |
| 242 | } |
| 243 | return &Snapshot{ |
| 244 | TelemetryItems: []TelemetryItem{ |
| 245 | ConvertTelemetryItem(item), |
| 246 | }, |
| 247 | }, nil |
| 248 | } |
| 249 | |
| 250 | func (r *remoteReporter) runSnapshotter() { |
| 251 | telemetryDisabledSnapshot, err := RecordTelemetryStatus(r.ctx, r.options.Logger, r.options.Database, r.Enabled()) |