Skip to content

Commit 38fffa2

Browse files
committed
feat: add counter for admissions
Signed-off-by: David Weber <david.weber@w3tec.ch>
1 parent 9b86378 commit 38fffa2

File tree

7 files changed

+64
-4
lines changed

7 files changed

+64
-4
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ Adding a new version? You'll need three changes:
159159
[#5965](https://github.com/Kong/kubernetes-ingress-controller/pull/5965)
160160
- Fallback configuration no longer omits licenses and vaults.
161161
[#6048](https://github.com/Kong/kubernetes-ingress-controller/pull/6048)
162+
- Added new metric for Prometheus called `ingress_controller_admission_count`. It's a counter and has two labels
163+
`allowed` to indicate if the resource was allowed and `resource` to indicate the resource under admission.
164+
[#6084](https://github.com/Kong/kubernetes-ingress-controller/issues/6084)
162165

163166
### Fixed
164167

internal/admission/handler.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7-
"net/http"
8-
97
"github.com/go-logr/logr"
8+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
109
admissionv1 "k8s.io/api/admission/v1"
1110
corev1 "k8s.io/api/core/v1"
1211
netv1 "k8s.io/api/networking/v1"
1312
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"net/http"
1414

1515
"github.com/kong/kubernetes-ingress-controller/v3/internal/annotations"
1616
ctrlref "github.com/kong/kubernetes-ingress-controller/v3/internal/controllers/reference"
@@ -37,6 +37,8 @@ type RequestHandler struct {
3737
// referring the validated resource (Secret) to check the changes on
3838
// referred Secret will produce invalid configuration of the plugins.
3939
ReferenceIndexers ctrlref.CacheIndexers
40+
// PromMetrics provides the Prometheus registry to record metrics
41+
PromMetrics *metrics.CtrlFuncMetrics
4042

4143
Logger logr.Logger
4244
}
@@ -63,6 +65,14 @@ func (h RequestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
6365
http.Error(w, err.Error(), http.StatusInternalServerError)
6466
return
6567
}
68+
69+
h.PromMetrics.RecordAdmissionCount(
70+
response.Allowed,
71+
fmt.Sprintf(
72+
"%s.%s/%s",
73+
review.Request.Resource.Resource, review.Request.Resource.Group, review.Request.Resource.Version,
74+
),
75+
)
6676
review.Response = response
6777

6878
if err := json.NewEncoder(w).Encode(&review); err != nil {

internal/dataplane/kong_client.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,13 @@ func NewKongClient(
169169
kongConfigBuilder KongConfigBuilder,
170170
cacheStores store.CacheStores,
171171
fallbackConfigGenerator FallbackConfigGenerator,
172+
prometheusMetrics *metrics.CtrlFuncMetrics,
172173
) (*KongClient, error) {
173174
c := &KongClient{
174175
logger: logger,
175176
requestTimeout: timeout,
176177
diagnostic: diagnostic,
177-
prometheusMetrics: metrics.NewCtrlFuncMetrics(),
178+
prometheusMetrics: prometheusMetrics,
178179
cache: &cacheStores,
179180
kongConfig: kongConfig,
180181
eventRecorder: eventRecorder,

internal/dataplane/kong_client_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ func setupTestKongClient(
733733
configBuilder,
734734
store.NewCacheStores(),
735735
newMockFallbackConfigGenerator(),
736+
metrics.NewCtrlFuncMetrics(),
736737
)
737738
require.NoError(t, err)
738739
return kongClient
@@ -1002,6 +1003,7 @@ func TestKongClient_FallbackConfiguration_SuccessfulRecovery(t *testing.T) {
10021003
configBuilder,
10031004
originalCache,
10041005
fallbackConfigGenerator,
1006+
metrics.NewCtrlFuncMetrics(),
10051007
)
10061008
require.NoError(t, err)
10071009

@@ -1114,6 +1116,7 @@ func TestKongClient_FallbackConfiguration_FailedRecovery(t *testing.T) {
11141116
configBuilder,
11151117
originalCache,
11161118
fallbackConfigGenerator,
1119+
metrics.NewCtrlFuncMetrics(),
11171120
)
11181121
require.NoError(t, err)
11191122

internal/manager/run.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"errors"
77
"fmt"
8+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
89
"net/http"
910
"net/url"
1011
"os"
@@ -185,7 +186,8 @@ func Run(
185186
}
186187

187188
setupLog.Info("Starting Admission Server")
188-
if err := setupAdmissionServer(ctx, c, clientsManager, referenceIndexers, mgr.GetClient(), logger, translatorFeatureFlags, storer); err != nil {
189+
promMetrics := metrics.NewCtrlFuncMetrics()
190+
if err := setupAdmissionServer(ctx, c, clientsManager, referenceIndexers, mgr.GetClient(), logger, translatorFeatureFlags, storer, promMetrics); err != nil {
189191
return err
190192
}
191193

@@ -207,6 +209,7 @@ func Run(
207209
configTranslator,
208210
cache,
209211
fallbackConfigGenerator,
212+
promMetrics,
210213
)
211214
if err != nil {
212215
return fmt.Errorf("failed to initialize kong data-plane client: %w", err)

internal/manager/setup.go

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
78
"io"
89
"time"
910

@@ -195,6 +196,7 @@ func setupAdmissionServer(
195196
logger logr.Logger,
196197
translatorFeatures translator.FeatureFlags,
197198
storer store.Storer,
199+
promMetrics *metrics.CtrlFuncMetrics,
198200
) error {
199201
admissionLogger := logger.WithName("admission-server")
200202

@@ -214,6 +216,7 @@ func setupAdmissionServer(
214216
storer,
215217
),
216218
ReferenceIndexers: referenceIndexers,
219+
PromMetrics: promMetrics,
217220
Logger: admissionLogger,
218221
}, admissionLogger)
219222
if err != nil {

internal/metrics/prometheus.go

+37
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66
"net"
7+
"strconv"
78
"sync"
89
"time"
910

@@ -27,6 +28,8 @@ type CtrlFuncMetrics struct {
2728
ConfigPushDuration *prometheus.HistogramVec
2829

2930
ConfigPushSuccessTime *prometheus.GaugeVec
31+
32+
AdmissionCount *prometheus.CounterVec
3033
}
3134

3235
const (
@@ -70,13 +73,24 @@ const (
7073
DataplaneKey string = "dataplane"
7174
)
7275

76+
const (
77+
// AllowedKey defines the key of the metric label indicating admission was allowed.
78+
AllowedKey string = "allowed"
79+
)
80+
81+
const (
82+
// AdmissionResourceKey defines the name of the metric label indicating which dataplane this time series is relevant for.
83+
AdmissionResourceKey string = "resource"
84+
)
85+
7386
const (
7487
MetricNameConfigPushCount = "ingress_controller_configuration_push_count"
7588
MetricNameConfigPushBrokenResources = "ingress_controller_configuration_push_broken_resource_count"
7689
MetricNameConfigPushSuccessTime = "ingress_controller_configuration_push_last_successful"
7790
MetricNameTranslationCount = "ingress_controller_translation_count"
7891
MetricNameTranslationBrokenResources = "ingress_controller_translation_broken_resource_count"
7992
MetricNameConfigPushDuration = "ingress_controller_configuration_push_duration_milliseconds"
93+
MetricNameAdmissionCount = "ingress_controller_admission_count"
8094
)
8195

8296
var _lock sync.Mutex
@@ -168,12 +182,27 @@ func NewCtrlFuncMetrics() *CtrlFuncMetrics {
168182
[]string{DataplaneKey},
169183
)
170184

185+
controllerMetrics.AdmissionCount = prometheus.NewCounterVec(
186+
prometheus.CounterOpts{
187+
Name: MetricNameAdmissionCount,
188+
Help: fmt.Sprintf(
189+
"Count of admissions processed by Kong. "+
190+
"`%s` describes wheter an admission was allowed. "+
191+
"`%s` describes the resouce under admission. ",
192+
AllowedKey,
193+
AdmissionResourceKey,
194+
),
195+
},
196+
[]string{AllowedKey, AdmissionResourceKey},
197+
)
198+
171199
metrics.Registry.Unregister(controllerMetrics.ConfigPushCount)
172200
metrics.Registry.Unregister(controllerMetrics.ConfigPushBrokenResources)
173201
metrics.Registry.Unregister(controllerMetrics.TranslationCount)
174202
metrics.Registry.Unregister(controllerMetrics.TranslationBrokenResources)
175203
metrics.Registry.Unregister(controllerMetrics.ConfigPushDuration)
176204
metrics.Registry.Unregister(controllerMetrics.ConfigPushSuccessTime)
205+
metrics.Registry.Unregister(controllerMetrics.AdmissionCount)
177206

178207
metrics.Registry.MustRegister(
179208
controllerMetrics.ConfigPushCount,
@@ -182,6 +211,7 @@ func NewCtrlFuncMetrics() *CtrlFuncMetrics {
182211
controllerMetrics.TranslationBrokenResources,
183212
controllerMetrics.ConfigPushDuration,
184213
controllerMetrics.ConfigPushSuccessTime,
214+
controllerMetrics.AdmissionCount,
185215
)
186216

187217
return controllerMetrics
@@ -223,6 +253,13 @@ func (c *CtrlFuncMetrics) RecordTranslationBrokenResources(count int) {
223253
c.TranslationBrokenResources.Set(float64(count))
224254
}
225255

256+
func (c *CtrlFuncMetrics) RecordAdmissionCount(allowed bool, resource string) {
257+
c.ConfigPushCount.With(prometheus.Labels{
258+
AllowedKey: strconv.FormatBool(allowed),
259+
AdmissionResourceKey: resource,
260+
}).Inc()
261+
}
262+
226263
type recordOption func(prometheus.Labels) prometheus.Labels
227264

228265
func withError(err error) recordOption {

0 commit comments

Comments
 (0)