diff --git a/pkg/pipelinerunmetrics/metrics.go b/pkg/pipelinerunmetrics/metrics.go index 225c689d746..15d88c42b86 100644 --- a/pkg/pipelinerunmetrics/metrics.go +++ b/pkg/pipelinerunmetrics/metrics.go @@ -23,17 +23,25 @@ import ( "sync" "time" + "encoding/hex" + + "golang.org/x/crypto/blake2b" + "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" listers "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1" + "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" + "go.uber.org/zap" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/labels" + "knative.dev/pkg/apis" "knative.dev/pkg/logging" "knative.dev/pkg/metrics" @@ -118,6 +126,8 @@ type Recorder struct { pipelinerun string) []tag.Mutator ReportingPeriod time.Duration + + hash string } // We cannot register the view multiple times, so NewRecorder lazily @@ -292,7 +302,10 @@ func OnStore(logger *zap.SugaredLogger, r *Recorder) func(name string, logger.Error("Failed to do type insertion for extracting metrics config") return } - r.updateConfig(cfg) + updated := r.updateConfig(cfg) + if !updated { + return + } // Update metrics according to configuration viewUnregister() err := viewRegister(cfg) @@ -337,11 +350,23 @@ func getPipelineTagName(pr *v1.PipelineRun) string { return pipelineName } -func (r *Recorder) updateConfig(cfg *config.Metrics) { +func (r *Recorder) updateConfig(cfg *config.Metrics) bool { r.mutex.Lock() defer r.mutex.Unlock() + var hash string + if cfg != nil { + s := fmt.Sprintf("%v", *cfg) + sum := blake2b.Sum256([]byte(s)) + hash = hex.EncodeToString(sum[:]) + } + + if r.hash == hash { + return false + } r.cfg = cfg + + return true } // DurationAndCount logs the duration of PipelineRun execution and diff --git a/pkg/taskrunmetrics/metrics.go b/pkg/taskrunmetrics/metrics.go index 0ff15d63068..6454af6d500 100644 --- a/pkg/taskrunmetrics/metrics.go +++ b/pkg/taskrunmetrics/metrics.go @@ -22,20 +22,29 @@ import ( "sync" "time" + "encoding/hex" + + "golang.org/x/crypto/blake2b" + "github.com/pkg/errors" + "github.com/tektoncd/pipeline/pkg/apis/config" "github.com/tektoncd/pipeline/pkg/apis/pipeline" v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" listers "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1" "github.com/tektoncd/pipeline/pkg/pod" + "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" + "go.uber.org/zap" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "knative.dev/pkg/apis" "knative.dev/pkg/logging" "knative.dev/pkg/metrics" @@ -130,6 +139,8 @@ type Recorder struct { insertPipelineTag func(pipeline, pipelinerun string) []tag.Mutator + + hash string } // We cannot register the view multiple times, so NewRecorder lazily @@ -335,7 +346,10 @@ func OnStore(logger *zap.SugaredLogger, r *Recorder) func(name string, value int logger.Error("Failed to do type insertion for extracting metrics config") return } - r.updateConfig(cfg) + updated := r.updateConfig(cfg) + if !updated { + return + } // Update metrics according to the configuration viewUnregister() err := viewRegister(cfg) @@ -395,11 +409,24 @@ func getTaskTagName(tr *v1.TaskRun) string { return taskName } -func (r *Recorder) updateConfig(cfg *config.Metrics) { +func (r *Recorder) updateConfig(cfg *config.Metrics) bool { r.mutex.Lock() defer r.mutex.Unlock() + var hash string + if cfg != nil { + s := fmt.Sprintf("%v", *cfg) + sum := blake2b.Sum256([]byte(s)) + hash = hex.EncodeToString(sum[:]) + } + + if r.hash == hash { + return false + } + r.cfg = cfg + + return true } // DurationAndCount logs the duration of TaskRun execution and