From fed1636a1546396b788cb3491ac2c06d3a56b4e4 Mon Sep 17 00:00:00 2001 From: Khurram Baig Date: Thu, 23 Sep 2021 16:21:24 +0530 Subject: [PATCH] Add properties in CR to configure Pipelines Metrics --- docs/TektonConfig.md | 8 +++++ docs/TektonPipeline.md | 36 ++++++++++++++++--- .../v1alpha1/tektonpipeline_defaults.go | 20 +++++++++++ .../v1alpha1/tektonpipeline_defaults_test.go | 6 ++++ .../operator/v1alpha1/tektonpipeline_types.go | 10 ++++++ .../v1alpha1/zz_generated.deepcopy.go | 17 +++++++++ .../tektonpipeline/tektonpipeline.go | 2 ++ .../openshift/tektonpipeline/extension.go | 17 +++++++++ 8 files changed, 111 insertions(+), 5 deletions(-) diff --git a/docs/TektonConfig.md b/docs/TektonConfig.md index 799d18760f..f8967cc88a 100644 --- a/docs/TektonConfig.md +++ b/docs/TektonConfig.md @@ -32,6 +32,10 @@ The TektonConfig CR provides the following features enable-api-fields: stable enable-custom-tasks: false enable-tekton-oci-bundles: false + metrics.pipelinerun.duration-type: histogram + metrics.pipelinerun.level: pipelinerun + metrics.taskrun.duration-type: histogram + metrics.taskrun.level: taskrun require-git-ssh-secret-known-hosts: false running-in-environment-with-injected-sidecars: true pruner: {} @@ -98,6 +102,10 @@ pipeline: enable-api-fields: stable enable-custom-tasks: false enable-tekton-oci-bundles: false + metrics.pipelinerun.duration-type: histogram + metrics.pipelinerun.level: pipelinerun + metrics.taskrun.duration-type: histogram + metrics.taskrun.level: taskrun require-git-ssh-secret-known-hosts: false running-in-environment-with-injected-sidecars: true ``` diff --git a/docs/TektonPipeline.md b/docs/TektonPipeline.md index 9d335e15ab..a5aa3b6fcf 100644 --- a/docs/TektonPipeline.md +++ b/docs/TektonPipeline.md @@ -19,6 +19,10 @@ spec: enable-api-fields: stable enable-custom-tasks: false enable-tekton-oci-bundles: false + metrics.pipelinerun.duration-type: histogram + metrics.pipelinerun.level: pipeline + metrics.taskrun.duration-type: histogram + metrics.taskrun.level: task require-git-ssh-secret-known-hosts: false running-in-environment-with-injected-sidecars: true scope-when-expressions-to-task: false @@ -53,10 +57,10 @@ You can install this component using [TektonConfig](./TektonConfig.md) by choosi - `disable-creds-init` (Default: `false`) - Setting this flag to "true" will prevent Tekton scanning attached service accounts and injecting any credentials it + Setting this flag to "true" will prevent Tekton scanning attached service accounts and injecting any credentials it finds into your Steps. - The default behaviour currently is for Tekton to search service accounts for secrets matching a specified format and + The default behaviour currently is for Tekton to search service accounts for secrets matching a specified format and automatically mount those into your Steps. Note: setting this to "true" will prevent PipelineResources from working. See more info [here](https://github.com/tektoncd/pipeline/issues/2791). @@ -64,8 +68,8 @@ You can install this component using [TektonConfig](./TektonConfig.md) by choosi - `running-in-environment-with-injected-sidecars` (Default: `true`) - This option should be set to false when Pipelines is running in a cluster that does not use injected sidecars such - as Istio. Setting it to false should decrease the time it takes for a TaskRun to start running. For clusters that use + This option should be set to false when Pipelines is running in a cluster that does not use injected sidecars such + as Istio. Setting it to false should decrease the time it takes for a TaskRun to start running. For clusters that use injected sidecars, setting this option to false can lead to unexpected behavior. See more info [here](https://github.com/tektoncd/pipeline/issues/2080). @@ -99,8 +103,30 @@ You can install this component using [TektonConfig](./TektonConfig.md) by choosi Setting this flag to "true" scopes when expressions to guard a Task only instead of a Task and its dependent Tasks. +### Metrics Properties +These fields have default values so even if user have not passed them in CR, operator will add them and override the values +configure in pipelines. + +- `metrics.pipelinerun.duration-type` (Default: `histogram`) + + Setting this flag will determine the duration type - gauge or histogram. + +- `metrics.pipelinerun.level` (Default: `pipeline`) + + Setting this flag will determine the level of pipelinerun metrics. + +- `metrics.taskrun.duration-type` (Default: `histogram`) + + Setting this flag will determine the duration type - gauge or histogram. + +- `metrics.taskrun.level` (Default: `task`) + + Setting this flag will determine the level of taskrun metrics. + + + ### Optional Properties -This fields doesn't have default values so will be considered only if user passes them. By default Operator won't add +This fields doesn't have default values so will be considered only if user passes them. By default Operator won't add this fields CR and won't configure for pipelines. The Default values for this fields are already set in pipelines are not set by Operator. If user passes some values then diff --git a/pkg/apis/operator/v1alpha1/tektonpipeline_defaults.go b/pkg/apis/operator/v1alpha1/tektonpipeline_defaults.go index 5e4df23f47..631f98af69 100644 --- a/pkg/apis/operator/v1alpha1/tektonpipeline_defaults.go +++ b/pkg/apis/operator/v1alpha1/tektonpipeline_defaults.go @@ -22,6 +22,13 @@ import ( "knative.dev/pkg/ptr" ) +const ( + DefaultMetricsPipelinerunLevel = "pipeline" + DefaultMetricsTaskrunLevel = "task" + DefaultMetricsPipelierunDurationType = "histogram" + DefaultMetricsTaskrunDurationType = "histogram" +) + func (tp *TektonPipeline) SetDefaults(ctx context.Context) { tp.Spec.PipelineProperties.setDefaults() } @@ -54,4 +61,17 @@ func (p *PipelineProperties) setDefaults() { if p.ScopeWhenExpressionsToTask == nil { p.ScopeWhenExpressionsToTask = ptr.Bool(false) } + if p.MetricsPipelinerunDurationType == "" { + p.MetricsPipelinerunDurationType = DefaultMetricsPipelierunDurationType + } + if p.MetricsPipelinerunLevel == "" { + p.MetricsPipelinerunLevel = DefaultMetricsPipelinerunLevel + } + if p.MetricsTaskrunDurationType == "" { + p.MetricsTaskrunDurationType = DefaultMetricsTaskrunDurationType + } + if p.MetricsTaskrunLevel == "" { + p.MetricsTaskrunLevel = DefaultMetricsTaskrunLevel + } + } diff --git a/pkg/apis/operator/v1alpha1/tektonpipeline_defaults_test.go b/pkg/apis/operator/v1alpha1/tektonpipeline_defaults_test.go index f451a77c47..31c8dada2f 100644 --- a/pkg/apis/operator/v1alpha1/tektonpipeline_defaults_test.go +++ b/pkg/apis/operator/v1alpha1/tektonpipeline_defaults_test.go @@ -50,6 +50,12 @@ func Test_SetDefaults_PipelineProperties(t *testing.T) { EnableCustomTasks: ptr.Bool(false), EnableApiFields: ApiFieldStable, ScopeWhenExpressionsToTask: ptr.Bool(false), + PipelineMetricsProperties{ + MetricsPipelinerunDurationType: DefaultMetricsPipelierunDurationType, + MetricsPipelinerunLevel: DefaultMetricsPipelinerunLevel, + MetricsTaskrunDurationType: DefaultMetricsTaskrunDurationType, + MetricsTaskrunLevel: DefaultMetricsTaskrunLevel, + }, } tp.SetDefaults(context.TODO()) diff --git a/pkg/apis/operator/v1alpha1/tektonpipeline_types.go b/pkg/apis/operator/v1alpha1/tektonpipeline_types.go index 52b9a6b177..a903f75b50 100644 --- a/pkg/apis/operator/v1alpha1/tektonpipeline_types.go +++ b/pkg/apis/operator/v1alpha1/tektonpipeline_types.go @@ -91,6 +91,7 @@ type PipelineProperties struct { EnableCustomTasks *bool `json:"enable-custom-tasks,omitempty"` EnableApiFields string `json:"enable-api-fields,omitempty"` ScopeWhenExpressionsToTask *bool `json:"scope-when-expressions-to-task,omitempty"` + PipelineMetricsProperties `json:",inline"` // +optional OptionalPipelineProperties `json:",inline"` } @@ -105,3 +106,12 @@ type OptionalPipelineProperties struct { DefaultCloudEventsSink string `json:"default-cloud-events-sink,omitempty"` DefaultTaskRunWorkspaceBinding string `json:"default-task-run-workspace-binding,omitempty"` } + +// PipelineMetricsProperties defines the fields which are configurable for +// metrics +type PipelineMetricsProperties struct { + MetricsTaskrunLevel string `json:"metrics.taskrun.level,omitempty"` + MetricsTaskrunDurationType string `json:"metrics.taskrun.duration-type,omitempty"` + MetricsPipelinerunLevel string `json:"metrics.pipelinerun.level,omitempty"` + MetricsPipelinerunDurationType string `json:"metrics.pipelinerun.duration-type,omitempty"` +} diff --git a/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go index 64d249c3a1..02d9f8a1ef 100644 --- a/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go @@ -222,6 +222,22 @@ func (in *Pipeline) DeepCopy() *Pipeline { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PipelineMetricsProperties) DeepCopyInto(out *PipelineMetricsProperties) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineMetricsProperties. +func (in *PipelineMetricsProperties) DeepCopy() *PipelineMetricsProperties { + if in == nil { + return nil + } + out := new(PipelineMetricsProperties) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PipelineProperties) DeepCopyInto(out *PipelineProperties) { *out = *in @@ -270,6 +286,7 @@ func (in *PipelineProperties) DeepCopyInto(out *PipelineProperties) { *out = new(bool) **out = **in } + out.PipelineMetricsProperties = in.PipelineMetricsProperties in.OptionalPipelineProperties.DeepCopyInto(&out.OptionalPipelineProperties) return } diff --git a/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go b/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go index 6f6d8d9912..87f13d14a7 100644 --- a/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go +++ b/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go @@ -38,6 +38,7 @@ const ( // Pipelines ConfigMap featureFlag = "feature-flags" configDefaults = "config-defaults" + configMetrics = "config-observability" proxyLabel = "operator.tekton.dev/disable-proxy=true" @@ -314,6 +315,7 @@ func (r *Reconciler) transform(ctx context.Context, manifest *mf.Manifest, comp extra := []mf.Transformer{ common.AddConfigMapValues(featureFlag, pipeline.Spec.PipelineProperties), common.AddConfigMapValues(configDefaults, pipeline.Spec.OptionalPipelineProperties), + common.AddConfigMapValues(configMetrics, pipeline.Spec.PipelineMetricsProperties), common.ApplyProxySettings, common.DeploymentImages(images), common.InjectLabelOnNamespace(proxyLabel), diff --git a/pkg/reconciler/openshift/tektonpipeline/extension.go b/pkg/reconciler/openshift/tektonpipeline/extension.go index d348ba7a53..e49a6aec08 100644 --- a/pkg/reconciler/openshift/tektonpipeline/extension.go +++ b/pkg/reconciler/openshift/tektonpipeline/extension.go @@ -191,6 +191,23 @@ func SetDefault(pipeline *v1alpha1.Pipeline) bool { updated = true } + if pipeline.MetricsPipelinerunDurationType == "" { + pipeline.MetricsPipelinerunDurationType = v1alpha1.DefaultMetricsPipelierunDurationType + updated = true + } + if pipeline.MetricsPipelinerunLevel == "" { + pipeline.MetricsPipelinerunLevel = v1alpha1.DefaultMetricsPipelinerunLevel + updated = true + } + if pipeline.MetricsTaskrunDurationType == "" { + pipeline.MetricsTaskrunDurationType = v1alpha1.DefaultMetricsTaskrunDurationType + updated = true + } + if pipeline.MetricsTaskrunLevel == "" { + pipeline.MetricsTaskrunLevel = v1alpha1.DefaultMetricsTaskrunLevel + updated = true + } + return updated }