@@ -2,31 +2,48 @@ package lbc
22
33import (
44 "context"
5+ awssdk "github.com/aws/aws-sdk-go-v2/aws"
6+ rgtsdk "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
7+ rgttypes "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi/types"
58 "github.com/prometheus/client_golang/prometheus"
69 corev1 "k8s.io/api/core/v1"
710 networkingv1 "k8s.io/api/networking/v1"
811 elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
12+ "sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
913 "strings"
1014
1115 "sigs.k8s.io/controller-runtime/pkg/client"
1216 "time"
1317)
1418
15- const networkLoadBalancerStr = "nlb"
19+ const (
20+ networkLoadBalancerStr = "nlb"
21+ resourceTypeALB = "elasticloadbalancing:loadbalancer/app"
22+ resourceTypeNLB = "elasticloadbalancing:loadbalancer/net"
23+ )
1624
1725type MetricCollector interface {
1826 // ObservePodReadinessGateReady this metric is useful to determine how fast pods are becoming ready in the load balancer.
1927 // Due to some architectural constraints, we can only emit this metric for pods that are using readiness gates.
2028 ObservePodReadinessGateReady (namespace string , tgbName string , duration time.Duration )
2129
22- // UpdateMetrics fetches and updates all relevant metrics.
30+ // UpdateManagedK8sResourceMetrics fetches and updates managed k8s resources metrics.
2331 UpdateManagedK8sResourceMetrics (ctx context.Context ) error
32+
33+ // UpdateManagedALBMetrics updates managed ALB count metrics
34+ UpdateManagedALBMetrics (ctx context.Context ) error
35+
36+ //UpdateManagedNLBMetrics updates managed NLB count metrics
37+ UpdateManagedNLBMetrics (ctx context.Context ) error
2438}
2539
2640type collector struct {
2741 instruments * instruments
2842 runtimeClient client.Client
43+ rgt services.RGT
2944 finalizerKeyWord string
45+ clusterTagKey string
46+ clusterTagVal string
3047}
3148
3249type noOpCollector struct {}
@@ -38,7 +55,15 @@ func (n *noOpCollector) UpdateManagedK8sResourceMetrics(_ context.Context) error
3855 return nil
3956}
4057
41- func NewCollector (registerer prometheus.Registerer , runtimeClient client.Client , finalizerKeyWord string ) MetricCollector {
58+ func (n * noOpCollector ) UpdateManagedALBMetrics (_ context.Context ) error {
59+ return nil
60+ }
61+
62+ func (n * noOpCollector ) UpdateManagedNLBMetrics (_ context.Context ) error {
63+ return nil
64+ }
65+
66+ func NewCollector (registerer prometheus.Registerer , runtimeClient client.Client , rgt services.RGT , finalizerKeyWord string , clusterTagKey string , clusterTagVal string ) MetricCollector {
4267 if registerer == nil || runtimeClient == nil {
4368 return & noOpCollector {}
4469 }
@@ -47,7 +72,10 @@ func NewCollector(registerer prometheus.Registerer, runtimeClient client.Client,
4772 return & collector {
4873 instruments : instruments ,
4974 runtimeClient : runtimeClient ,
75+ rgt : rgt ,
5076 finalizerKeyWord : finalizerKeyWord ,
77+ clusterTagKey : clusterTagKey ,
78+ clusterTagVal : clusterTagVal ,
5179 }
5280}
5381
@@ -77,7 +105,7 @@ func (c *collector) UpdateManagedK8sResourceMetrics(ctx context.Context) error {
77105 }
78106 }
79107 }
80- c .instruments .ingressCount .Set (float64 (ingressCount ))
108+ c .instruments .managedIngressCount .Set (float64 (ingressCount ))
81109
82110 // Fetch service count
83111 serviceList := & corev1.ServiceList {}
@@ -98,7 +126,7 @@ func (c *collector) UpdateManagedK8sResourceMetrics(ctx context.Context) error {
98126 serviceCount ++
99127 }
100128 }
101- c .instruments .serviceCount .Set (float64 (serviceCount ))
129+ c .instruments .managedServiceCount .Set (float64 (serviceCount ))
102130
103131 // Fetch TargetGroupBinding count
104132 tgbList := & elbv2api.TargetGroupBindingList {}
@@ -114,7 +142,42 @@ func (c *collector) UpdateManagedK8sResourceMetrics(ctx context.Context) error {
114142 }
115143 }
116144 }
117- c .instruments .tgbCount .Set (float64 (tgbCount ))
145+ c .instruments .managedTGBCount .Set (float64 (tgbCount ))
146+
147+ return nil
148+ }
149+
150+ func (c * collector ) UpdateManagedALBMetrics (ctx context.Context ) error {
151+ count , err := c .getManagedAWSResourceMetrics (ctx , resourceTypeALB )
152+ if err != nil {
153+ return err
154+ }
155+ c .instruments .managedALBCount .Set (float64 (count ))
156+ return nil
157+ }
118158
159+ func (c * collector ) UpdateManagedNLBMetrics (ctx context.Context ) error {
160+ count , err := c .getManagedAWSResourceMetrics (ctx , resourceTypeNLB )
161+ if err != nil {
162+ return err
163+ }
164+ c .instruments .managedNLBCount .Set (float64 (count ))
119165 return nil
120166}
167+
168+ func (c * collector ) getManagedAWSResourceMetrics (ctx context.Context , resourceType string ) (count int , err error ) {
169+ req := & rgtsdk.GetResourcesInput {
170+ ResourceTypeFilters : []string {resourceType },
171+ TagFilters : []rgttypes.TagFilter {
172+ {
173+ Key : awssdk .String (c .clusterTagKey ),
174+ Values : []string {c .clusterTagVal },
175+ },
176+ },
177+ }
178+ resources , err := c .rgt .GetResourcesAsList (ctx , req )
179+ if err != nil {
180+ return 0 , err
181+ }
182+ return len (resources ), nil
183+ }
0 commit comments