Skip to content

Commit 8884c70

Browse files
authored
Collect ClientSettingsPolicy, ObservabilityPolicy, and NginxProxy count (#2179)
Collect count for ClientSettingsPolicies attached at the Gateway level, ClientSettingsPolicies attached at the Route level, ObservabilityPolicies, and NginxProxy. Problem: I want to collect the number of ClientSettings, Observability, and NginxProxy Policies used in NGF for each context they are used in. Solution: Collect the counts of the resources. Testing: Manual testing and addition to unit tests.
1 parent 6061483 commit 8884c70

File tree

7 files changed

+147
-31
lines changed

7 files changed

+147
-31
lines changed

internal/mode/static/telemetry/collector.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
k8sversion "k8s.io/apimachinery/pkg/util/version"
1515
"sigs.k8s.io/controller-runtime/pkg/client"
1616

17+
"github.com/nginxinc/nginx-gateway-fabric/internal/framework/kinds"
1718
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/config"
1819
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/state/dataplane"
1920
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/state/graph"
@@ -71,6 +72,15 @@ type NGFResourceCounts struct {
7172
GRPCRouteCount int64
7273
// BackendTLSPolicyCount is the number of relevant BackendTLSPolicies.
7374
BackendTLSPolicyCount int64
75+
// GatewayAttachedClientSettingsPolicyCount is the number of relevant ClientSettingsPolicies
76+
// attached at the Gateway level.
77+
GatewayAttachedClientSettingsPolicyCount int64
78+
// RouteAttachedClientSettingsPolicyCount is the number of relevant ClientSettingsPolicies attached at the Route level.
79+
RouteAttachedClientSettingsPolicyCount int64
80+
// ObservabilityPolicyCount is the number of relevant ObservabilityPolicies.
81+
ObservabilityPolicyCount int64
82+
// NginxProxyCount is the number of NginxProxies.
83+
NginxProxyCount int64
7484
}
7585

7686
// DataCollectorConfig holds configuration parameters for DataCollectorImpl.
@@ -190,6 +200,27 @@ func collectGraphResourceCount(
190200

191201
ngfResourceCounts.BackendTLSPolicyCount = int64(len(g.BackendTLSPolicies))
192202

203+
for policyKey, policy := range g.NGFPolicies {
204+
switch policyKey.GVK.Kind {
205+
case kinds.ClientSettingsPolicy:
206+
if len(policy.TargetRefs) == 0 {
207+
continue
208+
}
209+
210+
if policy.TargetRefs[0].Kind == kinds.Gateway {
211+
ngfResourceCounts.GatewayAttachedClientSettingsPolicyCount++
212+
} else {
213+
ngfResourceCounts.RouteAttachedClientSettingsPolicyCount++
214+
}
215+
case kinds.ObservabilityPolicy:
216+
ngfResourceCounts.ObservabilityPolicyCount++
217+
}
218+
}
219+
220+
if g.NginxProxy != nil {
221+
ngfResourceCounts.NginxProxyCount = 1
222+
}
223+
193224
return ngfResourceCounts, nil
194225
}
195226

internal/mode/static/telemetry/collector_test.go

Lines changed: 74 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ import (
1212
appsv1 "k8s.io/api/apps/v1"
1313
v1 "k8s.io/api/core/v1"
1414
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
"k8s.io/apimachinery/pkg/runtime/schema"
1516
"k8s.io/apimachinery/pkg/types"
1617
"sigs.k8s.io/controller-runtime/pkg/client"
1718
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
1819

1920
"github.com/nginxinc/nginx-gateway-fabric/internal/framework/events/eventsfakes"
21+
"github.com/nginxinc/nginx-gateway-fabric/internal/framework/kinds"
2022
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/config"
2123
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/state/dataplane"
2224
"github.com/nginxinc/nginx-gateway-fabric/internal/mode/static/state/graph"
@@ -304,6 +306,25 @@ var _ = Describe("Collector", Ordered, func() {
304306
{Namespace: "test", Name: "backendTLSPolicy-2"}: {},
305307
{Namespace: "test", Name: "backendTLSPolicy-3"}: {},
306308
},
309+
NGFPolicies: map[graph.PolicyKey]*graph.Policy{
310+
{
311+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-1"},
312+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
313+
}: {TargetRefs: []graph.PolicyTargetRef{{Kind: kinds.Gateway}}},
314+
{
315+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-2"},
316+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
317+
}: {TargetRefs: []graph.PolicyTargetRef{{Kind: kinds.HTTPRoute}}},
318+
{
319+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-3"},
320+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
321+
}: {TargetRefs: []graph.PolicyTargetRef{{Kind: kinds.GRPCRoute}}},
322+
{
323+
NsName: types.NamespacedName{Namespace: "test", Name: "ObservabilityPolicy-1"},
324+
GVK: schema.GroupVersionKind{Kind: kinds.ObservabilityPolicy},
325+
}: {},
326+
},
327+
NginxProxy: &graph.NginxProxy{},
307328
}
308329

309330
config := &dataplane.Configuration{
@@ -342,14 +363,18 @@ var _ = Describe("Collector", Ordered, func() {
342363

343364
expData.ClusterNodeCount = 3
344365
expData.NGFResourceCounts = telemetry.NGFResourceCounts{
345-
GatewayCount: 3,
346-
GatewayClassCount: 3,
347-
HTTPRouteCount: 3,
348-
SecretCount: 3,
349-
ServiceCount: 3,
350-
EndpointCount: 4,
351-
GRPCRouteCount: 2,
352-
BackendTLSPolicyCount: 3,
366+
GatewayCount: 3,
367+
GatewayClassCount: 3,
368+
HTTPRouteCount: 3,
369+
SecretCount: 3,
370+
ServiceCount: 3,
371+
EndpointCount: 4,
372+
GRPCRouteCount: 2,
373+
BackendTLSPolicyCount: 3,
374+
GatewayAttachedClientSettingsPolicyCount: 1,
375+
RouteAttachedClientSettingsPolicyCount: 2,
376+
ObservabilityPolicyCount: 1,
377+
NginxProxyCount: 1,
353378
}
354379
expData.ClusterVersion = "1.29.2"
355380
expData.ClusterPlatform = "kind"
@@ -495,6 +520,25 @@ var _ = Describe("Collector", Ordered, func() {
495520
ReferencedServices: map[types.NamespacedName]struct{}{
496521
client.ObjectKeyFromObject(svc): {},
497522
},
523+
NGFPolicies: map[graph.PolicyKey]*graph.Policy{
524+
{
525+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-1"},
526+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
527+
}: {TargetRefs: []graph.PolicyTargetRef{{Kind: kinds.Gateway}}},
528+
{
529+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-2"},
530+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
531+
}: {TargetRefs: []graph.PolicyTargetRef{{Kind: kinds.HTTPRoute}}},
532+
{
533+
NsName: types.NamespacedName{Namespace: "test", Name: "ClientSettingsPolicy-empty"},
534+
GVK: schema.GroupVersionKind{Kind: kinds.ClientSettingsPolicy},
535+
}: {},
536+
{
537+
NsName: types.NamespacedName{Namespace: "test", Name: "ObservabilityPolicy-1"},
538+
GVK: schema.GroupVersionKind{Kind: kinds.ObservabilityPolicy},
539+
}: {},
540+
},
541+
NginxProxy: &graph.NginxProxy{},
498542
}
499543

500544
config1 = &dataplane.Configuration{
@@ -557,12 +601,16 @@ var _ = Describe("Collector", Ordered, func() {
557601
fakeConfigurationGetter.GetLatestConfigurationReturns(config1)
558602

559603
expData.NGFResourceCounts = telemetry.NGFResourceCounts{
560-
GatewayCount: 1,
561-
GatewayClassCount: 1,
562-
HTTPRouteCount: 1,
563-
SecretCount: 1,
564-
ServiceCount: 1,
565-
EndpointCount: 1,
604+
GatewayCount: 1,
605+
GatewayClassCount: 1,
606+
HTTPRouteCount: 1,
607+
SecretCount: 1,
608+
ServiceCount: 1,
609+
EndpointCount: 1,
610+
GatewayAttachedClientSettingsPolicyCount: 1,
611+
RouteAttachedClientSettingsPolicyCount: 1,
612+
ObservabilityPolicyCount: 1,
613+
NginxProxyCount: 1,
566614
}
567615

568616
data, err := dataCollector.Collect(ctx)
@@ -575,14 +623,18 @@ var _ = Describe("Collector", Ordered, func() {
575623
fakeGraphGetter.GetLatestGraphReturns(&graph.Graph{})
576624
fakeConfigurationGetter.GetLatestConfigurationReturns(invalidUpstreamsConfig)
577625
expData.NGFResourceCounts = telemetry.NGFResourceCounts{
578-
GatewayCount: 0,
579-
GatewayClassCount: 0,
580-
HTTPRouteCount: 0,
581-
SecretCount: 0,
582-
ServiceCount: 0,
583-
EndpointCount: 0,
584-
GRPCRouteCount: 0,
585-
BackendTLSPolicyCount: 0,
626+
GatewayCount: 0,
627+
GatewayClassCount: 0,
628+
HTTPRouteCount: 0,
629+
SecretCount: 0,
630+
ServiceCount: 0,
631+
EndpointCount: 0,
632+
GRPCRouteCount: 0,
633+
BackendTLSPolicyCount: 0,
634+
GatewayAttachedClientSettingsPolicyCount: 0,
635+
RouteAttachedClientSettingsPolicyCount: 0,
636+
ObservabilityPolicyCount: 0,
637+
NginxProxyCount: 0,
586638
}
587639

588640
data, err := dataCollector.Collect(ctx)

internal/mode/static/telemetry/data.avdl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ Each value is either 'true' or 'false' for boolean flags and 'default' or 'user-
6868
/** BackendTLSPolicyCount is the number of relevant BackendTLSPolicies. */
6969
long? BackendTLSPolicyCount = null;
7070

71+
/** GatewayAttachedClientSettingsPolicyCount is the number of relevant ClientSettingsPolicies
72+
attached at the Gateway level. */
73+
long? GatewayAttachedClientSettingsPolicyCount = null;
74+
75+
/** RouteAttachedClientSettingsPolicyCount is the number of relevant ClientSettingsPolicies attached at the Route level. */
76+
long? RouteAttachedClientSettingsPolicyCount = null;
77+
78+
/** ObservabilityPolicyCount is the number of relevant ObservabilityPolicies. */
79+
long? ObservabilityPolicyCount = null;
80+
81+
/** NginxProxyCount is the number of NginxProxies. */
82+
long? NginxProxyCount = null;
83+
7184
/** NGFReplicaCount is the number of replicas of the NGF Pod. */
7285
long? NGFReplicaCount = null;
7386

internal/mode/static/telemetry/data_test.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,18 @@ func TestDataAttributes(t *testing.T) {
2424
FlagNames: []string{"test-flag"},
2525
FlagValues: []string{"test-value"},
2626
NGFResourceCounts: NGFResourceCounts{
27-
GatewayCount: 1,
28-
GatewayClassCount: 2,
29-
HTTPRouteCount: 3,
30-
SecretCount: 4,
31-
ServiceCount: 5,
32-
EndpointCount: 6,
33-
GRPCRouteCount: 7,
34-
BackendTLSPolicyCount: 8,
27+
GatewayCount: 1,
28+
GatewayClassCount: 2,
29+
HTTPRouteCount: 3,
30+
SecretCount: 4,
31+
ServiceCount: 5,
32+
EndpointCount: 6,
33+
GRPCRouteCount: 7,
34+
BackendTLSPolicyCount: 8,
35+
GatewayAttachedClientSettingsPolicyCount: 9,
36+
RouteAttachedClientSettingsPolicyCount: 10,
37+
ObservabilityPolicyCount: 11,
38+
NginxProxyCount: 12,
3539
},
3640
NGFReplicaCount: 3,
3741
}
@@ -57,6 +61,10 @@ func TestDataAttributes(t *testing.T) {
5761
attribute.Int64("EndpointCount", 6),
5862
attribute.Int64("GRPCRouteCount", 7),
5963
attribute.Int64("BackendTLSPolicyCount", 8),
64+
attribute.Int64("GatewayAttachedClientSettingsPolicyCount", 9),
65+
attribute.Int64("RouteAttachedClientSettingsPolicyCount", 10),
66+
attribute.Int64("ObservabilityPolicyCount", 11),
67+
attribute.Int64("NginxProxyCount", 12),
6068
attribute.Int64("NGFReplicaCount", 3),
6169
}
6270

@@ -90,6 +98,10 @@ func TestDataAttributesWithEmptyData(t *testing.T) {
9098
attribute.Int64("EndpointCount", 0),
9199
attribute.Int64("GRPCRouteCount", 0),
92100
attribute.Int64("BackendTLSPolicyCount", 0),
101+
attribute.Int64("GatewayAttachedClientSettingsPolicyCount", 0),
102+
attribute.Int64("RouteAttachedClientSettingsPolicyCount", 0),
103+
attribute.Int64("ObservabilityPolicyCount", 0),
104+
attribute.Int64("NginxProxyCount", 0),
93105
attribute.Int64("NGFReplicaCount", 0),
94106
}
95107

internal/mode/static/telemetry/ngfresourcecounts_attributes_generated.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func (d *NGFResourceCounts) Attributes() []attribute.KeyValue {
2323
attrs = append(attrs, attribute.Int64("EndpointCount", d.EndpointCount))
2424
attrs = append(attrs, attribute.Int64("GRPCRouteCount", d.GRPCRouteCount))
2525
attrs = append(attrs, attribute.Int64("BackendTLSPolicyCount", d.BackendTLSPolicyCount))
26+
attrs = append(attrs, attribute.Int64("GatewayAttachedClientSettingsPolicyCount", d.GatewayAttachedClientSettingsPolicyCount))
27+
attrs = append(attrs, attribute.Int64("RouteAttachedClientSettingsPolicyCount", d.RouteAttachedClientSettingsPolicyCount))
28+
attrs = append(attrs, attribute.Int64("ObservabilityPolicyCount", d.ObservabilityPolicyCount))
29+
attrs = append(attrs, attribute.Int64("NginxProxyCount", d.NginxProxyCount))
2630

2731

2832
return attrs

site/content/overview/product-telemetry.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Telemetry data is collected once every 24 hours and sent to a service managed by
2626
- **Deployment Replica Count:** the count of NGINX Gateway Fabric Pods.
2727
- **Image Build Source:** whether the image was built by GitHub or locally (values are `gha`, `local`, or `unknown`). The source repository of the images is **not** collected.
2828
- **Deployment Flags:** a list of NGINX Gateway Fabric Deployment flags that are specified by a user. The actual values of non-boolean flags are **not** collected; we only record that they are either `true` or `false` for boolean flags and `default` or `user-defined` for the rest.
29-
- **Count of Resources:** the total count of resources related to NGINX Gateway Fabric. This includes `GatewayClasses`, `Gateways`, `HTTPRoutes`,`GRPCRoutes`, `Secrets`, `Services`, `BackendTLSPolicies`, and `Endpoints`. The data within these resources is **not** collected.
29+
- **Count of Resources:** the total count of resources related to NGINX Gateway Fabric. This includes `GatewayClasses`, `Gateways`, `HTTPRoutes`,`GRPCRoutes`, `Secrets`, `Services`, `BackendTLSPolicies`, `ClientSettingsPolicies`, `NginxProxies`, `ObservabilityPolicies`, and `Endpoints`. The data within these resources is **not** collected.
3030

3131
This data is used to identify the following information:
3232

tests/suite/telemetry_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ var _ = Describe("Telemetry test with OTel collector", Label("telemetry"), func(
8080
"EndpointCount: Int(0)",
8181
"GRPCRouteCount: Int(0)",
8282
"BackendTLSPolicyCount: Int(0)",
83+
"GatewayAttachedClientSettingsPolicyCount: Int(0)",
84+
"RouteAttachedClientSettingsPolicyCount: Int(0)",
85+
"ObservabilityPolicyCount: Int(0)",
86+
"NginxProxyCount: Int(0)",
8387
"NGFReplicaCount: Int(1)",
8488
},
8589
)

0 commit comments

Comments
 (0)