Skip to content

Commit 3fe87b9

Browse files
committed
feat: add counter for admissions
Signed-off-by: David Weber <david.weber@w3tec.ch> Signed-off-by: David Weber <david.weber.schenker@gmail.com>
1 parent c8bbd08 commit 3fe87b9

File tree

8 files changed

+63
-2
lines changed

8 files changed

+63
-2
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ Adding a new version? You'll need three changes:
202202
[#6048](https://github.com/Kong/kubernetes-ingress-controller/pull/6048)
203203
- Add support for Gateway API GRPCRoute and pass related Gateway API conformance test.
204204
[#5776](https://github.com/Kong/kubernetes-ingress-controller/pull/5776)
205+
- Added new metric for Prometheus called `ingress_controller_admission_count`. It's a counter and has two labels
206+
`allowed` to indicate if the resource was allowed and `resource` to indicate the resource under admission.
207+
[#6084](https://github.com/Kong/kubernetes-ingress-controller/issues/6084)
205208

206209
### Fixed
207210

internal/admission/handler.go

+11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
ctrlref "github.com/kong/kubernetes-ingress-controller/v3/internal/controllers/reference"
1717
"github.com/kong/kubernetes-ingress-controller/v3/internal/gatewayapi"
1818
"github.com/kong/kubernetes-ingress-controller/v3/internal/labels"
19+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
1920
"github.com/kong/kubernetes-ingress-controller/v3/internal/util"
2021
kongv1 "github.com/kong/kubernetes-ingress-controller/v3/pkg/apis/configuration/v1"
2122
kongv1alpha1 "github.com/kong/kubernetes-ingress-controller/v3/pkg/apis/configuration/v1alpha1"
@@ -37,6 +38,8 @@ type RequestHandler struct {
3738
// referring the validated resource (Secret) to check the changes on
3839
// referred Secret will produce invalid configuration of the plugins.
3940
ReferenceIndexers ctrlref.CacheIndexers
41+
// PromMetrics provides the Prometheus registry to record metrics
42+
PromMetrics *metrics.CtrlFuncMetrics
4043

4144
Logger logr.Logger
4245
}
@@ -63,6 +66,14 @@ func (h RequestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
6366
http.Error(w, err.Error(), http.StatusInternalServerError)
6467
return
6568
}
69+
70+
h.PromMetrics.RecordAdmissionCount(
71+
response.Allowed,
72+
fmt.Sprintf(
73+
"%s.%s/%s",
74+
review.Request.Resource.Resource, review.Request.Resource.Group, review.Request.Resource.Version,
75+
),
76+
)
6677
review.Response = response
6778

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

internal/dataplane/kong_client.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,13 @@ func NewKongClient(
197197
kongConfigBuilder KongConfigBuilder,
198198
cacheStores store.CacheStores,
199199
fallbackConfigGenerator FallbackConfigGenerator,
200+
prometheusMetrics *metrics.CtrlFuncMetrics,
200201
) (*KongClient, error) {
201202
c := &KongClient{
202203
logger: logger,
203204
requestTimeout: timeout,
204205
diagnostic: diagnostic,
205-
prometheusMetrics: metrics.NewCtrlFuncMetrics(),
206+
prometheusMetrics: prometheusMetrics,
206207
cache: &cacheStores,
207208
kongConfig: kongConfig,
208209
eventRecorder: eventRecorder,

internal/dataplane/kong_client_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,7 @@ func setupTestKongClient(
939939
configBuilder,
940940
store.NewCacheStores(),
941941
newMockFallbackConfigGenerator(),
942+
metrics.NewCtrlFuncMetrics(),
942943
)
943944
require.NoError(t, err)
944945
return kongClient
@@ -1386,6 +1387,7 @@ func TestKongClient_FallbackConfiguration_SkipMakingRedundantSnapshot(t *testing
13861387
configBuilder,
13871388
originalCache,
13881389
fallbackConfigGenerator,
1390+
metrics.NewCtrlFuncMetrics(),
13891391
)
13901392
require.NoError(t, err)
13911393

@@ -1451,6 +1453,7 @@ func TestKongClient_FallbackConfiguration_FailedRecovery(t *testing.T) {
14511453
configBuilder,
14521454
originalCache,
14531455
fallbackConfigGenerator,
1456+
metrics.NewCtrlFuncMetrics(),
14541457
)
14551458
require.NoError(t, err)
14561459

internal/manager/run.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/kong/kubernetes-ingress-controller/v3/internal/manager/metadata"
3838
"github.com/kong/kubernetes-ingress-controller/v3/internal/manager/telemetry"
3939
"github.com/kong/kubernetes-ingress-controller/v3/internal/manager/utils/kongconfig"
40+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
4041
"github.com/kong/kubernetes-ingress-controller/v3/internal/store"
4142
"github.com/kong/kubernetes-ingress-controller/v3/internal/util"
4243
"github.com/kong/kubernetes-ingress-controller/v3/internal/util/kubernetes/object/status"
@@ -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
@@ -34,6 +34,7 @@ import (
3434
konnectLicense "github.com/kong/kubernetes-ingress-controller/v3/internal/konnect/license"
3535
"github.com/kong/kubernetes-ingress-controller/v3/internal/license"
3636
"github.com/kong/kubernetes-ingress-controller/v3/internal/manager/scheme"
37+
"github.com/kong/kubernetes-ingress-controller/v3/internal/metrics"
3738
"github.com/kong/kubernetes-ingress-controller/v3/internal/store"
3839
"github.com/kong/kubernetes-ingress-controller/v3/internal/util"
3940
"github.com/kong/kubernetes-ingress-controller/v3/internal/util/kubernetes/object/status"
@@ -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

+36
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

@@ -23,6 +24,7 @@ type CtrlFuncMetrics struct {
2324
TranslationBrokenResources prometheus.Gauge
2425
ConfigPushDuration *prometheus.HistogramVec
2526
ConfigPushSuccessTime *prometheus.GaugeVec
27+
AdmissionCount *prometheus.CounterVec
2628

2729
// Fallback config push metrics.
2830
FallbackTranslationCount *prometheus.CounterVec
@@ -77,6 +79,17 @@ const (
7779
DataplaneKey string = "dataplane"
7880
)
7981

82+
// Regular config push metrics names.
83+
const (
84+
// AllowedKey defines the key of the metric label indicating admission was allowed.
85+
AllowedKey string = "allowed"
86+
)
87+
88+
const (
89+
// AdmissionResourceKey defines the name of the metric label indicating which dataplane this time series is relevant for.
90+
AdmissionResourceKey string = "resource"
91+
)
92+
8093
// Regular config push metrics names.
8194
const (
8295
MetricNameConfigPushCount = "ingress_controller_configuration_push_count"
@@ -85,6 +98,7 @@ const (
8598
MetricNameTranslationCount = "ingress_controller_translation_count"
8699
MetricNameTranslationBrokenResources = "ingress_controller_translation_broken_resource_count"
87100
MetricNameConfigPushDuration = "ingress_controller_configuration_push_duration_milliseconds"
101+
MetricNameAdmissionCount = "ingress_controller_admission_count"
88102
)
89103

90104
// Fallback config push metrics names.
@@ -189,6 +203,20 @@ func NewCtrlFuncMetrics() *CtrlFuncMetrics {
189203
[]string{DataplaneKey},
190204
)
191205

206+
controllerMetrics.AdmissionCount = prometheus.NewCounterVec(
207+
prometheus.CounterOpts{
208+
Name: MetricNameAdmissionCount,
209+
Help: fmt.Sprintf(
210+
"Count of admissions processed by Kong. "+
211+
"`%s` describes whether an admission was allowed. "+
212+
"`%s` describes the resource under admission. ",
213+
AllowedKey,
214+
AdmissionResourceKey,
215+
),
216+
},
217+
[]string{AllowedKey, AdmissionResourceKey},
218+
)
219+
192220
controllerMetrics.FallbackTranslationCount = prometheus.NewCounterVec(
193221
prometheus.CounterOpts{
194222
Name: MetricNameFallbackTranslationCount,
@@ -302,6 +330,7 @@ func NewCtrlFuncMetrics() *CtrlFuncMetrics {
302330
controllerMetrics.TranslationBrokenResources,
303331
controllerMetrics.ConfigPushDuration,
304332
controllerMetrics.ConfigPushSuccessTime,
333+
controllerMetrics.AdmissionCount,
305334
controllerMetrics.FallbackTranslationBrokenResources,
306335
controllerMetrics.FallbackTranslationCount,
307336
controllerMetrics.FallbackConfigPushCount,
@@ -356,6 +385,13 @@ func (c *CtrlFuncMetrics) RecordTranslationBrokenResources(count int) {
356385
c.TranslationBrokenResources.Set(float64(count))
357386
}
358387

388+
func (c *CtrlFuncMetrics) RecordAdmissionCount(allowed bool, resource string) {
389+
c.ConfigPushCount.With(prometheus.Labels{
390+
AllowedKey: strconv.FormatBool(allowed),
391+
AdmissionResourceKey: resource,
392+
}).Inc()
393+
}
394+
359395
// RecordFallbackTranslationFailure records a failed fallback configuration translation.
360396
func (c *CtrlFuncMetrics) RecordFallbackTranslationFailure() {
361397
c.FallbackTranslationCount.With(prometheus.Labels{

test/envtest/metrics_envtest_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func TestMetricsAreServed(t *testing.T) {
7070
metrics.MetricNameTranslationBrokenResources,
7171
metrics.MetricNameConfigPushDuration,
7272
metrics.MetricNameConfigPushSuccessTime,
73+
metrics.MetricNameAdmissionCount,
7374
},
7475
},
7576
}

0 commit comments

Comments
 (0)