Classify registry normalization diagnostics
This commit is contained in:
@@ -22,19 +22,29 @@ const (
|
||||
// locally grouped advisories. These findings do not indicate process
|
||||
// degradation.
|
||||
func DataQualityResult(findings []contracts.Warning) (contracts.ValidationResult, error) {
|
||||
diagnostics, err := Collect(findings, contracts.DiagnosticDispositionAdvisory, contracts.DiagnosticCategoryDataQuality)
|
||||
if err != nil {
|
||||
return contracts.ValidationResult{}, err
|
||||
}
|
||||
return contracts.ValidationResult{Approved: true, Diagnostics: diagnostics}, nil
|
||||
}
|
||||
|
||||
// Collect converts individual deterministic findings into bounded,
|
||||
// occurrence-grouped producer diagnostics with one consistent classification.
|
||||
func Collect(findings []contracts.Warning, disposition contracts.DiagnosticDisposition, category contracts.DiagnosticCategory) ([]contracts.ProducerDiagnostic, error) {
|
||||
collector := frameworkdiagnostics.NewCollector()
|
||||
for _, finding := range findings {
|
||||
if err := collector.Add(contracts.ProducerDiagnostic{
|
||||
Disposition: contracts.DiagnosticDispositionAdvisory,
|
||||
Category: contracts.DiagnosticCategoryDataQuality,
|
||||
Disposition: disposition,
|
||||
Category: category,
|
||||
ReasonCode: finding.ReasonCode,
|
||||
OccurrenceCount: 1,
|
||||
Samples: []contracts.DiagnosticSample{{Scope: finding.Scope, Message: finding.Message}},
|
||||
}); err != nil {
|
||||
return contracts.ValidationResult{}, fmt.Errorf("collect data-quality diagnostic: %w", err)
|
||||
return nil, fmt.Errorf("collect diagnostic: %w", err)
|
||||
}
|
||||
}
|
||||
return contracts.ValidationResult{Approved: true, Diagnostics: collector.Diagnostics()}, nil
|
||||
return collector.Diagnostics(), nil
|
||||
}
|
||||
|
||||
func Truncate(value string) string {
|
||||
|
||||
@@ -69,3 +69,26 @@ func TestDataQualityResultGroupsFindingsWithoutWarnings(t *testing.T) {
|
||||
t.Fatalf("diagnostic = %#v", diagnostic)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCollectGroupsNormalizationFindingsWithBoundedSamples(t *testing.T) {
|
||||
findings := make([]contracts.Warning, 5)
|
||||
for index := range findings {
|
||||
findings[index] = contracts.Warning{
|
||||
Scope: fmt.Sprintf("records[%d]", index),
|
||||
ReasonCode: "record_normalized",
|
||||
Message: fmt.Sprintf("record %d normalized", index),
|
||||
}
|
||||
}
|
||||
|
||||
groups, err := Collect(findings, contracts.DiagnosticDispositionObservation, contracts.DiagnosticCategoryNormalization)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(groups) != 1 {
|
||||
t.Fatalf("groups = %#v, want one grouped observation", groups)
|
||||
}
|
||||
diagnostic := groups[0]
|
||||
if diagnostic.Disposition != contracts.DiagnosticDispositionObservation || diagnostic.Category != contracts.DiagnosticCategoryNormalization || diagnostic.OccurrenceCount != 5 || len(diagnostic.Samples) != contracts.MaxDiagnosticSamples || diagnostic.OmittedSampleCount != 2 {
|
||||
t.Fatalf("diagnostic = %#v", diagnostic)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user