@@ -319,7 +319,7 @@ func (s *Server) makeIngressGatewayListeners(address string, cfgSnap *proxycfg.C
319
319
filterName : listenerKey .RouteName (),
320
320
routeName : listenerKey .RouteName (),
321
321
cluster : "" ,
322
- statPrefix : "ingress_upstream_ " ,
322
+ statPrefix : "ingress_upstream. " ,
323
323
routePath : "" ,
324
324
ingress : false ,
325
325
httpAuthzFilter : nil ,
@@ -771,7 +771,7 @@ func (s *Server) makeTerminatingGatewayListener(
771
771
772
772
// This fallback catch-all filter ensures a listener will be present for health checks to pass
773
773
// Envoy will reset these connections since known endpoints are caught by filter chain matches above
774
- tcpProxy , err := makeTCPProxyFilter (name , "" , "terminating_gateway_ " )
774
+ tcpProxy , err := makeTCPProxyFilter (name , "" , "terminating_gateway. " )
775
775
if err != nil {
776
776
return nil , err
777
777
}
@@ -821,7 +821,7 @@ func (s *Server) makeFilterChainTerminatingGateway(
821
821
// Lastly we setup the actual proxying component. For L4 this is a straight
822
822
// tcp proxy. For L7 this is a very hands-off HTTP proxy just to inject an
823
823
// HTTP filter to do intention checks here instead.
824
- statPrefix := fmt .Sprintf ("terminating_gateway_%s_%s_ " , service .NamespaceOrDefault (), service .Name )
824
+ statPrefix := fmt .Sprintf ("terminating_gateway.%s.%s. " , service .NamespaceOrDefault (), service .Name )
825
825
opts := listenerFilterOpts {
826
826
protocol : protocol ,
827
827
filterName : listener ,
@@ -868,7 +868,7 @@ func (s *Server) makeMeshGatewayListener(name, addr string, port int, cfgSnap *p
868
868
869
869
// The cluster name here doesn't matter as the sni_cluster
870
870
// filter will fill it in for us.
871
- tcpProxy , err := makeTCPProxyFilter (name , "" , "mesh_gateway_local_ " )
871
+ tcpProxy , err := makeTCPProxyFilter (name , "" , "mesh_gateway_local. " )
872
872
if err != nil {
873
873
return nil , err
874
874
}
@@ -891,8 +891,8 @@ func (s *Server) makeMeshGatewayListener(name, addr string, port int, cfgSnap *p
891
891
continue // skip local
892
892
}
893
893
clusterName := connect .DatacenterSNI (dc , cfgSnap .Roots .TrustDomain )
894
- filterName := fmt .Sprintf ("%s_ %s" , name , dc )
895
- dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_remote_ " )
894
+ filterName := fmt .Sprintf ("%s. %s" , name , dc )
895
+ dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_remote. " )
896
896
if err != nil {
897
897
return nil , err
898
898
}
@@ -913,8 +913,8 @@ func (s *Server) makeMeshGatewayListener(name, addr string, port int, cfgSnap *p
913
913
continue // skip local
914
914
}
915
915
clusterName := cfgSnap .ServerSNIFn (dc , "" )
916
- filterName := fmt .Sprintf ("%s_ %s" , name , dc )
917
- dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_remote_ " )
916
+ filterName := fmt .Sprintf ("%s. %s" , name , dc )
917
+ dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_remote. " )
918
918
if err != nil {
919
919
return nil , err
920
920
}
@@ -933,8 +933,8 @@ func (s *Server) makeMeshGatewayListener(name, addr string, port int, cfgSnap *p
933
933
for _ , srv := range cfgSnap .MeshGateway .ConsulServers {
934
934
clusterName := cfgSnap .ServerSNIFn (cfgSnap .Datacenter , srv .Node .Node )
935
935
936
- filterName := fmt .Sprintf ("%s_ %s" , name , cfgSnap .Datacenter )
937
- dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_local_server_ " )
936
+ filterName := fmt .Sprintf ("%s. %s" , name , cfgSnap .Datacenter )
937
+ dcTCPProxy , err := makeTCPProxyFilter (filterName , clusterName , "mesh_gateway_local_server. " )
938
938
if err != nil {
939
939
return nil , err
940
940
}
@@ -976,38 +976,61 @@ func (s *Server) makeUpstreamListenerForDiscoveryChain(
976
976
}
977
977
978
978
useRDS := true
979
- clusterName := ""
979
+ var (
980
+ clusterName string
981
+ destination , datacenter , namespace string
982
+ )
980
983
if chain == nil || chain .IsDefault () {
984
+ useRDS = false
985
+
981
986
dc := u .Datacenter
982
987
if dc == "" {
983
988
dc = cfgSnap .Datacenter
984
989
}
985
- sni := connect . UpstreamSNI ( u , "" , dc , cfgSnap . Roots . TrustDomain )
990
+ destination , datacenter , namespace = u . DestinationName , dc , u . DestinationNamespace
986
991
987
- useRDS = false
992
+ sni := connect . UpstreamSNI ( u , "" , dc , cfgSnap . Roots . TrustDomain )
988
993
clusterName = CustomizeClusterName (sni , chain )
989
994
990
- } else if cfg .Protocol == "tcp" {
991
- startNode := chain .Nodes [chain .StartNode ]
992
- if startNode == nil {
993
- return nil , fmt .Errorf ("missing first node in compiled discovery chain for: %s" , chain .ServiceName )
994
- } else if startNode .Type != structs .DiscoveryGraphNodeTypeResolver {
995
- return nil , fmt .Errorf ("unexpected first node in discovery chain using protocol=%q: %s" , cfg .Protocol , startNode .Type )
995
+ } else {
996
+ destination , datacenter , namespace = chain .ServiceName , chain .Datacenter , chain .Namespace
997
+
998
+ if cfg .Protocol == "tcp" {
999
+ useRDS = false
1000
+
1001
+ startNode := chain .Nodes [chain .StartNode ]
1002
+ if startNode == nil {
1003
+ return nil , fmt .Errorf ("missing first node in compiled discovery chain for: %s" , chain .ServiceName )
1004
+ }
1005
+ if startNode .Type != structs .DiscoveryGraphNodeTypeResolver {
1006
+ return nil , fmt .Errorf ("unexpected first node in discovery chain using protocol=%q: %s" , cfg .Protocol , startNode .Type )
1007
+ }
1008
+ targetID := startNode .Resolver .Target
1009
+ target := chain .Targets [targetID ]
1010
+
1011
+ clusterName = CustomizeClusterName (target .Name , chain )
996
1012
}
997
- targetID := startNode .Resolver .Target
998
- target := chain .Targets [targetID ]
1013
+ }
999
1014
1000
- useRDS = false
1001
- clusterName = CustomizeClusterName (target .Name , chain )
1015
+ // Default the namespace to match how SNIs are generated
1016
+ if namespace == "" {
1017
+ namespace = structs .IntentionDefaultNamespace
1018
+ }
1019
+ filterName := fmt .Sprintf ("%s.%s.%s" , destination , namespace , datacenter )
1020
+
1021
+ if u .DestinationType == structs .UpstreamDestTypePreparedQuery {
1022
+ // Avoid encoding dc and namespace for prepared queries.
1023
+ // Those are defined in the query itself and are not available here.
1024
+ filterName = upstreamID
1002
1025
}
1003
1026
1004
1027
opts := listenerFilterOpts {
1005
1028
useRDS : useRDS ,
1006
1029
protocol : cfg .Protocol ,
1007
- filterName : upstreamID ,
1030
+ filterName : filterName ,
1008
1031
routeName : upstreamID ,
1009
1032
cluster : clusterName ,
1010
- statPrefix : "upstream_ " ,
1033
+ statPrefix : "upstream. " ,
1011
1034
routePath : "" ,
1012
1035
ingress : false ,
1013
1036
httpAuthzFilter : nil ,
@@ -1120,31 +1143,27 @@ func makeSNIClusterFilter() (*envoylistener.Filter, error) {
1120
1143
1121
1144
func makeTCPProxyFilter (filterName , cluster , statPrefix string ) (* envoylistener.Filter , error ) {
1122
1145
cfg := & envoytcp.TcpProxy {
1123
- StatPrefix : makeStatPrefix ("tcp" , statPrefix , filterName ),
1146
+ StatPrefix : makeStatPrefix (statPrefix , filterName ),
1124
1147
ClusterSpecifier : & envoytcp.TcpProxy_Cluster {Cluster : cluster },
1125
1148
}
1126
1149
return makeFilter ("envoy.tcp_proxy" , cfg , false )
1127
1150
}
1128
1151
1129
- func makeStatPrefix (protocol , prefix , filterName string ) string {
1152
+ func makeStatPrefix (prefix , filterName string ) string {
1130
1153
// Replace colons here because Envoy does that in the metrics for the actual
1131
1154
// clusters but doesn't in the stat prefix here while dashboards assume they
1132
1155
// will match.
1133
- return fmt .Sprintf ("%s%s_% s" , prefix , strings .Replace (filterName , ":" , "_" , - 1 ), protocol )
1156
+ return fmt .Sprintf ("%s%s" , prefix , strings .Replace (filterName , ":" , "_" , - 1 ))
1134
1157
}
1135
1158
1136
1159
func makeHTTPFilter (opts listenerFilterOpts ) (* envoylistener.Filter , error ) {
1137
1160
op := envoyhttp .HttpConnectionManager_Tracing_INGRESS
1138
1161
if ! opts .ingress {
1139
1162
op = envoyhttp .HttpConnectionManager_Tracing_EGRESS
1140
1163
}
1141
- proto := "http"
1142
- if opts .protocol == "grpc" {
1143
- proto = opts .protocol
1144
- }
1145
1164
1146
1165
cfg := & envoyhttp.HttpConnectionManager {
1147
- StatPrefix : makeStatPrefix (proto , opts .statPrefix , opts .filterName ),
1166
+ StatPrefix : makeStatPrefix (opts .statPrefix , opts .filterName ),
1148
1167
CodecType : envoyhttp .HttpConnectionManager_AUTO ,
1149
1168
HttpFilters : []* envoyhttp.HttpFilter {
1150
1169
{
0 commit comments