package checker import ( "encoding/json" "fmt" "time" sdk "git.happydns.org/checker-sdk-go/checker" ) // Implements sdk.CheckerMetricsReporter. func (p *authoritativeConsistencyProvider) ExtractMetrics(ctx sdk.ReportContext, collectedAt time.Time) ([]sdk.CheckMetric, error) { var data ObservationData if err := json.Unmarshal(ctx.Data(), &data); err != nil { return nil, fmt.Errorf("checker: decoding observation: %w", err) } var out []sdk.CheckMetric for name, r := range data.Results { labels := map[string]string{"zone": data.Zone, "ns": name} up := float64(0) if r.UDPReachable && r.Authoritative { up = 1 } out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_ns_up", Value: up, Labels: labels, Timestamp: collectedAt, }) tcp := float64(0) if r.TCPReachable { tcp = 1 } out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_ns_tcp", Value: tcp, Labels: labels, Timestamp: collectedAt, }) if r.LatencyMs > 0 { out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_ns_latency_ms", Value: float64(r.LatencyMs), Unit: "ms", Labels: labels, Timestamp: collectedAt, }) } if r.Serial > 0 { out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_ns_serial", Value: float64(r.Serial), Labels: labels, Timestamp: collectedAt, }) } } uniqueSerials := map[uint32]struct{}{} for _, r := range data.Results { if r.Serial != 0 { uniqueSerials[r.Serial] = struct{}{} } } out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_unique_serials", Value: float64(len(uniqueSerials)), Labels: map[string]string{"zone": data.Zone}, Timestamp: collectedAt, }) if data.HasSOA && data.DeclaredSerial > 0 { out = append(out, sdk.CheckMetric{ Name: "authoritative_consistency_serial", Value: float64(data.DeclaredSerial), Labels: map[string]string{"zone": data.Zone}, Timestamp: collectedAt, }) } return out, nil }