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.
63 lines
2 KiB
Go
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{},
|
|
®ionalSplitRule{},
|
|
&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}
|
|
}
|