Skip to content

Commit 3742c6d

Browse files
committed
Add collection of deployment replica count
1 parent dca4d64 commit 3742c6d

File tree

5 files changed

+73
-0
lines changed

5 files changed

+73
-0
lines changed

deploy/helm-chart/templates/rbac.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ rules:
2424
# FIXME(bjee19): make nodes permission dependent on telemetry being enabled.
2525
# https://github.com/nginxinc/nginx-gateway-fabric/issues/1317.
2626
- nodes
27+
- pods
2728
verbs:
2829
- list
2930
- watch
@@ -34,6 +35,13 @@ rules:
3435
verbs:
3536
- create
3637
- patch
38+
- apiGroups:
39+
- "apps"
40+
resources:
41+
- replicasets
42+
verbs:
43+
- list
44+
- watch
3745
- apiGroups:
3846
- discovery.k8s.io
3947
resources:

deploy/manifests/nginx-gateway.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ rules:
3535
# FIXME(bjee19): make nodes permission dependent on telemetry being enabled.
3636
# https://github.com/nginxinc/nginx-gateway-fabric/issues/1317.
3737
- nodes
38+
- pods
3839
verbs:
3940
- list
4041
- watch
@@ -45,6 +46,13 @@ rules:
4546
verbs:
4647
- create
4748
- patch
49+
- apiGroups:
50+
- "apps"
51+
resources:
52+
- replicasets
53+
verbs:
54+
- list
55+
- watch
4856
- apiGroups:
4957
- discovery.k8s.io
5058
resources:

internal/mode/static/manager.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/go-logr/logr"
99
ngxclient "github.com/nginxinc/nginx-plus-go-client/client"
1010
"github.com/prometheus/client_golang/prometheus"
11+
appsv1 "k8s.io/api/apps/v1"
1112
apiv1 "k8s.io/api/core/v1"
1213
discoveryV1 "k8s.io/api/discovery/v1"
1314
apiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -65,6 +66,7 @@ func init() {
6566
utilruntime.Must(discoveryV1.AddToScheme(scheme))
6667
utilruntime.Must(ngfAPI.AddToScheme(scheme))
6768
utilruntime.Must(apiext.AddToScheme(scheme))
69+
utilruntime.Must(appsv1.AddToScheme(scheme))
6870
}
6971

7072
// nolint:gocyclo
@@ -218,6 +220,10 @@ func StartManager(cfg config.Config) error {
218220
GraphGetter: processor,
219221
ConfigurationGetter: eventHandler,
220222
Version: cfg.Version,
223+
PodNSName: types.NamespacedName{
224+
Namespace: cfg.GatewayPodConfig.Namespace,
225+
Name: cfg.LeaderElection.Identity,
226+
},
221227
})
222228
if err = mgr.Add(createTelemetryJob(cfg, dataCollector, nginxChecker.getReadyCh())); err != nil {
223229
return fmt.Errorf("cannot register telemetry job: %w", err)

internal/mode/static/telemetry/collector.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"errors"
66
"fmt"
77

8+
appsv1 "k8s.io/api/apps/v1"
89
v1 "k8s.io/api/core/v1"
10+
"k8s.io/apimachinery/pkg/types"
911
"sigs.k8s.io/controller-runtime/pkg/client"
1012

1113
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/state/dataplane"
@@ -49,6 +51,7 @@ type Data struct {
4951
ProjectMetadata ProjectMetadata
5052
NodeCount int
5153
NGFResourceCounts NGFResourceCounts
54+
NGFReplicaCount int
5255
}
5356

5457
// DataCollectorConfig holds configuration parameters for DataCollectorImpl.
@@ -61,6 +64,8 @@ type DataCollectorConfig struct {
6164
ConfigurationGetter ConfigurationGetter
6265
// Version is the NGF version.
6366
Version string
67+
// PodNSName is the NamespacedName of the NGF Pod.
68+
PodNSName types.NamespacedName
6469
}
6570

6671
// DataCollectorImpl is am implementation of DataCollector.
@@ -89,13 +94,19 @@ func (c DataCollectorImpl) Collect(ctx context.Context) (Data, error) {
8994
return Data{}, fmt.Errorf("failed to collect NGF resource counts: %w", err)
9095
}
9196

97+
ngfReplicaCount, err := collectNGFReplicaCount(ctx, c.cfg.K8sClientReader, c.cfg.PodNSName)
98+
if err != nil {
99+
return Data{}, fmt.Errorf("failed to collect NGF replica count: %w", err)
100+
}
101+
92102
data := Data{
93103
NodeCount: nodeCount,
94104
NGFResourceCounts: graphResourceCount,
95105
ProjectMetadata: ProjectMetadata{
96106
Name: "NGF",
97107
Version: c.cfg.Version,
98108
},
109+
NGFReplicaCount: ngfReplicaCount,
99110
}
100111

101112
return data, nil
@@ -147,3 +158,36 @@ func collectGraphResourceCount(
147158

148159
return ngfResourceCounts, nil
149160
}
161+
162+
func collectNGFReplicaCount(ctx context.Context, k8sClient client.Reader, podNSName types.NamespacedName) (int, error) {
163+
var pod v1.Pod
164+
if err := k8sClient.Get(ctx,
165+
types.NamespacedName{Namespace: podNSName.Namespace, Name: podNSName.Name},
166+
&pod,
167+
); err != nil {
168+
return 0, err
169+
}
170+
171+
podOwnerRefs := pod.GetOwnerReferences()
172+
if podOwnerRefs == nil {
173+
return 0, fmt.Errorf("could not get owner reference of NGF Pod")
174+
}
175+
if len(podOwnerRefs) != 1 {
176+
return 0, fmt.Errorf("multiple owner references of NGF Pod")
177+
}
178+
179+
switch kind := podOwnerRefs[0].Kind; kind {
180+
case "ReplicaSet":
181+
var replicaSet appsv1.ReplicaSet
182+
if err := k8sClient.Get(ctx,
183+
types.NamespacedName{Namespace: podNSName.Namespace, Name: podOwnerRefs[0].Name},
184+
&replicaSet,
185+
); err != nil {
186+
return 0, err
187+
}
188+
189+
return int(*replicaSet.Spec.Replicas), nil
190+
default:
191+
return 0, fmt.Errorf("pod owner reference was not ReplicaSet, instead was %s", kind)
192+
}
193+
}

internal/mode/static/telemetry/collector_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ var _ = Describe("Collector", Ordered, func() {
4848
version string
4949
expData telemetry.Data
5050
ctx context.Context
51+
podNSName types.NamespacedName
5152
)
5253

5354
BeforeAll(func() {
@@ -60,11 +61,16 @@ var _ = Describe("Collector", Ordered, func() {
6061
ProjectMetadata: telemetry.ProjectMetadata{Name: "NGF", Version: version},
6162
NodeCount: 0,
6263
NGFResourceCounts: telemetry.NGFResourceCounts{},
64+
NGFReplicaCount: 0,
6365
}
6466

6567
k8sClientReader = &eventsfakes.FakeReader{}
6668
fakeGraphGetter = &telemetryfakes.FakeGraphGetter{}
6769
fakeConfigurationGetter = &telemetryfakes.FakeConfigurationGetter{}
70+
podNSName = types.NamespacedName{
71+
Namespace: "nginx-gateway",
72+
Name: "ngf-pod",
73+
}
6874

6975
fakeGraphGetter.GetLatestGraphReturns(&graph.Graph{})
7076
fakeConfigurationGetter.GetLatestConfigurationReturns(&dataplane.Configuration{})
@@ -74,6 +80,7 @@ var _ = Describe("Collector", Ordered, func() {
7480
GraphGetter: fakeGraphGetter,
7581
ConfigurationGetter: fakeConfigurationGetter,
7682
Version: version,
83+
PodNSName: podNSName,
7784
})
7885
})
7986

0 commit comments

Comments
 (0)