mirror of https://github.com/docker/buildx.git
Merge pull request #2641 from jsternberg/metricwriter-lazy-regexp
metricwriter: compile regular expressions only on first use
This commit is contained in:
commit
238a3e03dd
|
@ -17,6 +17,31 @@ import (
|
|||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
type rePatterns struct {
|
||||
LocalSourceType *regexp.Regexp
|
||||
ImageSourceType *regexp.Regexp
|
||||
ExecType *regexp.Regexp
|
||||
ExportImageType *regexp.Regexp
|
||||
LintMessage *regexp.Regexp
|
||||
}
|
||||
|
||||
var re = sync.OnceValue(func() *rePatterns {
|
||||
return &rePatterns{
|
||||
LocalSourceType: regexp.MustCompile(
|
||||
strings.Join([]string{
|
||||
`(?P<context>\[internal] load build context)`,
|
||||
`(?P<dockerfile>load build definition)`,
|
||||
`(?P<dockerignore>load \.dockerignore)`,
|
||||
`(?P<namedcontext>\[context .+] load from client)`,
|
||||
}, "|"),
|
||||
),
|
||||
ImageSourceType: regexp.MustCompile(`^\[.*] FROM `),
|
||||
ExecType: regexp.MustCompile(`^\[.*] RUN `),
|
||||
ExportImageType: regexp.MustCompile(`^exporting to (image|(?P<format>\w+) image format)$`),
|
||||
LintMessage: regexp.MustCompile(`^https://docs\.docker\.com/go/dockerfile/rule/([\w|-]+)/`),
|
||||
}
|
||||
})
|
||||
|
||||
type metricWriter struct {
|
||||
recorders []metricRecorder
|
||||
attrs attribute.Set
|
||||
|
@ -128,22 +153,13 @@ func (mr *localSourceTransferMetricRecorder) Record(ss *client.SolveStatus) {
|
|||
}
|
||||
}
|
||||
|
||||
var reLocalSourceType = regexp.MustCompile(
|
||||
strings.Join([]string{
|
||||
`(?P<context>\[internal] load build context)`,
|
||||
`(?P<dockerfile>load build definition)`,
|
||||
`(?P<dockerignore>load \.dockerignore)`,
|
||||
`(?P<namedcontext>\[context .+] load from client)`,
|
||||
}, "|"),
|
||||
)
|
||||
|
||||
func detectLocalSourceType(vertexName string) attribute.KeyValue {
|
||||
match := reLocalSourceType.FindStringSubmatch(vertexName)
|
||||
match := re().LocalSourceType.FindStringSubmatch(vertexName)
|
||||
if match == nil {
|
||||
return attribute.KeyValue{}
|
||||
}
|
||||
|
||||
for i, source := range reLocalSourceType.SubexpNames() {
|
||||
for i, source := range re().LocalSourceType.SubexpNames() {
|
||||
if len(source) == 0 {
|
||||
// Not a subexpression.
|
||||
continue
|
||||
|
@ -241,10 +257,8 @@ func (mr *imageSourceMetricRecorder) Record(ss *client.SolveStatus) {
|
|||
}
|
||||
}
|
||||
|
||||
var reImageSourceType = regexp.MustCompile(`^\[.*] FROM `)
|
||||
|
||||
func detectImageSourceType(vertexName string) bool {
|
||||
return reImageSourceType.MatchString(vertexName)
|
||||
return re().ImageSourceType.MatchString(vertexName)
|
||||
}
|
||||
|
||||
type (
|
||||
|
@ -278,10 +292,8 @@ func (mr *execMetricRecorder) Record(ss *client.SolveStatus) {
|
|||
}
|
||||
}
|
||||
|
||||
var reExecType = regexp.MustCompile(`^\[.*] RUN `)
|
||||
|
||||
func detectExecType(vertexName string) bool {
|
||||
return reExecType.MatchString(vertexName)
|
||||
return re().ExecType.MatchString(vertexName)
|
||||
}
|
||||
|
||||
type (
|
||||
|
@ -325,10 +337,8 @@ func (mr *exportImageMetricRecorder) Record(ss *client.SolveStatus) {
|
|||
}
|
||||
}
|
||||
|
||||
var reExportImageType = regexp.MustCompile(`^exporting to (image|(?P<format>\w+) image format)$`)
|
||||
|
||||
func detectExportImageType(vertexName string) string {
|
||||
m := reExportImageType.FindStringSubmatch(vertexName)
|
||||
m := re().ExportImageType.FindStringSubmatch(vertexName)
|
||||
if m == nil {
|
||||
return ""
|
||||
}
|
||||
|
@ -456,7 +466,10 @@ func kebabToCamel(s string) string {
|
|||
return strings.Join(words, "")
|
||||
}
|
||||
|
||||
var lintRuleNameProperty = attribute.Key("lint.rule.name")
|
||||
|
||||
func (mr *lintMetricRecorder) Record(ss *client.SolveStatus) {
|
||||
reLintMessage := re().LintMessage
|
||||
for _, warning := range ss.Warnings {
|
||||
m := reLintMessage.FindSubmatch([]byte(warning.URL))
|
||||
if len(m) < 2 {
|
||||
|
@ -472,8 +485,3 @@ func (mr *lintMetricRecorder) Record(ss *client.SolveStatus) {
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
reLintMessage = regexp.MustCompile(`^https://docs\.docker\.com/go/dockerfile/rule/([\w|-]+)/`)
|
||||
lintRuleNameProperty = attribute.Key("lint.rule.name")
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue