Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions pkg/controller/expansion/expansion_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/open-policy-agent/gatekeeper/pkg/watch"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller"
"sigs.k8s.io/controller-runtime/pkg/handler"
Expand Down Expand Up @@ -61,12 +62,18 @@ func (a *Adder) InjectProviderCache(_ *externaldata.ProviderCache) {}

type Reconciler struct {
client.Client
system *expansion.System
scheme *runtime.Scheme
system *expansion.System
scheme *runtime.Scheme
registry *etRegistry
}

func newReconciler(mgr manager.Manager, system *expansion.System) *Reconciler {
return &Reconciler{Client: mgr.GetClient(), system: system, scheme: mgr.GetScheme()}
return &Reconciler{
Client: mgr.GetClient(),
system: system,
scheme: mgr.GetScheme(),
registry: newRegistry(),
}
}

func add(mgr manager.Manager, r reconcile.Reconciler) error {
Expand Down Expand Up @@ -97,6 +104,10 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
if err := r.scheme.Convert(te, unversionedTE, nil); err != nil {
return reconcile.Result{}, err
}
nsName := types.NamespacedName{
Namespace: unversionedTE.GetNamespace(),
Name: unversionedTE.GetName(),
}
if deleted {
// unversionedTE will be an empty struct. We set the metadata name, which is
// used as a key to delete it from the expansion system
Expand All @@ -105,11 +116,17 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
return reconcile.Result{}, err
}
log.Info("removed template expansion", "template name", unversionedTE.ObjectMeta.Name)
r.registry.remove(nsName)
} else {
if err := r.system.UpsertTemplate(unversionedTE); err != nil {
return reconcile.Result{}, err
}
log.Info("upserted template expansion", "template name", unversionedTE.ObjectMeta.Name)
r.registry.add(nsName)
}

if err := r.registry.report(ctx); err != nil {
log.Error(err, "error reporting template expansion metrics", "namespacedName", nsName)
}

return reconcile.Result{}, nil
Expand Down
70 changes: 70 additions & 0 deletions pkg/controller/expansion/stats_reporter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package expansion

import (
"context"

"github.com/open-policy-agent/gatekeeper/pkg/metrics"
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"k8s.io/apimachinery/pkg/types"
)

const (
etMetricName = "expansion_templates"
etDesc = "Number of observed expansion templates"
)

var (
etM = stats.Int64(etMetricName, etDesc, stats.UnitDimensionless)

views = []*view.View{
{
Name: etMetricName,
Measure: etM,
Description: etDesc,
Aggregation: view.LastValue(),
},
}
)

func init() {
if err := register(); err != nil {
panic(err)
}
}

func register() error {
return view.Register(views...)
}

func newRegistry() *etRegistry {
return &etRegistry{cache: make(map[types.NamespacedName]bool)}
}

type etRegistry struct {
cache map[types.NamespacedName]bool
dirty bool
}

func (r *etRegistry) add(key types.NamespacedName) {
r.cache[key] = true
r.dirty = true
}

func (r *etRegistry) remove(key types.NamespacedName) {
delete(r.cache, key)
r.dirty = true
}

func (r *etRegistry) report(ctx context.Context) error {
if !r.dirty {
return nil
}

if err := metrics.Record(ctx, etM.M(int64(len(r.cache)))); err != nil {
r.dirty = false
return err
}

return nil
}
8 changes: 8 additions & 0 deletions website/docs/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,14 @@ Below are the list of metrics provided by Gatekeeper:

Aggregation: `Distribution`

## Expansion Template

- Name: `gatekeeper_expansion_templates`
Comment thread
davis-haba marked this conversation as resolved.

Description: `Number of observed expansion templates`

Aggregation: `LastValue`

## Webhook

- Name: `gatekeeper_validation_request_count`
Expand Down