Skip to content

Commit d6c886c

Browse files
authored
chore: add logging for 5xx direct response (#7252)
* add logging for 500 direct response Signed-off-by: Huabing Zhao <[email protected]>
1 parent 0ba1667 commit d6c886c

File tree

10 files changed

+276
-73
lines changed

10 files changed

+276
-73
lines changed

internal/cmd/egctl/translate.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ import (
2323
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2424
"sigs.k8s.io/yaml"
2525

26+
egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
2627
"github.com/envoyproxy/gateway/api/v1alpha1/validation"
2728
"github.com/envoyproxy/gateway/internal/gatewayapi"
2829
"github.com/envoyproxy/gateway/internal/gatewayapi/resource"
2930
"github.com/envoyproxy/gateway/internal/gatewayapi/status"
3031
"github.com/envoyproxy/gateway/internal/infrastructure/kubernetes/ratelimit"
32+
"github.com/envoyproxy/gateway/internal/logging"
3133
"github.com/envoyproxy/gateway/internal/xds/bootstrap"
3234
"github.com/envoyproxy/gateway/internal/xds/translator"
3335
xds_types "github.com/envoyproxy/gateway/internal/xds/types"
@@ -277,6 +279,8 @@ func translateGatewayAPIToIR(resources *resource.Resources) (*gatewayapi.Transla
277279
EndpointRoutingDisabled: true,
278280
EnvoyPatchPolicyEnabled: true,
279281
BackendEnabled: true,
282+
// Discard logs during translation for egctl command to avoid polluting output
283+
Logger: logging.DefaultLogger(io.Discard, egv1a1.LogLevelInfo),
280284
}
281285

282286
// Fix the services in the resources section so that they have an IP address - this prevents nasty
@@ -305,6 +309,7 @@ func translateGatewayAPIToGatewayAPI(resources *resource.Resources) (resource.Re
305309
EndpointRoutingDisabled: true,
306310
EnvoyPatchPolicyEnabled: true,
307311
BackendEnabled: true,
312+
Logger: logging.DefaultLogger(io.Discard, egv1a1.LogLevelInfo),
308313
}
309314
gRes, _ := gTranslator.Translate(resources)
310315
// Update the status of the GatewayClass based on EnvoyProxy validation
@@ -344,6 +349,7 @@ func TranslateGatewayAPIToXds(namespace, dnsDomain, resourceType string, resourc
344349
EndpointRoutingDisabled: true,
345350
EnvoyPatchPolicyEnabled: true,
346351
BackendEnabled: true,
352+
Logger: logging.DefaultLogger(io.Discard, egv1a1.LogLevelInfo),
347353
}
348354
gRes, _ := gTranslator.Translate(resources)
349355

@@ -363,6 +369,7 @@ func TranslateGatewayAPIToXds(namespace, dnsDomain, resourceType string, resourc
363369
GlobalRateLimit: &translator.GlobalRateLimitSettings{
364370
ServiceURL: ratelimit.GetServiceURL(namespace, dnsDomain),
365371
},
372+
Logger: logging.DefaultLogger(io.Discard, egv1a1.LogLevelInfo),
366373
}
367374
if resources.EnvoyProxyForGatewayClass != nil {
368375
xTranslator.FilterOrder = resources.EnvoyProxyForGatewayClass.Spec.FilterOrder

internal/gatewayapi/backendtrafficpolicy.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ func (t *Translator) translateBackendTrafficPolicyForRoute(
420420
// Skip if not the gateway wanted
421421
continue
422422
}
423-
applyTrafficFeatureToRoute(route, tf, errs, policy, x)
423+
t.applyTrafficFeatureToRoute(route, tf, errs, policy, x)
424424
}
425425

426426
return errs
@@ -481,12 +481,12 @@ func (t *Translator) translateBackendTrafficPolicyForRouteWithMerge(
481481
// should not happen.
482482
return nil
483483
}
484-
applyTrafficFeatureToRoute(route, tf, errs, mergedPolicy, x)
484+
t.applyTrafficFeatureToRoute(route, tf, errs, mergedPolicy, x)
485485

486486
return nil
487487
}
488488

489-
func applyTrafficFeatureToRoute(route RouteContext,
489+
func (t *Translator) applyTrafficFeatureToRoute(route RouteContext,
490490
tf *ir.TrafficFeatures, errs error,
491491
policy *egv1a1.BackendTrafficPolicy, x *ir.Xds,
492492
) {
@@ -516,6 +516,7 @@ func applyTrafficFeatureToRoute(route RouteContext,
516516
}
517517
}
518518

519+
routesWithDirectResponse := sets.New[string]()
519520
for _, http := range x.HTTP {
520521
for _, r := range http.Routes {
521522
// Apply if there is a match
@@ -525,6 +526,7 @@ func applyTrafficFeatureToRoute(route RouteContext,
525526
r.DirectResponse = &ir.CustomResponse{
526527
StatusCode: ptr.To(uint32(500)),
527528
}
529+
routesWithDirectResponse.Insert(r.Name)
528530
continue
529531
}
530532

@@ -543,6 +545,13 @@ func applyTrafficFeatureToRoute(route RouteContext,
543545
}
544546
}
545547
}
548+
if len(routesWithDirectResponse) > 0 {
549+
t.Logger.Info("setting 500 direct response in routes due to errors in BackendTrafficPolicy",
550+
"policy", utils.NamespacedName(policy),
551+
"routes", sets.List(routesWithDirectResponse),
552+
"error", errs,
553+
)
554+
}
546555
}
547556

548557
func mergeBackendTrafficPolicy(routePolicy, gwPolicy *egv1a1.BackendTrafficPolicy) (*egv1a1.BackendTrafficPolicy, error) {
@@ -710,6 +719,7 @@ func (t *Translator) translateBackendTrafficPolicyForGateway(
710719
setIfNil(&route.DNS, tf.DNS)
711720
}
712721

722+
routesWithDirectResponse := sets.New[string]()
713723
for _, http := range x.HTTP {
714724
gatewayName := http.Name[0:strings.LastIndex(http.Name, "/")]
715725
if t.MergeGateways && gatewayName != policyTarget {
@@ -730,6 +740,7 @@ func (t *Translator) translateBackendTrafficPolicyForGateway(
730740
r.DirectResponse = &ir.CustomResponse{
731741
StatusCode: ptr.To(uint32(500)),
732742
}
743+
routesWithDirectResponse.Insert(r.Name)
733744
continue
734745
}
735746

@@ -747,6 +758,13 @@ func (t *Translator) translateBackendTrafficPolicyForGateway(
747758
}
748759
}
749760
}
761+
if len(routesWithDirectResponse) > 0 {
762+
t.Logger.Info("setting 500 direct response in routes due to errors in BackendTrafficPolicy",
763+
"policy", utils.NamespacedName(policy),
764+
"routes", sets.List(routesWithDirectResponse),
765+
"error", errs,
766+
)
767+
}
750768

751769
return errs
752770
}

internal/gatewayapi/clienttrafficpolicy.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,11 +482,20 @@ func (t *Translator) translateClientTrafficPolicyForListener(policy *egv1a1.Clie
482482

483483
// Early return if got any errors
484484
if errs != nil {
485+
routesWithDirectResponse := sets.New[string]()
485486
for _, route := range httpIR.Routes {
486487
// Return a 500 direct response
487488
route.DirectResponse = &ir.CustomResponse{
488489
StatusCode: ptr.To(uint32(500)),
489490
}
491+
routesWithDirectResponse.Insert(route.Name)
492+
}
493+
if len(httpIR.Routes) > 0 {
494+
t.Logger.Info("setting 500 direct response in routes due to errors in ClientTrafficPolicy",
495+
"policy", utils.NamespacedName(policy),
496+
"routes", sets.List(routesWithDirectResponse),
497+
"error", errs,
498+
)
490499
}
491500
return errs
492501
}

internal/gatewayapi/envoyextensionpolicy.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ func (t *Translator) translateEnvoyExtensionPolicyForRoute(
469469
// Apply IR to all relevant routes
470470
prefix := irRoutePrefix(route)
471471
parentRefs := GetParentReferences(route)
472+
routesWithDirectResponse := sets.New[string]()
472473
for _, p := range parentRefs {
473474
parentRefCtx := GetRouteParentContext(route, p, t.GatewayControllerName)
474475
gtwCtx := parentRefCtx.GetGateway()
@@ -516,6 +517,7 @@ func (t *Translator) translateEnvoyExtensionPolicyForRoute(
516517
r.DirectResponse = &ir.CustomResponse{
517518
StatusCode: ptr.To(uint32(500)),
518519
}
520+
routesWithDirectResponse.Insert(r.Name)
519521
}
520522
continue
521523
}
@@ -529,6 +531,13 @@ func (t *Translator) translateEnvoyExtensionPolicyForRoute(
529531
}
530532
}
531533
}
534+
if len(routesWithDirectResponse) > 0 {
535+
t.Logger.Info("setting 500 direct response in routes due to errors in EnvoyExtensionPolicy",
536+
"policy", fmt.Sprintf("%s/%s", policy.Namespace, policy.Name),
537+
"routes", sets.List(routesWithDirectResponse),
538+
"error", errs,
539+
)
540+
}
532541

533542
return errs
534543
}
@@ -568,6 +577,7 @@ func (t *Translator) translateEnvoyExtensionPolicyForGateway(
568577

569578
policyTarget := irStringKey(policy.Namespace, string(target.Name))
570579

580+
routesWithDirectResponse := sets.New[string]()
571581
for _, http := range x.HTTP {
572582
gatewayName := http.Name[0:strings.LastIndex(http.Name, "/")]
573583
if t.MergeGateways && gatewayName != policyTarget {
@@ -598,6 +608,7 @@ func (t *Translator) translateEnvoyExtensionPolicyForGateway(
598608
r.DirectResponse = &ir.CustomResponse{
599609
StatusCode: ptr.To(uint32(500)),
600610
}
611+
routesWithDirectResponse.Insert(r.Name)
601612
}
602613
continue
603614
}
@@ -609,6 +620,13 @@ func (t *Translator) translateEnvoyExtensionPolicyForGateway(
609620
}
610621
}
611622
}
623+
if len(routesWithDirectResponse) > 0 {
624+
t.Logger.Info("setting 500 direct response in routes due to errors in EnvoyExtensionPolicy",
625+
"policy", fmt.Sprintf("%s/%s", policy.Namespace, policy.Name),
626+
"routes", sets.List(routesWithDirectResponse),
627+
"error", errs,
628+
)
629+
}
612630

613631
return errs
614632
}

internal/gatewayapi/filters.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,6 +1073,7 @@ func (t *Translator) processUnresolvedHTTPFilter(errMsg string, filterContext *H
10731073
filterContext.DirectResponse = &ir.CustomResponse{
10741074
StatusCode: ptr.To(uint32(500)),
10751075
}
1076+
t.Logger.Info("returning 500 response due to unresolved HTTP filter")
10761077
}
10771078

10781079
func (t *Translator) processUnsupportedHTTPFilter(filterType string, filterContext *HTTPFiltersContext) {
@@ -1081,13 +1082,14 @@ func (t *Translator) processUnsupportedHTTPFilter(filterType string, filterConte
10811082
filterContext.DirectResponse = &ir.CustomResponse{
10821083
StatusCode: ptr.To(uint32(500)),
10831084
}
1085+
t.Logger.Info("returning 500 response due to unsupported HTTP filter")
10841086
}
10851087

10861088
func (t *Translator) processInvalidHTTPFilter(filterType string, filterContext *HTTPFiltersContext, err error) {
1087-
updateRouteStatusForFilter(
1088-
filterContext,
1089-
fmt.Sprintf("Invalid filter %s: %v", filterType, err))
1089+
errMsg := fmt.Sprintf("Invalid filter %s: %v", filterType, err)
1090+
updateRouteStatusForFilter(filterContext, errMsg)
10901091
filterContext.DirectResponse = &ir.CustomResponse{
10911092
StatusCode: ptr.To(uint32(500)),
10921093
}
1094+
t.Logger.Info("returning 500 response due to invalid HTTP filter")
10931095
}

0 commit comments

Comments
 (0)