telemetry: Fix atomic.Pointer initialisation responsibility

Return `atomic.pointer`, so that initialisation is not the responsibility of
another package.
This commit is contained in:
Eric Lippmann 2024-10-24 11:43:55 +02:00
parent 7cf54c1b25
commit 95f2763a73
2 changed files with 11 additions and 8 deletions

View file

@ -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 {
@ -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
@ -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(),
})

View file

@ -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
@ -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()
@ -144,6 +145,8 @@ func StartHeartbeat(
silenceUntil = time.Time{}
}
})
return &syncStats
}
type goMetrics struct {