1
0
Fork 0
mirror of https://github.com/external-secrets/external-secrets.git synced 2024-12-14 11:57:59 +00:00

Add reconcile_duration metrics (#2382)

* Add reconcile_duration metrics

Signed-off-by: shuheiktgw <s-kitagawa@mercari.com>

* fix: increase dupl threshold

Signed-off-by: Moritz Johner <beller.moritz@googlemail.com>

---------

Signed-off-by: shuheiktgw <s-kitagawa@mercari.com>
Signed-off-by: Moritz Johner <beller.moritz@googlemail.com>
Co-authored-by: Moritz Johner <beller.moritz@googlemail.com>
This commit is contained in:
Shuhei Kitagawa 2023-06-06 04:26:25 +09:00 committed by GitHub
parent 979d8beb94
commit 8a05e2f8ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 197 additions and 3 deletions

View file

@ -32,6 +32,8 @@ linters-settings:
min-complexity: 16
goheader:
template-path: ./hack/boilerplate.go.txt
dupl:
threshold: 200
govet:
check-shadowing: false
lll:

View file

@ -41,7 +41,10 @@ import (
"github.com/external-secrets/external-secrets/pkg/controllers/externalsecret/esmetrics"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
"github.com/external-secrets/external-secrets/pkg/controllers/pushsecret"
"github.com/external-secrets/external-secrets/pkg/controllers/pushsecret/psmetrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/cssmetrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/ssmetrics"
"github.com/external-secrets/external-secrets/pkg/feature"
)
@ -145,6 +148,8 @@ var rootCmd = &cobra.Command{
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
ssmetrics.SetUpMetrics()
if err = (&secretstore.StoreReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("SecretStore"),
@ -156,6 +161,7 @@ var rootCmd = &cobra.Command{
os.Exit(1)
}
if enableClusterStoreReconciler {
cssmetrics.SetUpMetrics()
if err = (&secretstore.ClusterStoreReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("ClusterSecretStore"),
@ -183,6 +189,7 @@ var rootCmd = &cobra.Command{
os.Exit(1)
}
if enablePushSecretReconciler {
psmetrics.SetUpMetrics()
if err = (&pushsecret.Reconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("PushSecret"),

View file

@ -0,0 +1,49 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package psmetrics
import (
"github.com/prometheus/client_golang/prometheus"
"sigs.k8s.io/controller-runtime/pkg/metrics"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
)
const (
PushSecretSubsystem = "pushsecret"
PushSecretReconcileDurationKey = "reconcile_duration"
)
var gaugeVecMetrics = map[string]*prometheus.GaugeVec{}
// SetUpMetrics is called at the root to set-up the metric logic using the
// config flags provided.
func SetUpMetrics() {
pushSecretReconcileDuration := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Subsystem: PushSecretSubsystem,
Name: PushSecretReconcileDurationKey,
Help: "The duration time to reconcile the Push Secret",
}, ctrlmetrics.NonConditionMetricLabelNames)
metrics.Registry.MustRegister(pushSecretReconcileDuration)
gaugeVecMetrics = map[string]*prometheus.GaugeVec{
PushSecretReconcileDurationKey: pushSecretReconcileDuration,
}
}
func GetGaugeVec(key string) *prometheus.GaugeVec {
return gaugeVecMetrics[key]
}

View file

@ -32,7 +32,9 @@ import (
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
v1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
"github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
"github.com/external-secrets/external-secrets/pkg/controllers/pushsecret/psmetrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore"
)
@ -60,6 +62,13 @@ type Reconciler struct {
func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := r.Log.WithValues("pushsecret", req.NamespacedName)
resourceLabels := ctrlmetrics.RefineNonConditionMetricLabels(map[string]string{"name": req.Name, "namespace": req.Namespace})
start := time.Now()
pushSecretReconcileDuration := psmetrics.GetGaugeVec(psmetrics.PushSecretReconcileDurationKey)
defer func() { pushSecretReconcileDuration.With(resourceLabels).Set(float64(time.Since(start))) }()
var ps esapi.PushSecret
err := r.Get(ctx, req.NamespacedName, &ps)
mgr := secretstore.NewManager(r.Client, r.ControllerClass, false)

View file

@ -29,9 +29,10 @@ import (
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
v1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
v1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
"github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
"github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
ctest "github.com/external-secrets/external-secrets/pkg/controllers/commontest"
"github.com/external-secrets/external-secrets/pkg/controllers/pushsecret/psmetrics"
"github.com/external-secrets/external-secrets/pkg/provider/testing/fake"
)
@ -53,6 +54,7 @@ func init() {
v1beta1.ForceRegister(fakeProvider, &v1beta1.SecretStoreProvider{
Fake: &v1beta1.FakeProvider{},
})
psmetrics.SetUpMetrics()
}
func checkCondition(status v1alpha1.PushSecretStatus, cond v1alpha1.PushSecretStatusCondition) bool {

View file

@ -26,6 +26,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/cssmetrics"
// Loading registered providers.
_ "github.com/external-secrets/external-secrets/pkg/provider/register"
)
@ -42,6 +44,13 @@ type ClusterStoreReconciler struct {
func (r *ClusterStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := r.Log.WithValues("clustersecretstore", req.NamespacedName)
resourceLabels := ctrlmetrics.RefineNonConditionMetricLabels(map[string]string{"name": req.Name, "namespace": req.Namespace})
start := time.Now()
clusterSecretStoreReconcileDuration := cssmetrics.GetGaugeVec(cssmetrics.ClusterSecretStoreReconcileDurationKey)
defer func() { clusterSecretStoreReconcileDuration.With(resourceLabels).Set(float64(time.Since(start))) }()
var css esapi.ClusterSecretStore
err := r.Get(ctx, req.NamespacedName, &css)
if apierrors.IsNotFound(err) {

View file

@ -0,0 +1,49 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cssmetrics
import (
"github.com/prometheus/client_golang/prometheus"
"sigs.k8s.io/controller-runtime/pkg/metrics"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
)
const (
ClusterSecretStoreSubsystem = "clustersecretstore"
ClusterSecretStoreReconcileDurationKey = "reconcile_duration"
)
var gaugeVecMetrics = map[string]*prometheus.GaugeVec{}
// SetUpMetrics is called at the root to set-up the metric logic using the
// config flags provided.
func SetUpMetrics() {
clusterSecretStoreReconcileDuration := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Subsystem: ClusterSecretStoreSubsystem,
Name: ClusterSecretStoreReconcileDurationKey,
Help: "The duration time to reconcile the Cluster Secret Store",
}, ctrlmetrics.NonConditionMetricLabelNames)
metrics.Registry.MustRegister(clusterSecretStoreReconcileDuration)
gaugeVecMetrics = map[string]*prometheus.GaugeVec{
ClusterSecretStoreReconcileDurationKey: clusterSecretStoreReconcileDuration,
}
}
func GetGaugeVec(key string) *prometheus.GaugeVec {
return gaugeVecMetrics[key]
}

View file

@ -26,6 +26,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/ssmetrics"
// Loading registered providers.
_ "github.com/external-secrets/external-secrets/pkg/provider/register"
)
@ -42,6 +44,13 @@ type StoreReconciler struct {
func (r *StoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := r.Log.WithValues("secretstore", req.NamespacedName)
resourceLabels := ctrlmetrics.RefineNonConditionMetricLabels(map[string]string{"name": req.Name, "namespace": req.Namespace})
start := time.Now()
secretStoreReconcileDuration := ssmetrics.GetGaugeVec(ssmetrics.SecretStoreReconcileDurationKey)
defer func() { secretStoreReconcileDuration.With(resourceLabels).Set(float64(time.Since(start))) }()
var ss esapi.SecretStore
err := r.Get(ctx, req.NamespacedName, &ss)
if apierrors.IsNotFound(err) {

View file

@ -0,0 +1,49 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package ssmetrics
import (
"github.com/prometheus/client_golang/prometheus"
"sigs.k8s.io/controller-runtime/pkg/metrics"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
)
const (
SecretStoreSubsystem = "secretstore"
SecretStoreReconcileDurationKey = "reconcile_duration"
)
var gaugeVecMetrics = map[string]*prometheus.GaugeVec{}
// SetUpMetrics is called at the root to set-up the metric logic using the
// config flags provided.
func SetUpMetrics() {
secretStoreReconcileDuration := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Subsystem: SecretStoreSubsystem,
Name: SecretStoreReconcileDurationKey,
Help: "The duration time to reconcile the Secret Store",
}, ctrlmetrics.NonConditionMetricLabelNames)
metrics.Registry.MustRegister(secretStoreReconcileDuration)
gaugeVecMetrics = map[string]*prometheus.GaugeVec{
SecretStoreReconcileDurationKey: secretStoreReconcileDuration,
}
}
func GetGaugeVec(key string) *prometheus.GaugeVec {
return gaugeVecMetrics[key]
}

View file

@ -30,6 +30,9 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log/zap"
esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
ctrlmetrics "github.com/external-secrets/external-secrets/pkg/controllers/metrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/cssmetrics"
"github.com/external-secrets/external-secrets/pkg/controllers/secretstore/ssmetrics"
)
var cfg *rest.Config
@ -100,3 +103,9 @@ var _ = AfterSuite(func() {
err := testEnv.Stop()
Expect(err).ToNot(HaveOccurred())
})
func init() {
ctrlmetrics.SetUpLabelNames(false)
cssmetrics.SetUpMetrics()
ssmetrics.SetUpMetrics()
}