Merge pull request #2484 from jsternberg/lint-metrics

metrics: record the number of times lint rules are triggered during a build
This commit is contained in:
Tõnis Tiigi 2024-05-30 15:15:03 -07:00 committed by GitHub
commit 7427adb9b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 41 additions and 0 deletions

View File

@ -29,6 +29,7 @@ func newMetrics(mp metric.MeterProvider, attrs attribute.Set) *metricWriter {
newExecMetricRecorder(meter, attrs),
newExportImageMetricRecorder(meter, attrs),
newIdleMetricRecorder(meter, attrs),
newLintMetricRecorder(meter, attrs),
},
attrs: attrs,
}
@ -426,3 +427,43 @@ func calculateIdleTime(started, completed []time.Time) time.Duration {
}
return elapsed
}
type lintMetricRecorder struct {
// Attributes holds the set of attributes for all metrics produced.
Attributes attribute.Set
// Count holds the metric for the number of times a lint rule has been triggered
// within the current build.
Count metric.Int64Counter
}
func newLintMetricRecorder(meter metric.Meter, attrs attribute.Set) *lintMetricRecorder {
mr := &lintMetricRecorder{
Attributes: attrs,
}
mr.Count, _ = meter.Int64Counter("lint.trigger.count",
metric.WithDescription("Measures the number of times a lint rule has been triggered."))
return mr
}
func (mr *lintMetricRecorder) Record(ss *client.SolveStatus) {
for _, warning := range ss.Warnings {
m := reLintMessage.FindSubmatch(warning.Short)
if m == nil {
continue
}
ruleName := string(m[1])
mr.Count.Add(context.Background(), 1,
metric.WithAttributeSet(mr.Attributes),
metric.WithAttributes(
lintRuleNameProperty.String(ruleName),
),
)
}
}
var (
reLintMessage = regexp.MustCompile(`^Lint Rule '(\w+)':`)
lintRuleNameProperty = attribute.Key("lint.rule.name")
)