Skip to content

Commit eca274e

Browse files
Merge pull request #4880 from acpana/acpana/kcc-api-metrics-tfs
feat: tf api metrics
2 parents 0370636 + c1db92b commit eca274e

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

pkg/controller/tf/controller.go

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/krmtotf"
3737
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/lease/leaser"
3838
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/managementconflict"
39+
metricstransport "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/metrics/transport"
3940
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides"
4041
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides/operations"
4142
"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/servicemapping/servicemappingloader"
@@ -44,6 +45,7 @@ import (
4445
"github.com/go-logr/logr"
4546
tfschema "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
4647
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
48+
4749
"golang.org/x/sync/semaphore"
4850
corev1 "k8s.io/api/core/v1"
4951
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -60,6 +62,8 @@ import (
6062
"sigs.k8s.io/controller-runtime/pkg/predicate"
6163
"sigs.k8s.io/controller-runtime/pkg/reconcile"
6264
"sigs.k8s.io/controller-runtime/pkg/source"
65+
66+
tpgconfig "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
6367
)
6468

6569
var logger = log.Log
@@ -76,6 +80,7 @@ type Reconciler struct {
7680
smLoader *servicemappingloader.ServiceMappingLoader
7781
logger logr.Logger
7882
jitterGenerator jitter.Generator
83+
controllerName string
7984
// Fields used for triggering reconciliations when dependencies are ready
8085
immediateReconcileRequests chan event.GenericEvent
8186
resourceWatcherRoutines *semaphore.Weighted // Used to cap number of goroutines watching unready dependencies
@@ -160,10 +165,12 @@ func NewReconciler(mgr manager.Manager,
160165
immediateReconcileRequests: immediateReconcileRequests,
161166
resourceWatcherRoutines: resourceWatcherRoutines,
162167
jitterGenerator: jitterGenerator,
168+
controllerName: controllerName,
163169
}, nil
164170
}
165171

166172
func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (res reconcile.Result, err error) {
173+
167174
r.schemaRefMu.RLock()
168175
defer r.schemaRefMu.RUnlock()
169176
r.logger.Info("starting reconcile", "resource", req.NamespacedName)
@@ -248,7 +255,14 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (res
248255
if err := resourceoverrides.Handler.PreActuationTransform(&resource.Resource); err != nil {
249256
return reconcile.Result{}, r.HandlePreActuationTransformFailed(ctx, &resource.Resource, fmt.Errorf("error applying pre-actuation transformation to resource '%v': %w", req.NamespacedName.String(), err))
250257
}
251-
requeue, err := r.sync(ctx, resource)
258+
259+
meta, err := cloneAndChangeContext(ctx, r.provider.Meta(), r.controllerName)
260+
if err != nil {
261+
log.FromContext(ctx).Error(err, "error cloning and changing context; metrics may not show up")
262+
meta = r.provider.Meta()
263+
}
264+
265+
requeue, err := r.sync(ctx, resource, meta)
252266
if err != nil {
253267
return reconcile.Result{}, err
254268
}
@@ -263,7 +277,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (res
263277
return reconcile.Result{RequeueAfter: jitteredPeriod}, nil
264278
}
265279

266-
func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (requeue bool, err error) {
280+
func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource, tfProviderMeta interface{}) (requeue bool, err error) {
267281
// isolate any panics to only this function
268282
defer execution.RecoverWithInternalError(&err)
269283
if !krmResource.GetDeletionTimestamp().IsZero() {
@@ -318,7 +332,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
318332
return false, err
319333
}
320334
r.logger.Info("deleting underlying resource", "resource", k8s.GetNamespacedName(krmResource))
321-
if _, err := krmResource.TFResource.Apply(ctx, liveState, &terraform.InstanceDiff{Destroy: true}, r.provider.Meta()); err != nil {
335+
if _, err := krmResource.TFResource.Apply(ctx, liveState, &terraform.InstanceDiff{Destroy: true}, tfProviderMeta); err != nil {
322336
return false, r.HandleDeleteFailed(ctx, &krmResource.Resource, fmt.Errorf("error deleting resource: %v", err))
323337
}
324338
return false, r.handleDeleted(ctx, krmResource)
@@ -360,7 +374,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
360374
if err := resourceoverrides.Handler.PreTerraformApply(ctx, krmResource.GroupVersionKind(), &operations.PreTerraformApply{KRMResource: krmResource, TerraformConfig: config, LiveState: liveState}); err != nil {
361375
return false, r.HandleUpdateFailed(ctx, &krmResource.Resource, fmt.Errorf("error applying pre-apply transformation to resource: %w", err))
362376
}
363-
diff, err := krmResource.TFResource.Diff(ctx, liveState, config, r.provider.Meta())
377+
diff, err := krmResource.TFResource.Diff(ctx, liveState, config, tfProviderMeta)
364378
if err != nil {
365379
return false, r.HandleUpdateFailed(ctx, &krmResource.Resource, fmt.Errorf("error calculating diff: %w", err))
366380
}
@@ -410,7 +424,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
410424
d.RequiresNew = false
411425
}
412426
}
413-
newState, diagnostics := krmResource.TFResource.Apply(ctx, liveState, diff, r.provider.Meta())
427+
newState, diagnostics := krmResource.TFResource.Apply(ctx, liveState, diff, tfProviderMeta)
414428
if err := krmtotf.NewErrorFromDiagnostics(diagnostics); err != nil {
415429
r.logger.Error(err, "error applying desired state", "resource", krmResource.GetNamespacedName())
416430
return false, r.HandleUpdateFailed(ctx, &krmResource.Resource, fmt.Errorf("error applying desired state: %w", err))
@@ -637,3 +651,28 @@ func updateObservedSecretVersionsAnnotationFor(resource *krmtotf.Resource, secre
637651
hasSensitiveFields := tfresource.TFResourceHasSensitiveFields(resource.TFResource)
638652
return k8s.UpdateOrRemoveObservedSecretVersionsAnnotation(&resource.Resource, secretVersions, hasSensitiveFields)
639653
}
654+
655+
// This is needed because the terraform provider framework does not provide a way to pass context to the provider functions.
656+
// The context is instead stored in the meta object.
657+
// We need to pass a context with the controller name to the metrics transport, so that the metrics can be labeled with the controller name.
658+
func cloneAndChangeContext(ctx context.Context, meta interface{}, controllerName string) (interface{}, error) {
659+
baseConfig, ok := meta.(*tpgconfig.Config)
660+
if !ok {
661+
return nil, fmt.Errorf("meta is not of type *tpgconfig.Config")
662+
}
663+
metaC := *baseConfig
664+
665+
if baseConfig.ImpersonateServiceAccountDelegates != nil {
666+
metaC.ImpersonateServiceAccountDelegates = make([]string, len(baseConfig.ImpersonateServiceAccountDelegates))
667+
copy(metaC.ImpersonateServiceAccountDelegates, baseConfig.ImpersonateServiceAccountDelegates)
668+
}
669+
670+
if baseConfig.Scopes != nil {
671+
metaC.Scopes = make([]string, len(baseConfig.Scopes))
672+
copy(metaC.Scopes, baseConfig.Scopes)
673+
}
674+
675+
// This is the one field we are intentionally changing.
676+
metaC.Context = metricstransport.WithControllerName(ctx, controllerName) // for metrics transport
677+
return &metaC, nil
678+
}

0 commit comments

Comments
 (0)