Skip to content

Commit

Permalink
telemetry: Fix atomic.Pointer initialisation responsibility
Browse files Browse the repository at this point in the history
Return `atomic.pointer`, so that initialisation is not the responsibility of
another package.
  • Loading branch information
lippserd committed Oct 24, 2024
1 parent 7cf54c1 commit 95f2763
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
6 changes: 3 additions & 3 deletions cmd/icingadb/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func run() int {
// the heartbeat is not read while HA gets stuck when updating the instance table.
var heartbeat *icingaredis.Heartbeat
var ha *icingadb.HA
var telemetrySyncStats *atomic.Pointer[telemetry.SuccessfulSync]
{
rc, err := cmd.Redis(logs.GetChildLogger("redis"))
if err != nil {
Expand All @@ -116,8 +117,7 @@ func run() int {
ha = icingadb.NewHA(ctx, db, heartbeat, logs.GetChildLogger("high-availability"))

telemetryLogger := logs.GetChildLogger("telemetry")
telemetry.LastSuccessfulSync.Store(&telemetry.SuccessfulSync{})
telemetry.StartHeartbeat(ctx, rc, telemetryLogger, ha, heartbeat)
telemetrySyncStats = telemetry.StartHeartbeat(ctx, rc, telemetryLogger, ha, heartbeat)
telemetry.WriteStats(ctx, rc, telemetryLogger)
}
// Closing ha on exit ensures that this instance retracts its heartbeat
Expand Down Expand Up @@ -251,7 +251,7 @@ func run() int {
logger := logs.GetChildLogger("config-sync")

if synctx.Err() == nil {
telemetry.LastSuccessfulSync.Store(&telemetry.SuccessfulSync{
telemetrySyncStats.Store(&telemetry.SuccessfulSync{
FinishMilli: syncEnd.UnixMilli(),
DurationMilli: elapsed.Milliseconds(),
})
Expand Down
13 changes: 8 additions & 5 deletions pkg/icingaredis/telemetry/heartbeat.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,17 @@ func GetCurrentDbConnErr() (string, int64) {
// OngoingSyncStartMilli is to be updated by the main() function.
var OngoingSyncStartMilli int64

// LastSuccessfulSync is to be updated by the main() function.
var LastSuccessfulSync atomic.Pointer[SuccessfulSync]

var boolToStr = map[bool]string{false: "0", true: "1"}
var startTime = time.Now().UnixMilli()

// StartHeartbeat periodically writes heartbeats to Redis for being monitored by Icinga 2.
// It returns an atomic pointer to SuccessfulSync,
// which contains synchronisation statistics that the caller should update.
func StartHeartbeat(
ctx context.Context, client *redis.Client, logger *logging.Logger, ha ha, heartbeat *icingaredis.Heartbeat,
) {
) *atomic.Pointer[SuccessfulSync] {
var syncStats atomic.Pointer[SuccessfulSync]
syncStats.Store(&SuccessfulSync{})
goMetrics := NewGoMetrics()

const interval = time.Second
Expand All @@ -100,7 +101,7 @@ func StartHeartbeat(
heartbeat := heartbeat.LastReceived()
responsibleTsMilli, responsible, otherResponsible := ha.State()
ongoingSyncStart := atomic.LoadInt64(&OngoingSyncStartMilli)
lastSync := LastSuccessfulSync.Load()
lastSync := syncStats.Load()
dbConnErr, dbConnErrSinceMilli := GetCurrentDbConnErr()
now := time.Now()

Expand Down Expand Up @@ -144,6 +145,8 @@ func StartHeartbeat(
silenceUntil = time.Time{}
}
})

return &syncStats
}

type goMetrics struct {
Expand Down

0 comments on commit 95f2763

Please sign in to comment.