Skip to content

Commit 72f146a

Browse files
authored
Add Ingress Classes to Telemetry data (nginx#5418)
1 parent d4d70c0 commit 72f146a

File tree

10 files changed

+150
-2
lines changed

10 files changed

+150
-2
lines changed

charts/nginx-ingress/templates/clusterrole.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ rules:
6868
- ingressclasses
6969
verbs:
7070
- get
71+
- list
7172
{{- if .Values.controller.reportIngressStatus.enable }}
7273
- apiGroups:
7374
- networking.k8s.io

deployments/rbac/rbac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ rules:
127127
- ingressclasses
128128
verbs:
129129
- get
130+
- list
130131
- apiGroups:
131132
- cis.f5.com
132133
resources:

docs/content/overview/product-telemetry.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ These are the data points collected and reported by NGINX Ingress Controller:
3434
- **TransportServers** The number of TransportServer resources managed by NGINX Ingress Controller.
3535
- **Replicas** Number of Deployment replicas, or Daemonset instances.
3636
- **Secrets** Number of Secret resources managed by NGINX Ingress Controller.
37+
- **Ingress Count** Number of Ingresses.
38+
- **Ingress Classes** Number of Ingress Classes.
3739
- **Services** Number of Services referenced by VirtualServers, VirtualServerRoutes, TransportServers and Ingresses.
38-
- **IngressCount** Number of Ingresses.
3940

4041

4142
## Opt out

internal/telemetry/cluster.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@ func (c *Collector) IngressCount() int {
136136
return total
137137
}
138138

139+
// IngressClassCount returns number of Ingress Classes.
140+
func (c *Collector) IngressClassCount(ctx context.Context) (int, error) {
141+
ic, err := c.Config.K8sClientReader.NetworkingV1().IngressClasses().List(ctx, metaV1.ListOptions{})
142+
if err != nil {
143+
return 0, err
144+
}
145+
return len(ic.Items), nil
146+
}
147+
139148
// lookupPlatform takes a string representing a K8s PlatformID
140149
// retrieved from a cluster node and returns a string
141150
// representing the platform name.

internal/telemetry/cluster_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"github.com/nginxinc/kubernetes-ingress/internal/telemetry"
88
appsV1 "k8s.io/api/apps/v1"
99
apiCoreV1 "k8s.io/api/core/v1"
10+
networkingV1 "k8s.io/api/networking/v1"
1011
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
1113
"k8s.io/apimachinery/pkg/runtime"
1214
"k8s.io/apimachinery/pkg/types"
1315
)
@@ -913,3 +915,26 @@ var (
913915
Data: map[string][]byte{},
914916
}
915917
)
918+
919+
// IngressClass for testing.
920+
var (
921+
ingressClassList = &networkingV1.IngressClassList{
922+
TypeMeta: metaV1.TypeMeta{
923+
Kind: "List",
924+
APIVersion: "v1",
925+
},
926+
ListMeta: metaV1.ListMeta{},
927+
Items: []networkingV1.IngressClass{
928+
{
929+
TypeMeta: metaV1.TypeMeta{
930+
Kind: "IngressClass",
931+
APIVersion: "networking.k8s.io/v1",
932+
},
933+
ObjectMeta: metaV1.ObjectMeta{},
934+
Spec: networkingV1.IngressClassSpec{
935+
Controller: "nginx.org/ingress-controller",
936+
},
937+
},
938+
},
939+
}
940+
)

internal/telemetry/collector.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ func (c *Collector) Collect(ctx context.Context) {
118118
Secrets: int64(report.Secrets),
119119
Services: int64(report.ServiceCount),
120120
Ingresses: int64(report.IngressCount),
121+
IngressClasses: int64(report.IngressClassCount),
121122
},
122123
}
123124

@@ -147,6 +148,7 @@ type Report struct {
147148
TransportServers int
148149
Secrets int
149150
IngressCount int
151+
IngressClassCount int
150152
}
151153

152154
// BuildReport takes context, collects telemetry data and builds the report.
@@ -197,6 +199,10 @@ func (c *Collector) BuildReport(ctx context.Context) (Report, error) {
197199
glog.Errorf("Error collecting telemetry data: Secrets: %v", err)
198200
}
199201
ingressCount := c.IngressCount()
202+
ingressClassCount, err := c.IngressClassCount(ctx)
203+
if err != nil {
204+
glog.Errorf("Error collecting telemetry data: Ingress Classes: %v", err)
205+
}
200206

201207
return Report{
202208
Name: "NIC",
@@ -214,5 +220,6 @@ func (c *Collector) BuildReport(ctx context.Context) (Report, error) {
214220
TransportServers: tsCount,
215221
Secrets: secrets,
216222
IngressCount: ingressCount,
223+
IngressClassCount: ingressClassCount,
217224
}, err
218225
}

internal/telemetry/collector_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,101 @@ func TestCountSecretsAddTwoSecretsAndDeleteOne(t *testing.T) {
764764
}
765765
}
766766

767+
func TestIngressClassCountReportsNoIngressClasses(t *testing.T) {
768+
t.Parallel()
769+
770+
buf := &bytes.Buffer{}
771+
exp := &telemetry.StdoutExporter{Endpoint: buf}
772+
773+
cfg := telemetry.CollectorConfig{
774+
Configurator: newConfigurator(t),
775+
K8sClientReader: newTestClientset(node1, kubeNS),
776+
Version: telemetryNICData.ProjectVersion,
777+
}
778+
779+
c, err := telemetry.NewCollector(cfg, telemetry.WithExporter(exp))
780+
if err != nil {
781+
t.Fatal(err)
782+
}
783+
c.Collect(context.Background())
784+
785+
telData := tel.Data{
786+
ProjectName: telemetryNICData.ProjectName,
787+
ProjectVersion: telemetryNICData.ProjectVersion,
788+
ProjectArchitecture: telemetryNICData.ProjectArchitecture,
789+
ClusterNodeCount: 1,
790+
ClusterID: telemetryNICData.ClusterID,
791+
ClusterVersion: telemetryNICData.ClusterVersion,
792+
ClusterPlatform: "other",
793+
}
794+
795+
nicResourceCounts := telemetry.NICResourceCounts{
796+
VirtualServers: 0,
797+
VirtualServerRoutes: 0,
798+
TransportServers: 0,
799+
Ingresses: 0,
800+
IngressClasses: 0,
801+
}
802+
803+
td := telemetry.Data{
804+
telData,
805+
nicResourceCounts,
806+
}
807+
808+
want := fmt.Sprintf("%+v", &td)
809+
got := buf.String()
810+
if !cmp.Equal(want, got) {
811+
t.Error(cmp.Diff(want, got))
812+
}
813+
}
814+
815+
func TestIngressClassCountReportsIngressClasses(t *testing.T) {
816+
t.Parallel()
817+
buf := &bytes.Buffer{}
818+
exp := &telemetry.StdoutExporter{Endpoint: buf}
819+
820+
cfg := telemetry.CollectorConfig{
821+
Configurator: newConfigurator(t),
822+
K8sClientReader: newTestClientset(node1, kubeNS, ingressClassList),
823+
Version: telemetryNICData.ProjectVersion,
824+
}
825+
826+
c, err := telemetry.NewCollector(cfg, telemetry.WithExporter(exp))
827+
if err != nil {
828+
t.Fatal(err)
829+
}
830+
c.Collect(context.Background())
831+
832+
telData := tel.Data{
833+
ProjectName: telemetryNICData.ProjectName,
834+
ProjectVersion: telemetryNICData.ProjectVersion,
835+
ProjectArchitecture: telemetryNICData.ProjectArchitecture,
836+
ClusterNodeCount: 1,
837+
ClusterID: telemetryNICData.ClusterID,
838+
ClusterVersion: telemetryNICData.ClusterVersion,
839+
ClusterPlatform: "other",
840+
}
841+
842+
nicResourceCounts := telemetry.NICResourceCounts{
843+
VirtualServers: 0,
844+
VirtualServerRoutes: 0,
845+
TransportServers: 0,
846+
Ingresses: 0,
847+
IngressClasses: 1,
848+
}
849+
850+
td := telemetry.Data{
851+
telData,
852+
nicResourceCounts,
853+
}
854+
855+
want := fmt.Sprintf("%+v", &td)
856+
got := buf.String()
857+
if !cmp.Equal(want, got) {
858+
t.Error(cmp.Diff(want, got))
859+
}
860+
}
861+
767862
func TestCountVirtualServersServices(t *testing.T) {
768863
t.Parallel()
769864

internal/telemetry/data.avdl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,8 @@ It is the UID of the `kube-system` Namespace. */
5454
/** Ingresses is the number of Ingresses. */
5555
long? Ingresses = null;
5656

57+
/** IngressClasses is the number of Ingress Classes. */
58+
long? IngressClasses = null;
59+
5760
}
5861
}

internal/telemetry/exporter.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ type StdoutExporter struct {
2222

2323
// Export takes context and trace data and writes to the endpoint.
2424
func (e *StdoutExporter) Export(_ context.Context, data tel.Exportable) error {
25-
fmt.Fprintf(e.Endpoint, "%+v", data)
25+
_, err := fmt.Fprintf(e.Endpoint, "%+v", data)
26+
if err != nil {
27+
return err
28+
}
2629
return nil
2730
}
2831

@@ -76,4 +79,6 @@ type NICResourceCounts struct {
7679
Services int64
7780
// Ingresses is the number of Ingresses.
7881
Ingresses int64
82+
// IngressClasses is the number of Ingress Classes.
83+
IngressClasses int64
7984
}

internal/telemetry/nicresourcecounts_attributes_generated.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func (d *NICResourceCounts) Attributes() []attribute.KeyValue {
2020
attrs = append(attrs, attribute.Int64("Secrets", d.Secrets))
2121
attrs = append(attrs, attribute.Int64("Services", d.Services))
2222
attrs = append(attrs, attribute.Int64("Ingresses", d.Ingresses))
23+
attrs = append(attrs, attribute.Int64("IngressClasses", d.IngressClasses))
2324

2425
return attrs
2526
}

0 commit comments

Comments
 (0)