Skip to content

Commit 6b8794e

Browse files
authored
feat: add control plane metrics library (#1982)
* feat: add control plane metrics library Signed-off-by: bitliu <bitliu@tencent.com> * update Signed-off-by: bitliu <bitliu@tencent.com> * update Signed-off-by: bitliu <bitliu@tencent.com> * rebase Signed-off-by: bitliu <bitliu@tencent.com> * update Signed-off-by: bitliu <bitliu@tencent.com> --------- Signed-off-by: bitliu <bitliu@tencent.com>
1 parent 70a31b2 commit 6b8794e

21 files changed

Lines changed: 1008 additions & 182 deletions

api/v1alpha1/envoygateway_helpers.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ func (e *EnvoyGateway) GetEnvoyGatewayTelemetry() *EnvoyGatewayTelemetry {
9898
if e.Telemetry.Metrics.Prometheus == nil {
9999
e.Telemetry.Metrics.Prometheus = DefaultEnvoyGatewayPrometheus()
100100
}
101-
102101
if e.Telemetry.Metrics == nil {
103102
e.Telemetry.Metrics = DefaultEnvoyGatewayMetrics()
104103
}

api/v1alpha1/shared_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ const (
2121
DefaultEnvoyProxyImage = "envoyproxy/envoy-dev:latest"
2222
// DefaultRateLimitImage is the default image used by ratelimit.
2323
DefaultRateLimitImage = "envoyproxy/ratelimit:master"
24+
// HTTPProtocol is the common-used http protocol.
25+
HTTPProtocol = "http"
26+
// GRPCProtocol is the common-used grpc protocol.
27+
GRPCProtocol = "grpc"
2428
)
2529

2630
// GroupVersionKind unambiguously identifies a Kind.

api/v1alpha1/validation/envoygateway_validate_test.go

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ package validation
88
import (
99
"testing"
1010

11+
"github.com/stretchr/testify/assert"
1112
"github.com/stretchr/testify/require"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1214
v1 "sigs.k8s.io/gateway-api/apis/v1"
1315

1416
"github.com/envoyproxy/gateway/api/v1alpha1"
@@ -469,3 +471,230 @@ func TestValidateEnvoyGateway(t *testing.T) {
469471
})
470472
}
471473
}
474+
475+
func TestEnvoyGateway(t *testing.T) {
476+
envoyGateway := v1alpha1.DefaultEnvoyGateway()
477+
assert.True(t, envoyGateway.Provider != nil)
478+
assert.True(t, envoyGateway.Gateway != nil)
479+
assert.True(t, envoyGateway.Logging != nil)
480+
envoyGateway.SetEnvoyGatewayDefaults()
481+
assert.Equal(t, envoyGateway.Logging, v1alpha1.DefaultEnvoyGatewayLogging())
482+
483+
logging := v1alpha1.DefaultEnvoyGatewayLogging()
484+
assert.True(t, logging != nil)
485+
assert.True(t, logging.Level[v1alpha1.LogComponentGatewayDefault] == v1alpha1.LogLevelInfo)
486+
487+
gatewayLogging := &v1alpha1.EnvoyGatewayLogging{
488+
Level: logging.Level,
489+
}
490+
gatewayLogging.SetEnvoyGatewayLoggingDefaults()
491+
assert.True(t, gatewayLogging != nil)
492+
assert.True(t, gatewayLogging.Level[v1alpha1.LogComponentGatewayDefault] == v1alpha1.LogLevelInfo)
493+
}
494+
495+
func TestDefaultEnvoyGatewayLoggingLevel(t *testing.T) {
496+
type args struct {
497+
component string
498+
level v1alpha1.LogLevel
499+
}
500+
tests := []struct {
501+
name string
502+
args args
503+
want v1alpha1.LogLevel
504+
}{
505+
{
506+
name: "test default info level for empty level",
507+
args: args{component: "", level: ""},
508+
want: v1alpha1.LogLevelInfo,
509+
},
510+
{
511+
name: "test default info level for empty level",
512+
args: args{component: string(v1alpha1.LogComponentGatewayDefault), level: ""},
513+
want: v1alpha1.LogLevelInfo,
514+
},
515+
{
516+
name: "test default info level for info level",
517+
args: args{component: string(v1alpha1.LogComponentGatewayDefault), level: v1alpha1.LogLevelInfo},
518+
want: v1alpha1.LogLevelInfo,
519+
},
520+
{
521+
name: "test default error level for error level",
522+
args: args{component: string(v1alpha1.LogComponentGatewayDefault), level: v1alpha1.LogLevelError},
523+
want: v1alpha1.LogLevelError,
524+
},
525+
{
526+
name: "test gateway-api error level for error level",
527+
args: args{component: string(v1alpha1.LogComponentGatewayAPIRunner), level: v1alpha1.LogLevelError},
528+
want: v1alpha1.LogLevelError,
529+
},
530+
{
531+
name: "test gateway-api info level for info level",
532+
args: args{component: string(v1alpha1.LogComponentGatewayAPIRunner), level: v1alpha1.LogLevelInfo},
533+
want: v1alpha1.LogLevelInfo,
534+
},
535+
{
536+
name: "test default gateway-api warn level for info level",
537+
args: args{component: string(v1alpha1.LogComponentGatewayAPIRunner), level: ""},
538+
want: v1alpha1.LogLevelInfo,
539+
},
540+
}
541+
for _, tt := range tests {
542+
t.Run(tt.name, func(t *testing.T) {
543+
logging := &v1alpha1.EnvoyGatewayLogging{}
544+
if got := logging.DefaultEnvoyGatewayLoggingLevel(tt.args.level); got != tt.want {
545+
t.Errorf("defaultLevel() = %v, want %v", got, tt.want)
546+
}
547+
})
548+
}
549+
}
550+
551+
func TestEnvoyGatewayProvider(t *testing.T) {
552+
envoyGateway := &v1alpha1.EnvoyGateway{
553+
TypeMeta: metav1.TypeMeta{},
554+
EnvoyGatewaySpec: v1alpha1.EnvoyGatewaySpec{Provider: v1alpha1.DefaultEnvoyGatewayProvider()},
555+
}
556+
assert.True(t, envoyGateway.Provider != nil)
557+
558+
envoyGatewayProvider := envoyGateway.GetEnvoyGatewayProvider()
559+
assert.True(t, envoyGatewayProvider.Kubernetes == nil)
560+
assert.Equal(t, envoyGateway.Provider, envoyGatewayProvider)
561+
562+
envoyGatewayProvider.Kubernetes = v1alpha1.DefaultEnvoyGatewayKubeProvider()
563+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment, v1alpha1.DefaultKubernetesDeployment(v1alpha1.DefaultRateLimitImage))
564+
565+
envoyGatewayProvider.Kubernetes = &v1alpha1.EnvoyGatewayKubernetesProvider{}
566+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment == nil)
567+
568+
envoyGatewayProvider.Kubernetes = &v1alpha1.EnvoyGatewayKubernetesProvider{
569+
RateLimitDeployment: &v1alpha1.KubernetesDeploymentSpec{
570+
Replicas: nil,
571+
Pod: nil,
572+
Container: nil,
573+
}}
574+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Replicas == nil)
575+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Pod == nil)
576+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container == nil)
577+
envoyGatewayKubeProvider := envoyGatewayProvider.GetEnvoyGatewayKubeProvider()
578+
579+
envoyGatewayProvider.Kubernetes = &v1alpha1.EnvoyGatewayKubernetesProvider{
580+
RateLimitDeployment: &v1alpha1.KubernetesDeploymentSpec{
581+
Replicas: nil,
582+
Pod: nil,
583+
Container: &v1alpha1.KubernetesContainerSpec{
584+
Resources: nil,
585+
SecurityContext: nil,
586+
Image: nil,
587+
},
588+
}}
589+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container.Resources == nil)
590+
envoyGatewayProvider.GetEnvoyGatewayKubeProvider()
591+
592+
assert.True(t, envoyGatewayProvider.Kubernetes != nil)
593+
assert.Equal(t, envoyGatewayProvider.Kubernetes, envoyGatewayKubeProvider)
594+
595+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment != nil)
596+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment, v1alpha1.DefaultKubernetesDeployment(v1alpha1.DefaultRateLimitImage))
597+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Replicas != nil)
598+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Replicas, v1alpha1.DefaultKubernetesDeploymentReplicas())
599+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Pod != nil)
600+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Pod, v1alpha1.DefaultKubernetesPod())
601+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container != nil)
602+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container, v1alpha1.DefaultKubernetesContainer(v1alpha1.DefaultRateLimitImage))
603+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container.Resources != nil)
604+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container.Resources, v1alpha1.DefaultResourceRequirements())
605+
assert.True(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container.Image != nil)
606+
assert.Equal(t, envoyGatewayProvider.Kubernetes.RateLimitDeployment.Container.Image, v1alpha1.DefaultKubernetesContainerImage(v1alpha1.DefaultRateLimitImage))
607+
}
608+
609+
func TestEnvoyGatewayAdmin(t *testing.T) {
610+
// default envoygateway config admin should not be nil
611+
eg := v1alpha1.DefaultEnvoyGateway()
612+
assert.True(t, eg.Admin != nil)
613+
614+
// get default admin config from envoygateway
615+
// values should be set in default
616+
egAdmin := eg.GetEnvoyGatewayAdmin()
617+
assert.True(t, egAdmin != nil)
618+
assert.True(t, egAdmin.Address.Port == v1alpha1.GatewayAdminPort)
619+
assert.True(t, egAdmin.Address.Host == v1alpha1.GatewayAdminHost)
620+
assert.True(t, egAdmin.EnableDumpConfig == false)
621+
assert.True(t, egAdmin.EnablePprof == false)
622+
623+
// override the admin config
624+
// values should be updated
625+
eg.Admin = &v1alpha1.EnvoyGatewayAdmin{
626+
Address: &v1alpha1.EnvoyGatewayAdminAddress{
627+
Host: "0.0.0.0",
628+
Port: 19010,
629+
},
630+
EnableDumpConfig: true,
631+
EnablePprof: true,
632+
}
633+
634+
assert.True(t, eg.GetEnvoyGatewayAdmin().Address.Port == 19010)
635+
assert.True(t, eg.GetEnvoyGatewayAdmin().Address.Host == "0.0.0.0")
636+
assert.True(t, eg.GetEnvoyGatewayAdmin().EnableDumpConfig == true)
637+
assert.True(t, eg.GetEnvoyGatewayAdmin().EnablePprof == true)
638+
639+
// set eg defaults when admin is nil
640+
// the admin should not be nil
641+
eg.Admin = nil
642+
eg.SetEnvoyGatewayDefaults()
643+
assert.True(t, eg.Admin != nil)
644+
assert.True(t, eg.Admin.Address.Port == v1alpha1.GatewayAdminPort)
645+
assert.True(t, eg.Admin.Address.Host == v1alpha1.GatewayAdminHost)
646+
assert.True(t, eg.Admin.EnableDumpConfig == false)
647+
assert.True(t, eg.Admin.EnablePprof == false)
648+
}
649+
650+
func TestEnvoyGatewayTelemetry(t *testing.T) {
651+
// default envoygateway config telemetry should not be nil
652+
eg := v1alpha1.DefaultEnvoyGateway()
653+
assert.True(t, eg.Telemetry != nil)
654+
655+
// get default telemetry config from envoygateway
656+
// values should be set in default
657+
egTelemetry := eg.GetEnvoyGatewayTelemetry()
658+
assert.True(t, egTelemetry != nil)
659+
assert.True(t, egTelemetry.Metrics != nil)
660+
assert.True(t, egTelemetry.Metrics.Prometheus.Disable == false)
661+
assert.True(t, egTelemetry.Metrics.Sinks == nil)
662+
663+
// override the telemetry config
664+
// values should be updated
665+
eg.Telemetry.Metrics = &v1alpha1.EnvoyGatewayMetrics{
666+
Prometheus: &v1alpha1.EnvoyGatewayPrometheusProvider{
667+
Disable: true,
668+
},
669+
Sinks: []v1alpha1.EnvoyGatewayMetricSink{
670+
{
671+
Type: v1alpha1.MetricSinkTypeOpenTelemetry,
672+
OpenTelemetry: &v1alpha1.EnvoyGatewayOpenTelemetrySink{
673+
Host: "otel-collector.monitoring.svc.cluster.local",
674+
Protocol: "grpc",
675+
Port: 4317,
676+
},
677+
}, {
678+
Type: v1alpha1.MetricSinkTypeOpenTelemetry,
679+
OpenTelemetry: &v1alpha1.EnvoyGatewayOpenTelemetrySink{
680+
Host: "otel-collector.monitoring.svc.cluster.local",
681+
Protocol: "http",
682+
Port: 4318,
683+
},
684+
},
685+
},
686+
}
687+
688+
assert.True(t, eg.GetEnvoyGatewayTelemetry().Metrics.Prometheus.Disable == true)
689+
assert.True(t, len(eg.GetEnvoyGatewayTelemetry().Metrics.Sinks) == 2)
690+
assert.True(t, eg.GetEnvoyGatewayTelemetry().Metrics.Sinks[0].Type == v1alpha1.MetricSinkTypeOpenTelemetry)
691+
692+
// set eg defaults when telemetry is nil
693+
// the telemetry should not be nil
694+
eg.Telemetry = nil
695+
eg.SetEnvoyGatewayDefaults()
696+
assert.True(t, eg.Telemetry != nil)
697+
assert.True(t, eg.Telemetry.Metrics != nil)
698+
assert.True(t, eg.Telemetry.Metrics.Prometheus.Disable == false)
699+
assert.True(t, eg.Telemetry.Metrics.Sinks == nil)
700+
}

0 commit comments

Comments
 (0)