checker-resolver-propagation/checker/rules.go
Pierre-Olivier Mercier d4c44e879b Treat unreachable resolvers as unknown, not warnings
An unreachable resolver tells us nothing about propagation: it's neither
a disagreement nor an error in the zone. Surface it as a distinct
Unreachable state so it stops polluting warning counts and the
Disagreeing/Errored buckets.
2026-05-25 16:23:15 +08:00

63 lines
2 KiB
Go

package checker
import (
"context"
"fmt"
sdk "git.happydns.org/checker-sdk-go/checker"
)
// Rules returns every CheckRule exposed by the resolver-propagation checker.
// Each rule covers one concern so the UI and metrics consumers can reason
// about them independently.
func Rules() []sdk.CheckRule {
return []sdk.CheckRule{
&resolverSelectionRule{},
&resolversReachableRule{},
&consensusRule{},
&authoritativeMatchRule{},
&nxdomainRule{},
&servfailRule{},
&regionalSplitRule{},
&serialDriftRule{},
&staleCacheRule{},
&dnssecRule{},
&resolverLatencyRule{},
&filteredHitRule{},
}
}
// loadData fetches the observation and returns an error state on failure.
// It also runs deriveView so every rule sees a ready-to-use consensus.
func loadData(ctx context.Context, obs sdk.ObservationGetter) (*ResolverPropagationData, *sdk.CheckState) {
var data ResolverPropagationData
if err := obs.Get(ctx, ObservationKeyResolverPropagation, &data); err != nil {
return nil, &sdk.CheckState{
Status: sdk.StatusError,
Message: fmt.Sprintf("failed to load resolver-propagation observation: %v", err),
Code: "resolver_propagation_error",
}
}
deriveView(&data)
return &data, nil
}
func passState(code, message string) sdk.CheckState {
return sdk.CheckState{Status: sdk.StatusOK, Message: message, Code: code}
}
func infoState(code, subject, message string) sdk.CheckState {
return sdk.CheckState{Status: sdk.StatusInfo, Message: message, Code: code, Subject: subject}
}
func warnState(code, subject, message string) sdk.CheckState {
return sdk.CheckState{Status: sdk.StatusWarn, Message: message, Code: code, Subject: subject}
}
func critState(code, subject, message string) sdk.CheckState {
return sdk.CheckState{Status: sdk.StatusCrit, Message: message, Code: code, Subject: subject}
}
func unknownState(code, subject, message string) sdk.CheckState {
return sdk.CheckState{Status: sdk.StatusUnknown, Message: message, Code: code, Subject: subject}
}