From 6378205415cf6f6a0682f024101fe581fa21d292 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Wed, 17 Mar 2021 00:16:06 +0200 Subject: [PATCH] lib/netutil: enable IPv6 UDP listening if `-enableTCP6` command-line flag is passed to VictoriaMetrics This is a follow-up for 18cfc4be7bf0bf5bb275b39721dd7ab9eb875d20 See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1131 --- README.md | 8 +++++--- app/vmagent/remotewrite/statconn.go | 9 +-------- docs/CHANGELOG.md | 1 + docs/Single-server-VictoriaMetrics.md | 8 +++++--- lib/netutil/tcplistener.go | 16 +++++++++++++--- lib/netutil/udp.go | 14 -------------- lib/promscrape/statconn.go | 1 + lib/proxy/proxy.go | 5 +---- 8 files changed, 27 insertions(+), 35 deletions(-) delete mode 100644 lib/netutil/udp.go diff --git a/README.md b/README.md index b602c58fc..bdc9b2662 100644 --- a/README.md +++ b/README.md @@ -1568,7 +1568,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li -dryRun Whether to check only -promscrape.config and then exit. Unknown config entries are allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set -envflag.prefix string @@ -1624,6 +1624,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li Trim timestamps for Influx line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + -logNewSeries + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int @@ -1710,7 +1712,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li -promscrape.kubernetesSDCheckInterval duration Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets shown at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxScrapeSize size The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) @@ -1766,7 +1768,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.queryStats.lastQueriesCount int Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) - -search.queryStats.minQueryDuration int + -search.queryStats.minQueryDuration duration The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats -search.resetCacheAuthKey string Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call diff --git a/app/vmagent/remotewrite/statconn.go b/app/vmagent/remotewrite/statconn.go index 3c227dc19..7b15f3941 100644 --- a/app/vmagent/remotewrite/statconn.go +++ b/app/vmagent/remotewrite/statconn.go @@ -1,9 +1,7 @@ package remotewrite import ( - "fmt" "net" - "strings" "sync/atomic" "time" @@ -12,12 +10,7 @@ import ( ) func statDial(network, addr string) (conn net.Conn, err error) { - if !strings.HasPrefix(network, "tcp") { - return nil, fmt.Errorf("unexpected network passed to statDial: %q; it must start from `tcp`", network) - } - if !netutil.TCP6Enabled() { - network = "tcp4" - } + network = netutil.GetTCPNetwork() conn, err = net.DialTimeout(network, addr, 5*time.Second) dialsTotal.Inc() if err != nil { diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4f95915ea..937a4fa2d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -16,6 +16,7 @@ * FEATURE: add `-influx.databaseNames` command-line flag, which can be used for accepting data from some Telegraf plugins such as [fluentd plugin](https://github.com/fangli/fluent-plugin-influxdb). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1124). * FEATURE: add `-logNewSeries` command-line flag, which can be used for debugging the source of time series churn rate. * FEATURE: publish Windows builds for [vmagent](https://victoriametrics.github.io/vmagent.html), [vmalert](https://victoriametrics.github.io/vmalert.html), [vmauth](https://victoriametrics.github.io/vmauth.html) and [vmctl](https://victoriametrics.github.io/vmctl.html) at `vmutils-windows-*.zip` archives at [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). +* FEATURE: listen for IPv6 UDP if `-enableTCP6` command-line flag is passed to VictoriaMetrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1131). * BUGFIX: vmagent: prevent from high CPU usage bug during failing scrapes with small `scrape_timeout` (less than a few seconds). * BUGFIX: vmagent: reduce memory usage when Kubernetes service discovery is used in big number of distinct scrape config jobs by sharing Kubernetes object cache. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1113 diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index b602c58fc..bdc9b2662 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -1568,7 +1568,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li -dryRun Whether to check only -promscrape.config and then exit. Unknown config entries are allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set -envflag.prefix string @@ -1624,6 +1624,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li Trim timestamps for Influx line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + -logNewSeries + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int @@ -1710,7 +1712,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li -promscrape.kubernetesSDCheckInterval duration Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets shown at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxScrapeSize size The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) @@ -1766,7 +1768,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.queryStats.lastQueriesCount int Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) - -search.queryStats.minQueryDuration int + -search.queryStats.minQueryDuration duration The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats -search.resetCacheAuthKey string Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call diff --git a/lib/netutil/tcplistener.go b/lib/netutil/tcplistener.go index 8f5afa166..fcc5ce26b 100644 --- a/lib/netutil/tcplistener.go +++ b/lib/netutil/tcplistener.go @@ -11,14 +11,14 @@ import ( "github.com/VictoriaMetrics/metrics" ) -var enableTCP6 = flag.Bool("enableTCP6", false, "Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP is used") +var enableTCP6 = flag.Bool("enableTCP6", false, "Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used") // NewTCPListener returns new TCP listener for the given addr. // // name is used for exported metrics. Each listener in the program must have // distinct name. func NewTCPListener(name, addr string) (*TCPListener, error) { - network := getNetwork() + network := GetTCPNetwork() ln, err := net.Listen(network, addr) if err != nil { return nil, err @@ -38,7 +38,17 @@ func TCP6Enabled() bool { return *enableTCP6 } -func getNetwork() string { +// GetUDPNetwork returns current udp network. +func GetUDPNetwork() string { + if *enableTCP6 { + // Enable both udp4 and udp6 + return "udp" + } + return "udp4" +} + +// GetTCPNetwork returns current tcp network. +func GetTCPNetwork() string { if *enableTCP6 { // Enable both tcp4 and tcp6 return "tcp" diff --git a/lib/netutil/udp.go b/lib/netutil/udp.go deleted file mode 100644 index 96f11eb6f..000000000 --- a/lib/netutil/udp.go +++ /dev/null @@ -1,14 +0,0 @@ -package netutil - -import "flag" - -var enableUDP6 = flag.Bool("enableUDP6", false, "Whether to enable IPv6 for listening. By default only IPv4 UDP is used") - -// GetUDPNetwork returns current udp network. -func GetUDPNetwork() string { - if *enableUDP6 { - // Enable both udp4 and udp6 - return "udp" - } - return "udp4" -} diff --git a/lib/promscrape/statconn.go b/lib/promscrape/statconn.go index d8bbdce9f..5635be081 100644 --- a/lib/promscrape/statconn.go +++ b/lib/promscrape/statconn.go @@ -17,6 +17,7 @@ import ( func statStdDial(ctx context.Context, network, addr string) (net.Conn, error) { d := getStdDialer() + network = netutil.GetTCPNetwork() conn, err := d.DialContext(ctx, network, addr) dialsTotal.Inc() if err != nil { diff --git a/lib/proxy/proxy.go b/lib/proxy/proxy.go index 097fed222..207276cac 100644 --- a/lib/proxy/proxy.go +++ b/lib/proxy/proxy.go @@ -138,10 +138,7 @@ func tlsServerName(addr string) string { } func defaultDialFunc(addr string) (net.Conn, error) { - network := "tcp4" - if netutil.TCP6Enabled() { - network = "tcp" - } + network := netutil.GetTCPNetwork() // Do not use fasthttp.Dial because of https://github.com/VictoriaMetrics/VictoriaMetrics/issues/987 return net.DialTimeout(network, addr, 5*time.Second) }