Add flags to consul connect envoy for metrics merging. (#9768)

Allows setting -prometheus-backend-port to configure the cluster
envoy_prometheus_bind_addr points to.

Allows setting -prometheus-scrape-path to configure which path
envoy_prometheus_bind_addr exposes metrics on.

-prometheus-backend-port is used by the consul-k8s metrics merging feature, to
configure envoy_prometheus_bind_addr to point to the merged metrics
endpoint that combines Envoy and service metrics so that one set of
annotations on a Pod can scrape metrics from the service and it's Envoy
sidecar.

-prometheus-scrape-path is used to allow configurability of the path
where prometheus metrics are exposed on envoy_prometheus_bind_addr.
This commit is contained in:
Nitya Dhanushkodi 2021-03-04 14:15:47 -08:00 committed by GitHub
parent a2277882c1
commit 9ff49034e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 636 additions and 87 deletions

3
.changelog/9768.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:improvement
connect: adds new flags `prometheus-backend-port` and `prometheus-scrape-port` to `consul connect envoy` to support envoy_prometheus_bind_addr pointing to the merged metrics port when using Consul Connect on K8s.
```

View File

@ -213,19 +213,19 @@ func (c *BootstrapConfig) ConfigureArgs(args *BootstrapTplArgs, omitDeprecatedTa
} }
// Setup prometheus if needed. This MUST happen after the Static*JSON is set above // Setup prometheus if needed. This MUST happen after the Static*JSON is set above
if c.PrometheusBindAddr != "" { if c.PrometheusBindAddr != "" {
if err := c.generateListenerConfig(args, c.PrometheusBindAddr, "envoy_prometheus_metrics", "path", "/metrics", "/stats/prometheus"); err != nil { if err := c.generateListenerConfig(args, c.PrometheusBindAddr, "envoy_prometheus_metrics", "path", args.PrometheusScrapePath, "/stats/prometheus", args.PrometheusBackendPort); err != nil {
return err return err
} }
} }
// Setup /stats proxy listener if needed. This MUST happen after the Static*JSON is set above // Setup /stats proxy listener if needed. This MUST happen after the Static*JSON is set above
if c.StatsBindAddr != "" { if c.StatsBindAddr != "" {
if err := c.generateListenerConfig(args, c.StatsBindAddr, "envoy_metrics", "prefix", "/stats", "/stats"); err != nil { if err := c.generateListenerConfig(args, c.StatsBindAddr, "envoy_metrics", "prefix", "/stats", "/stats", ""); err != nil {
return err return err
} }
} }
// Setup /ready proxy listener if needed. This MUST happen after the Static*JSON is set above // Setup /ready proxy listener if needed. This MUST happen after the Static*JSON is set above
if c.ReadyBindAddr != "" { if c.ReadyBindAddr != "" {
if err := c.generateListenerConfig(args, c.ReadyBindAddr, "envoy_ready", "path", "/ready", "/ready"); err != nil { if err := c.generateListenerConfig(args, c.ReadyBindAddr, "envoy_ready", "path", "/ready", "/ready", ""); err != nil {
return err return err
} }
} }
@ -549,20 +549,36 @@ func generateStatsTags(args *BootstrapTplArgs, initialTags []string, omitDepreca
return tagJSONs, nil return tagJSONs, nil
} }
func (c *BootstrapConfig) generateListenerConfig(args *BootstrapTplArgs, bindAddr, name, matchType, matchValue, prefixRewrite string) error { func (c *BootstrapConfig) generateListenerConfig(args *BootstrapTplArgs, bindAddr, name, matchType, matchValue, prefixRewrite, prometheusBackendPort string) error {
host, port, err := net.SplitHostPort(bindAddr) host, port, err := net.SplitHostPort(bindAddr)
if err != nil { if err != nil {
return fmt.Errorf("invalid %s bind address: %s", name, err) return fmt.Errorf("invalid %s bind address: %s", name, err)
} }
// If prometheusBackendPort is set (not empty string), create
// "prometheus_backend" cluster with the prometheusBackendPort that the
// listener will point to, rather than the "self_admin" cluster. This is for
// the merged metrics feature in consul-k8s, so the
// envoy_prometheus_bind_addr listener will point to the merged Envoy and
// service metrics endpoint rather than the Envoy admin endpoint for
// metrics. This cluster will only be created once since it's only created
// when prometheusBackendPort is set, and prometheusBackendPort is only set
// when calling this function if c.PrometheusBindAddr is set.
clusterPort := args.AdminBindPort
clusterName := selfAdminName
if prometheusBackendPort != "" {
clusterPort = prometheusBackendPort
clusterName = "prometheus_backend"
}
clusterJSON := `{ clusterJSON := `{
"name": "` + selfAdminName + `", "name": "` + clusterName + `",
"ignore_health_on_host_removal": false, "ignore_health_on_host_removal": false,
"connect_timeout": "5s", "connect_timeout": "5s",
"type": "STATIC", "type": "STATIC",
"http_protocol_options": {}, "http_protocol_options": {},
"loadAssignment": { "loadAssignment": {
"clusterName": "` + selfAdminName + `", "clusterName": "` + clusterName + `",
"endpoints": [ "endpoints": [
{ {
"lbEndpoints": [ "lbEndpoints": [
@ -571,7 +587,7 @@ func (c *BootstrapConfig) generateListenerConfig(args *BootstrapTplArgs, bindAdd
"address": { "address": {
"socket_address": { "socket_address": {
"address": "127.0.0.1", "address": "127.0.0.1",
"port_value": ` + args.AdminBindPort + ` "port_value": ` + clusterPort + `
} }
} }
} }
@ -612,7 +628,7 @@ func (c *BootstrapConfig) generateListenerConfig(args *BootstrapTplArgs, bindAdd
"` + matchType + `": "` + matchValue + `" "` + matchType + `": "` + matchValue + `"
}, },
"route": { "route": {
"cluster": "self_admin", "cluster": "` + clusterName + `",
"prefix_rewrite": "` + prefixRewrite + `" "prefix_rewrite": "` + prefixRewrite + `"
} }
}, },

View File

@ -38,64 +38,206 @@ const (
] ]
} }
}` }`
expectedPromListener = `{ expectedPrometheusBackendCluster = `{
"name": "envoy_prometheus_metrics_listener", "name": "prometheus_backend",
"address": { "ignore_health_on_host_removal": false,
"socket_address": { "connect_timeout": "5s",
"address": "0.0.0.0", "type": "STATIC",
"port_value": 9000 "http_protocol_options": {},
} "loadAssignment": {
}, "clusterName": "prometheus_backend",
"filter_chains": [ "endpoints": [
{ {
"filters": [ "lbEndpoints": [
{ {
"name": "envoy.filters.network.http_connection_manager", "endpoint": {
"typedConfig": { "address": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", "socket_address": {
"stat_prefix": "envoy_prometheus_metrics", "address": "127.0.0.1",
"codec_type": "HTTP1", "port_value": 20100
"route_config": {
"name": "self_admin_route",
"virtual_hosts": [
{
"name": "self_admin",
"domains": [
"*"
],
"routes": [
{
"match": {
"path": "/metrics"
},
"route": {
"cluster": "self_admin",
"prefix_rewrite": "/stats/prometheus"
}
},
{
"match": {
"prefix": "/"
},
"direct_response": {
"status": 404
}
}
]
} }
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
} }
] }
} }
} ]
] }
} ]
] }
}` }`
expectedPromListener = `{
"name": "envoy_prometheus_metrics_listener",
"address": {
"socket_address": {
"address": "0.0.0.0",
"port_value": 9000
}
},
"filter_chains": [
{
"filters": [
{
"name": "envoy.filters.network.http_connection_manager",
"typedConfig": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
"stat_prefix": "envoy_prometheus_metrics",
"codec_type": "HTTP1",
"route_config": {
"name": "self_admin_route",
"virtual_hosts": [
{
"name": "self_admin",
"domains": [
"*"
],
"routes": [
{
"match": {
"path": "/metrics"
},
"route": {
"cluster": "self_admin",
"prefix_rewrite": "/stats/prometheus"
}
},
{
"match": {
"prefix": "/"
},
"direct_response": {
"status": 404
}
}
]
}
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
}
]
}
}
]
}
]
}`
expectedPromListenerCustomScrapePath = `{
"name": "envoy_prometheus_metrics_listener",
"address": {
"socket_address": {
"address": "0.0.0.0",
"port_value": 9000
}
},
"filter_chains": [
{
"filters": [
{
"name": "envoy.filters.network.http_connection_manager",
"typedConfig": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
"stat_prefix": "envoy_prometheus_metrics",
"codec_type": "HTTP1",
"route_config": {
"name": "self_admin_route",
"virtual_hosts": [
{
"name": "self_admin",
"domains": [
"*"
],
"routes": [
{
"match": {
"path": "/scrape-path"
},
"route": {
"cluster": "self_admin",
"prefix_rewrite": "/stats/prometheus"
}
},
{
"match": {
"prefix": "/"
},
"direct_response": {
"status": 404
}
}
]
}
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
}
]
}
}
]
}
]
}`
expectedPromListenerWithPrometheusBackendCluster = `{
"name": "envoy_prometheus_metrics_listener",
"address": {
"socket_address": {
"address": "0.0.0.0",
"port_value": 9000
}
},
"filter_chains": [
{
"filters": [
{
"name": "envoy.filters.network.http_connection_manager",
"typedConfig": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
"stat_prefix": "envoy_prometheus_metrics",
"codec_type": "HTTP1",
"route_config": {
"name": "self_admin_route",
"virtual_hosts": [
{
"name": "self_admin",
"domains": [
"*"
],
"routes": [
{
"match": {
"path": "/metrics"
},
"route": {
"cluster": "prometheus_backend",
"prefix_rewrite": "/stats/prometheus"
}
},
{
"match": {
"prefix": "/"
},
"direct_response": {
"status": 404
}
}
]
}
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
}
]
}
}
]
}
]
}`
expectedStatsListener = `{ expectedStatsListener = `{
"name": "envoy_metrics_listener", "name": "envoy_metrics_listener",
"address": { "address": {
@ -457,8 +599,9 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
PrometheusBindAddr: "0.0.0.0:9000", PrometheusBindAddr: "0.0.0.0:9000",
}, },
baseArgs: BootstrapTplArgs{ baseArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
PrometheusScrapePath: "/metrics",
}, },
wantArgs: BootstrapTplArgs{ wantArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
@ -466,8 +609,9 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
// Should add a static cluster for the self-proxy to admin // Should add a static cluster for the self-proxy to admin
StaticClustersJSON: expectedSelfAdminCluster, StaticClustersJSON: expectedSelfAdminCluster,
// Should add a static http listener too // Should add a static http listener too
StaticListenersJSON: expectedPromListener, StaticListenersJSON: expectedPromListener,
StatsConfigJSON: defaultStatsConfigJSON, StatsConfigJSON: defaultStatsConfigJSON,
PrometheusScrapePath: "/metrics",
}, },
wantErr: false, wantErr: false,
}, },
@ -479,8 +623,9 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
StaticListenersJSON: `{"baz":"qux"}`, StaticListenersJSON: `{"baz":"qux"}`,
}, },
baseArgs: BootstrapTplArgs{ baseArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
PrometheusScrapePath: "/scrape-path",
}, },
wantArgs: BootstrapTplArgs{ wantArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
@ -488,8 +633,33 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
// Should add a static cluster for the self-proxy to admin // Should add a static cluster for the self-proxy to admin
StaticClustersJSON: `{"foo":"bar"},` + expectedSelfAdminCluster, StaticClustersJSON: `{"foo":"bar"},` + expectedSelfAdminCluster,
// Should add a static http listener too // Should add a static http listener too
StaticListenersJSON: `{"baz":"qux"},` + expectedPromListener, StaticListenersJSON: `{"baz":"qux"},` + expectedPromListenerCustomScrapePath,
StatsConfigJSON: defaultStatsConfigJSON, StatsConfigJSON: defaultStatsConfigJSON,
PrometheusScrapePath: "/scrape-path",
},
wantErr: false,
},
{
name: "prometheus-bind-addr-with-prometheus-backend",
input: BootstrapConfig{
PrometheusBindAddr: "0.0.0.0:9000",
},
baseArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000",
PrometheusBackendPort: "20100",
PrometheusScrapePath: "/metrics",
},
wantArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000",
// Should use the "prometheus_backend" cluster instead, which
// uses the PrometheusBackendPort rather than Envoy admin port
StaticClustersJSON: expectedPrometheusBackendCluster,
StaticListenersJSON: expectedPromListenerWithPrometheusBackendCluster,
StatsConfigJSON: defaultStatsConfigJSON,
PrometheusBackendPort: "20100",
PrometheusScrapePath: "/metrics",
}, },
wantErr: false, wantErr: false,
}, },
@ -635,8 +805,9 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
StatsBindAddr: "0.0.0.0:9000", StatsBindAddr: "0.0.0.0:9000",
}, },
baseArgs: BootstrapTplArgs{ baseArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
PrometheusScrapePath: "/metrics",
}, },
wantArgs: BootstrapTplArgs{ wantArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
@ -648,7 +819,8 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
[]string{expectedPromListener, expectedStatsListener, expectedReadyListener}, []string{expectedPromListener, expectedStatsListener, expectedReadyListener},
", ", ", ",
), ),
StatsConfigJSON: defaultStatsConfigJSON, StatsConfigJSON: defaultStatsConfigJSON,
PrometheusScrapePath: "/metrics",
}, },
wantErr: false, wantErr: false,
}, },
@ -660,8 +832,9 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
StatsBindAddr: "0.0.0.0:9000", StatsBindAddr: "0.0.0.0:9000",
}, },
baseArgs: BootstrapTplArgs{ baseArgs: BootstrapTplArgs{
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
PrometheusScrapePath: "/metrics",
}, },
omitDeprecatedTags: true, omitDeprecatedTags: true,
wantArgs: BootstrapTplArgs{ wantArgs: BootstrapTplArgs{
@ -673,7 +846,8 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) {
", ", ", ",
), ),
// Should not have default stats config JSON when deprecated tags are omitted // Should not have default stats config JSON when deprecated tags are omitted
StatsConfigJSON: updatedStatsConfigJSON, StatsConfigJSON: updatedStatsConfigJSON,
PrometheusScrapePath: "/metrics",
}, },
wantErr: false, wantErr: false,
}, },

View File

@ -95,6 +95,14 @@ type BootstrapTplArgs struct {
// EnvoyVersion is the envoy version, which is necessary to generate the // EnvoyVersion is the envoy version, which is necessary to generate the
// correct configuration. // correct configuration.
EnvoyVersion string EnvoyVersion string
// PrometheusBackendPort will configure a "prometheus_backend" cluster which
// envoy_prometheus_bind_addr will point to.
PrometheusBackendPort string
// PrometheusScrapePath will configure the path where metrics are exposed on
// the envoy_prometheus_bind_addr listener.
PrometheusScrapePath string
} }
// GRPC settings used in the bootstrap template. // GRPC settings used in the bootstrap template.

View File

@ -52,17 +52,19 @@ type cmd struct {
directOut io.Writer directOut io.Writer
// flags // flags
meshGateway bool meshGateway bool
gateway string gateway string
proxyID string proxyID string
sidecarFor string sidecarFor string
adminAccessLogPath string adminAccessLogPath string
adminBind string adminBind string
envoyBin string envoyBin string
bootstrap bool bootstrap bool
disableCentralConfig bool disableCentralConfig bool
grpcAddr string grpcAddr string
envoyVersion string envoyVersion string
prometheusBackendPort string
prometheusScrapePath string
// mesh gateway registration information // mesh gateway registration information
register bool register bool
@ -165,6 +167,19 @@ func (c *cmd) init() {
"consul.destination.[service|dc|...]. The old tags were preserved for backward compatibility,"+ "consul.destination.[service|dc|...]. The old tags were preserved for backward compatibility,"+
"but can be disabled with this flag.") "but can be disabled with this flag.")
c.flags.StringVar(&c.prometheusBackendPort, "prometheus-backend-port", "",
"Sets the backend port for the 'prometheus_backend' cluster that envoy_prometheus_bind_addr will point to. "+
"Without this flag, envoy_prometheus_bind_addr would point to the 'self_admin' cluster where Envoy metrics are exposed. "+
"The metrics merging feature in consul-k8s uses this to point to the merged metrics endpoint combining Envoy and service metrics. "+
"Only applicable when envoy_prometheus_bind_addr is set in proxy config.")
c.flags.StringVar(&c.prometheusScrapePath, "prometheus-scrape-path", "/metrics",
"Sets the path where Envoy will expose metrics on envoy_prometheus_bind_addr listener. "+
"For example, if envoy_prometheus_bind_addr is 0.0.0.0:20200, and this flag is "+
"set to /scrape-metrics, prometheus metrics would be scrapeable at "+
"0.0.0.0:20200/scrape-metrics. "+
"Only applicable when envoy_prometheus_bind_addr is set in proxy config.")
c.http = &flags.HTTPFlags{} c.http = &flags.HTTPFlags{}
flags.Merge(c.flags, c.http.ClientFlags()) flags.Merge(c.flags, c.http.ClientFlags())
flags.Merge(c.flags, c.http.NamespaceFlags()) flags.Merge(c.flags, c.http.NamespaceFlags())
@ -479,6 +494,8 @@ func (c *cmd) templateArgs() (*BootstrapTplArgs, error) {
Namespace: httpCfg.Namespace, Namespace: httpCfg.Namespace,
EnvoyVersion: c.envoyVersion, EnvoyVersion: c.envoyVersion,
Datacenter: httpCfg.Datacenter, Datacenter: httpCfg.Datacenter,
PrometheusBackendPort: c.prometheusBackendPort,
PrometheusScrapePath: c.prometheusScrapePath,
}, nil }, nil
} }

View File

@ -146,6 +146,37 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusBackendPort: "",
PrometheusScrapePath: "/metrics",
},
},
{
Name: "prometheus-metrics",
Flags: []string{"-proxy-id", "test-proxy",
"-prometheus-backend-port", "20100", "-prometheus-scrape-path", "/scrape-path"},
ProxyConfig: map[string]interface{}{
// When envoy_prometheus_bind_addr is set, if
// PrometheusBackendPort is set, there will be a
// "prometheus_backend" cluster in the Envoy configuration.
"envoy_prometheus_bind_addr": "0.0.0.0:9000",
},
WantArgs: BootstrapTplArgs{
EnvoyVersion: defaultEnvoyVersion,
ProxyCluster: "test-proxy",
ProxyID: "test-proxy",
// We don't know this til after the lookup so it will be empty in the
// initial args call we are testing here.
ProxySourceService: "",
GRPC: GRPC{
AgentAddress: "127.0.0.1",
AgentPort: "8502", // Note this is the gRPC port
},
AdminAccessLogPath: "/dev/null",
AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusBackendPort: "20100",
PrometheusScrapePath: "/scrape-path",
}, },
}, },
{ {
@ -168,6 +199,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95", Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95",
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -192,6 +224,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95", Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95",
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -218,6 +251,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95", Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95",
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -245,6 +279,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95", Token: "c9a52720-bf6c-4aa6-b8bc-66881a5ade95",
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -269,6 +304,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -295,6 +331,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -315,6 +352,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -339,6 +377,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -362,6 +401,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -408,6 +448,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -454,6 +495,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -496,6 +538,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -533,6 +576,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -575,6 +619,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -604,6 +649,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -663,6 +709,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -688,6 +735,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -706,6 +754,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -724,6 +773,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -742,6 +792,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -760,6 +811,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
{ {
@ -778,6 +830,7 @@ func TestGenerateConfig(t *testing.T) {
AdminBindAddress: "127.0.0.1", AdminBindAddress: "127.0.0.1",
AdminBindPort: "19000", AdminBindPort: "19000",
LocalAgentClusterName: xds.LocalAgentClusterName, LocalAgentClusterName: xds.LocalAgentClusterName,
PrometheusScrapePath: "/metrics",
}, },
}, },
} }

View File

@ -0,0 +1,265 @@
{
"admin": {
"access_log_path": "/dev/null",
"address": {
"socket_address": {
"address": "127.0.0.1",
"port_value": 19000
}
}
},
"node": {
"cluster": "test-proxy",
"id": "test-proxy",
"metadata": {
"namespace": "default",
"envoy_version": "1.17.0"
}
},
"static_resources": {
"clusters": [
{
"name": "local_agent",
"ignore_health_on_host_removal": false,
"connect_timeout": "1s",
"type": "STATIC",
"http2_protocol_options": {},
"loadAssignment": {
"clusterName": "local_agent",
"endpoints": [
{
"lbEndpoints": [
{
"endpoint": {
"address": {
"socket_address": {
"address": "127.0.0.1",
"port_value": 8502
}
}
}
}
]
}
]
}
},
{
"name": "prometheus_backend",
"ignore_health_on_host_removal": false,
"connect_timeout": "5s",
"type": "STATIC",
"http_protocol_options": {},
"loadAssignment": {
"clusterName": "prometheus_backend",
"endpoints": [
{
"lbEndpoints": [
{
"endpoint": {
"address": {
"socket_address": {
"address": "127.0.0.1",
"port_value": 20100
}
}
}
}
]
}
]
}
}
],
"listeners": [
{
"name": "envoy_prometheus_metrics_listener",
"address": {
"socket_address": {
"address": "0.0.0.0",
"port_value": 9000
}
},
"filter_chains": [
{
"filters": [
{
"name": "envoy.filters.network.http_connection_manager",
"typedConfig": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
"stat_prefix": "envoy_prometheus_metrics",
"codec_type": "HTTP1",
"route_config": {
"name": "self_admin_route",
"virtual_hosts": [
{
"name": "self_admin",
"domains": [
"*"
],
"routes": [
{
"match": {
"path": "/scrape-path"
},
"route": {
"cluster": "prometheus_backend",
"prefix_rewrite": "/stats/prometheus"
}
},
{
"match": {
"prefix": "/"
},
"direct_response": {
"status": 404
}
}
]
}
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
}
]
}
}
]
}
]
}
]
},
"stats_config": {
"stats_tags": [
{
"regex": "^cluster\\.((?:([^.]+)~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.custom_hash"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:([^.]+)\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.service_subset"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?([^.]+)\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.service"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.namespace"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.([^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.datacenter"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.([^.]+)\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.routing_type"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.([^.]+)\\.consul\\.)",
"tag_name": "consul.destination.trust_domain"
},
{
"regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.destination.target"
},
{
"regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+)\\.consul\\.)",
"tag_name": "consul.destination.full_target"
},
{
"regex": "^(?:tcp|http)\\.upstream\\.(([^.]+)(?:\\.[^.]+)?\\.[^.]+\\.)",
"tag_name": "consul.upstream.service"
},
{
"regex": "^(?:tcp|http)\\.upstream\\.([^.]+(?:\\.[^.]+)?\\.([^.]+)\\.)",
"tag_name": "consul.upstream.datacenter"
},
{
"regex": "^(?:tcp|http)\\.upstream\\.([^.]+(?:\\.([^.]+))?\\.[^.]+\\.)",
"tag_name": "consul.upstream.namespace"
},
{
"regex": "^cluster\\.((?:([^.]+)~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.custom_hash"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:([^.]+)\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.service_subset"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?([^.]+)\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.service"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.namespace"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.([^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.datacenter"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.([^.]+)\\.[^.]+\\.consul\\.)",
"tag_name": "consul.routing_type"
},
{
"regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.([^.]+)\\.consul\\.)",
"tag_name": "consul.trust_domain"
},
{
"regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)",
"tag_name": "consul.target"
},
{
"regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.[^.]+\\.[^.]+)\\.consul\\.)",
"tag_name": "consul.full_target"
},
{
"tag_name": "local_cluster",
"fixed_value": "test-proxy"
},
{
"tag_name": "consul.source.service",
"fixed_value": "test-proxy"
},
{
"tag_name": "consul.source.namespace",
"fixed_value": "default"
},
{
"tag_name": "consul.source.datacenter",
"fixed_value": "dc1"
}
],
"use_all_default_tags": true
},
"dynamic_resources": {
"lds_config": {
"ads": {},
"resource_api_version": "V3"
},
"cds_config": {
"ads": {},
"resource_api_version": "V3"
},
"ads_config": {
"api_type": "GRPC",
"transport_api_version": "V3",
"grpc_services": {
"initial_metadata": [
{
"key": "x-consul-token",
"value": ""
}
],
"envoy_grpc": {
"cluster_name": "local_agent"
}
}
}
}
}

View File

@ -82,6 +82,19 @@ proxy configuration needed.
In cases where either assumption is violated this flag will prevent the In cases where either assumption is violated this flag will prevent the
command attempting to resolve config from the local agent. command attempting to resolve config from the local agent.
- `-prometheus-backend-port` - Sets the backend port for the "prometheus_backend"
cluster that `envoy_prometheus_bind_addr` will point to. Without this flag,
`envoy_prometheus_bind_addr` would point to the "self_admin" cluster where Envoy metrics
are exposed. The metrics merging feature in consul-k8s uses this to point to the
merged metrics endpoint combining Envoy and service metrics.
Only applicable when `envoy_prometheus_bind_addr` is set in proxy config.
- `-prometheus-scrape-path` - Sets the path where Envoy will expose metrics on the
`envoy_prometheus_bind_addr` listener. Default is `/metrics`. For example, if `envoy_prometheus_bind_addr`
is `0.0.0.0:20200`, and this flag is set to `/scrape-metrics`, prometheus metrics would
be scrapable at `0.0.0.0:20200/scrape-metrics`.
Only applicable when `envoy_prometheus_bind_addr` is set in proxy config.
- `-- [pass-through options]` - Any options given after a double dash are passed - `-- [pass-through options]` - Any options given after a double dash are passed
directly through to the `envoy` invocation. See [Envoy's directly through to the `envoy` invocation. See [Envoy's
documentation](https://www.envoyproxy.io/docs) for more details. The command documentation](https://www.envoyproxy.io/docs) for more details. The command