Skip to content

Commit 1aa355a

Browse files
authored
Merge pull request #2 from oracle/setup-prometheus-exporter
Setup prometheus exporter
2 parents 2bb9d0c + 77a1923 commit 1aa355a

File tree

27 files changed

+1076
-156
lines changed

27 files changed

+1076
-156
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ require (
1212
github.com/onsi/gomega v1.27.1
1313
github.com/oracle/oci-go-sdk/v65 v65.34.0
1414
github.com/pkg/errors v0.9.1
15+
github.com/prometheus/client_golang v1.14.0
1516
gopkg.in/yaml.v3 v3.0.1
1617
k8s.io/api v0.26.1
1718
k8s.io/apimachinery v0.26.1
1819
k8s.io/client-go v0.26.1
19-
k8s.io/klog/v2 v2.80.1
20+
k8s.io/klog/v2 v2.90.0
2021
sigs.k8s.io/controller-runtime v0.14.6
2122
)
2223

@@ -47,7 +48,6 @@ require (
4748
github.com/modern-go/reflect2 v1.0.2 // indirect
4849
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
4950
github.com/onsi/ginkgo/v2 v2.8.4 // indirect
50-
github.com/prometheus/client_golang v1.14.0 // indirect
5151
github.com/prometheus/client_model v0.3.0 // indirect
5252
github.com/prometheus/common v0.37.0 // indirect
5353
github.com/prometheus/procfs v0.8.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -593,8 +593,8 @@ k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu7
593593
k8s.io/client-go v0.26.1 h1:87CXzYJnAMGaa/IDDfRdhTzxk/wzGZ+/HUQpqgVSZXU=
594594
k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE=
595595
k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4=
596-
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
597-
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
596+
k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M=
597+
k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
598598
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E=
599599
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
600600
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=

helm/oci-native-ingress-controller/templates/deployment.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ spec:
6161
- --controller-class={{ .Values.controller_class }}
6262
- --compartment-id={{ .Values.compartment_id }}
6363
- --subnet-id={{ .Values.subnet_id }}
64+
- --metrics-backend={{.Values.metrics.backend}}
65+
- --metrics-port={{.Values.metrics.port}}
6466
- --v=4
6567
env:
6668
- name: OCI_RESOURCE_PRINCIPAL_VERSION
@@ -73,6 +75,8 @@ spec:
7375
- name: webhook-server
7476
containerPort: {{.Values.webhookBindPort}}
7577
protocol: TCP
78+
- name: metrics-server
79+
containerPort: 2223
7680
resources:
7781
{{- toYaml .Values.resources | nindent 12 }}
7882
volumeMounts:

helm/oci-native-ingress-controller/values.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,7 @@ objectSelector:
106106
# - <value>
107107
matchLabels:
108108
# key: value
109+
110+
metrics:
111+
backend: prometheus
112+
port: 2223

main.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ package main
1111
import (
1212
"context"
1313
"flag"
14+
"net/http"
1415
"os"
1516
"os/signal"
1617
"syscall"
1718
"time"
1819

20+
"github.com/oracle/oci-native-ingress-controller/pkg/metric"
1921
"github.com/oracle/oci-native-ingress-controller/pkg/server"
2022
"github.com/oracle/oci-native-ingress-controller/pkg/types"
2123
"k8s.io/klog/v2"
@@ -51,6 +53,8 @@ func main() {
5153
flag.StringVar(&opts.ControllerClass, "controller-class", "oci.oraclecloud.com/native-ingress-controller", "the controller class name")
5254
flag.StringVar(&opts.AuthType, "authType", "instance", "The auth type to be used - supported values : user, instance(Default).")
5355
flag.StringVar(&opts.AuthSecretName, "auth-secret-name", "", "Secret name used for auth, cannot be empty if authType is user principal")
56+
flag.StringVar(&opts.MetricsBackend, "metrics-backend", "prometheus", "Backend used for metrics")
57+
flag.IntVar(&opts.MetricsPort, "metrics-port", 2223, "Metrics port for metrics backend")
5458
flag.Parse()
5559

5660
if opts.LeaseLockName == "" {
@@ -157,9 +161,12 @@ func main() {
157161
}
158162

159163
server.SetupWebhookServer(ingressInformer, serviceInformer, client, ctx)
164+
mux := http.NewServeMux()
165+
reg, err := server.SetupMetricsServer(opts.MetricsBackend, opts.MetricsPort, mux, ctx)
160166

161-
run := server.SetUpControllers(opts, ingressClassInformer, ingressInformer, client, serviceInformer, endpointInformer, podInformer, c)
167+
run := server.SetUpControllers(opts, ingressClassInformer, ingressInformer, client, serviceInformer, endpointInformer, podInformer, c, reg)
162168

169+
metric.ServeMetrics(opts.MetricsPort, mux)
163170
// we use the Lease lock type since edits to Leases are less common
164171
// and fewer objects in the cluster watch "all Leases".
165172
lock := &resourcelock.LeaseLock{

pkg/controllers/ingress/ingress.go

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"context"
1414
"encoding/json"
1515
"fmt"
16+
"github.com/prometheus/client_golang/prometheus"
1617
"reflect"
1718
"time"
1819

@@ -23,6 +24,7 @@ import (
2324

2425
"github.com/oracle/oci-native-ingress-controller/pkg/certificate"
2526
"github.com/oracle/oci-native-ingress-controller/pkg/loadbalancer"
27+
"github.com/oracle/oci-native-ingress-controller/pkg/metric"
2628
"github.com/oracle/oci-native-ingress-controller/pkg/state"
2729
"github.com/oracle/oci-native-ingress-controller/pkg/util"
2830

@@ -60,18 +62,14 @@ type Controller struct {
6062

6163
lbClient *loadbalancer.LoadBalancerClient
6264
certificatesClient *certificate.CertificatesClient
65+
metricsCollector *metric.IngressCollector
6366
}
6467

6568
// NewController creates a new Controller.
66-
func NewController(
67-
controllerClass string,
68-
defaultCompartmentId string,
69-
ingressClassInformer networkinginformers.IngressClassInformer,
70-
ingressInformer networkinginformers.IngressInformer,
71-
client kubernetes.Interface,
72-
lbClient *loadbalancer.LoadBalancerClient,
73-
certificatesClient *certificate.CertificatesClient,
74-
) *Controller {
69+
func NewController(controllerClass string, defaultCompartmentId string,
70+
ingressClassInformer networkinginformers.IngressClassInformer, ingressInformer networkinginformers.IngressInformer,
71+
client kubernetes.Interface, lbClient *loadbalancer.LoadBalancerClient, certificatesClient *certificate.CertificatesClient,
72+
reg *prometheus.Registry) *Controller {
7573

7674
c := &Controller{
7775
controllerClass: controllerClass,
@@ -84,6 +82,7 @@ func NewController(
8482
lbClient: lbClient,
8583
certificatesClient: certificatesClient,
8684
queue: workqueue.NewRateLimitingQueue(workqueue.NewItemExponentialFailureRateLimiter(10*time.Second, 5*time.Minute)),
85+
metricsCollector: metric.NewIngressCollector(controllerClass, reg),
8786
}
8887

8988
ingressInformer.Informer().AddEventHandler(
@@ -103,17 +102,18 @@ func (c *Controller) enqueueIngress(ingress *networkingv1.Ingress) {
103102
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", ingress, err))
104103
return
105104
}
106-
107105
c.queue.Add(key)
108106
}
109107

110108
func (c *Controller) ingressAdd(obj interface{}) {
109+
c.metricsCollector.IncrementIngressAddOperation()
111110
ic := obj.(*networkingv1.Ingress)
112111
klog.V(4).InfoS("Adding ingress", "ingress", klog.KObj(ic))
113112
c.enqueueIngress(ic)
114113
}
115114

116115
func (c *Controller) ingressUpdate(old, new interface{}) {
116+
c.metricsCollector.IncrementIngressUpdateOperation()
117117
oldIngress := old.(*networkingv1.Ingress)
118118
newIngress := new.(*networkingv1.Ingress)
119119

@@ -122,6 +122,7 @@ func (c *Controller) ingressUpdate(old, new interface{}) {
122122
}
123123

124124
func (c *Controller) ingressDelete(obj interface{}) {
125+
c.metricsCollector.IncrementIngressDeleteOperation()
125126
ic, ok := obj.(*networkingv1.Ingress)
126127
if !ok {
127128
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
@@ -151,16 +152,23 @@ func (c *Controller) processNextItem() bool {
151152
// parallel.
152153
defer c.queue.Done(key)
153154

155+
// ingress_sync_time
156+
startBuildTime := util.GetCurrentTimeInUnixMillis()
157+
154158
// Invoke the method containing the business logic
155159
err := c.sync(key.(string))
156160

161+
endBuildTime := util.GetCurrentTimeInUnixMillis()
162+
c.metricsCollector.AddIngressSyncTime(util.GetTimeDifferenceInSeconds(startBuildTime, endBuildTime))
163+
157164
// Handle the error if something went wrong during the execution of the business logic
158165
c.handleErr(err, key)
159166
return true
160167
}
161168

162169
// sync is the business logic of the controller.
163170
func (c *Controller) sync(key string) error {
171+
c.metricsCollector.IncrementSyncCount()
164172
namespace, name, err := cache.SplitMetaNamespaceKey(key)
165173
if err != nil {
166174
klog.ErrorS(err, "Failed to split meta namespace cache key", "cacheKey", key)
@@ -285,7 +293,7 @@ func (c *Controller) ensureLoadBalancerIP(lbID string, ingress *networkingv1.Ing
285293
func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *networkingv1.IngressClass) error {
286294

287295
klog.Infof("Processing ingress %s/%s", ingressClass.Name, ingress.Name)
288-
stateStore := state.NewStateStore(c.ingressClassLister, c.ingressLister, c.serviceLister)
296+
stateStore := state.NewStateStore(c.ingressClassLister, c.ingressLister, c.serviceLister, c.metricsCollector)
289297
ingressConfigError := stateStore.BuildState(ingressClass)
290298

291299
if ingressConfigError != nil {
@@ -316,6 +324,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
316324
backendSetsToCreate := desiredBackendSets.Difference(actualBackendSets)
317325

318326
for _, bsName := range backendSetsToCreate.List() {
327+
startBuildTime := util.GetCurrentTimeInUnixMillis()
319328
klog.V(2).InfoS("creating backend set for ingress", "ingress", klog.KObj(ingress), "backendSetName", bsName)
320329
artifact, artifactType := stateStore.GetTLSConfigForBackendSet(bsName)
321330
backendSetSslConfig, err := getSSLConfigForBackendSet(ingress.Namespace, artifactType, artifact, lb, bsName, c)
@@ -329,6 +338,8 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
329338
if err != nil {
330339
return err
331340
}
341+
endBuildTime := util.GetCurrentTimeInUnixMillis()
342+
c.metricsCollector.AddBackendCreationTime(util.GetTimeDifferenceInSeconds(startBuildTime, endBuildTime))
332343
}
333344

334345
// Determine listeners... This is based off path ports.
@@ -380,7 +391,7 @@ func (c *Controller) ensureIngress(ingress *networkingv1.Ingress, ingressClass *
380391
}
381392

382393
func handleIngressDelete(c *Controller, ingressClass *networkingv1.IngressClass) error {
383-
stateStore := state.NewStateStore(c.ingressClassLister, c.ingressLister, c.serviceLister)
394+
stateStore := state.NewStateStore(c.ingressClassLister, c.ingressLister, c.serviceLister, c.metricsCollector)
384395
ingressConfigError := stateStore.BuildState(ingressClass)
385396

386397
if ingressConfigError != nil {
@@ -577,6 +588,7 @@ func getSSLConfigForListener(namespace string, listener *ociloadbalancer.Listene
577588
}
578589

579590
func syncListener(namespace string, stateStore *state.StateStore, lbId *string, listenerName string, c *Controller) error {
591+
startTime := util.GetCurrentTimeInUnixMillis()
580592
lb, etag, err := c.lbClient.GetLoadBalancer(context.TODO(), *lbId)
581593
if err != nil {
582594
return err
@@ -617,10 +629,14 @@ func syncListener(namespace string, stateStore *state.StateStore, lbId *string,
617629
return err
618630
}
619631
}
632+
endTime := util.GetCurrentTimeInUnixMillis()
633+
c.metricsCollector.AddIngressListenerSyncTime(util.GetTimeDifferenceInSeconds(startTime, endTime))
620634
return nil
621635
}
622636

623637
func syncBackendSet(ingress *networkingv1.Ingress, lbID string, backendSetName string, stateStore *state.StateStore, c *Controller) error {
638+
639+
startTime := util.GetCurrentTimeInUnixMillis()
624640
lb, etag, err := c.lbClient.GetLoadBalancer(context.TODO(), lbID)
625641
if err != nil {
626642
return err
@@ -665,6 +681,8 @@ func syncBackendSet(ingress *networkingv1.Ingress, lbID string, backendSetName s
665681
}
666682
}
667683

684+
endTime := util.GetCurrentTimeInUnixMillis()
685+
c.metricsCollector.AddIngressBackendSyncTime(util.GetTimeDifferenceInSeconds(startTime, endTime))
668686
return nil
669687
}
670688

0 commit comments

Comments
 (0)