From 323f3720ed33a834ce32c2a6b95101aad2e5042c Mon Sep 17 00:00:00 2001 From: Zakhar Bessarab Date: Fri, 3 Nov 2023 15:04:17 +0400 Subject: [PATCH 01/48] app/vmauth: add option to skip TLS verification (#5256) Add `tls_insecure_skip_verify` option on per-user basis which allows to disable TLS verification for all requests to backend on behalf of this user. See: https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240 Signed-off-by: Zakhar Bessarab --- app/vmauth/README.md | 10 +++++++++ app/vmauth/auth_config.go | 12 +++++++++-- app/vmauth/auth_config_test.go | 38 ++++++++++++++++++++++++++++++++++ app/vmauth/main.go | 22 ++++++++++---------- docs/CHANGELOG.md | 1 + docs/vmauth.md | 10 +++++++++ 6 files changed, 80 insertions(+), 13 deletions(-) diff --git a/app/vmauth/README.md b/app/vmauth/README.md index bc366a7978..5d5a1e8752 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -181,6 +181,15 @@ users: password: "***" url_prefix: "http://localhost:8428?extra_label=team=dev" + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) + # are proxied to http://localhost:8428 with extra_label=team=dev query arg. + # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query?extra_label=team=dev + # TLS verification is skipped for https://localhost. +- username: "local-single-node-with-tls" + password: "***" + url_prefix: "https://localhost?extra_label=team=test" + tls_insecure_skip_verify: true + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) # are load-balanced among http://vmselect1:8481/select/123/prometheus and http://vmselect2:8481/select/123/prometheus # For example, http://vmauth:8427/api/v1/query is proxied to the following urls in a round-robin manner: @@ -257,6 +266,7 @@ unauthorized_user: - http://vmselect-az1/?deny_partial_response=1 - http://vmselect-az2/?deny_partial_response=1 retry_status_codes: [503, 500] + tls_insecure_skip_verify: true ip_filters: allow_list: ["1.2.3.0/24", "127.0.0.1"] diff --git a/app/vmauth/auth_config.go b/app/vmauth/auth_config.go index ab67bc498f..7c96ea66ed 100644 --- a/app/vmauth/auth_config.go +++ b/app/vmauth/auth_config.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "flag" "fmt" + "net/http" "net/url" "os" "regexp" @@ -14,13 +15,14 @@ import ( "sync/atomic" "time" + "github.com/VictoriaMetrics/metrics" + "gopkg.in/yaml.v2" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/envtemplate" "github.com/VictoriaMetrics/VictoriaMetrics/lib/fasttime" "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" - "github.com/VictoriaMetrics/metrics" - "gopkg.in/yaml.v2" ) var ( @@ -48,10 +50,13 @@ type UserInfo struct { MaxConcurrentRequests int `yaml:"max_concurrent_requests,omitempty"` DefaultURL *URLPrefix `yaml:"default_url,omitempty"` RetryStatusCodes []int `yaml:"retry_status_codes,omitempty"` + TLSInsecureSkipVerify bool `yaml:"tls_insecure_skip_verify,omitempty"` concurrencyLimitCh chan struct{} concurrencyLimitReached *metrics.Counter + httpTransport *http.Transport + requests *metrics.Counter requestsDuration *metrics.Summary } @@ -442,6 +447,7 @@ func parseAuthConfig(data []byte) (*AuthConfig, error) { _ = metrics.GetOrCreateGauge(`vmauth_unauthorized_user_concurrent_requests_current`, func() float64 { return float64(len(ui.concurrencyLimitCh)) }) + ui.httpTransport = getTransport(ui.TLSInsecureSkipVerify) } return &ac, nil } @@ -512,6 +518,8 @@ func parseAuthConfigUsers(ac *AuthConfig) (map[string]*UserInfo, error) { _ = metrics.GetOrCreateGauge(fmt.Sprintf(`vmauth_user_concurrent_requests_current{username=%q}`, name), func() float64 { return float64(len(ui.concurrencyLimitCh)) }) + ui.httpTransport = getTransport(ui.TLSInsecureSkipVerify) + byAuthToken[at1] = ui byAuthToken[at2] = ui } diff --git a/app/vmauth/auth_config_test.go b/app/vmauth/auth_config_test.go index dc465bcfcf..bf9902e2be 100644 --- a/app/vmauth/auth_config_test.go +++ b/app/vmauth/auth_config_test.go @@ -227,12 +227,14 @@ users: password: bar url_prefix: http://aaa:343/bbb max_concurrent_requests: 5 + tls_insecure_skip_verify: true `, map[string]*UserInfo{ getAuthToken("", "foo", "bar"): { Username: "foo", Password: "bar", URLPrefix: mustParseURL("http://aaa:343/bbb"), MaxConcurrentRequests: 5, + TLSInsecureSkipVerify: true, }, }) @@ -448,6 +450,42 @@ users: } +func TestParseAuthConfigPassesTLSVerificationConfig(t *testing.T) { + c := ` +users: +- username: foo + password: bar + url_prefix: https://aaa/bbb + max_concurrent_requests: 5 + tls_insecure_skip_verify: true + +unauthorized_user: + url_prefix: http://aaa:343/bbb + max_concurrent_requests: 5 + tls_insecure_skip_verify: false +` + + ac, err := parseAuthConfig([]byte(c)) + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + m, err := parseAuthConfigUsers(ac) + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + + ui := m[getAuthToken("", "foo", "bar")] + if ui.TLSInsecureSkipVerify != true || ui.httpTransport.TLSClientConfig.InsecureSkipVerify != true { + t.Fatalf("unexpected TLSInsecureSkipVerify value for user foo") + } + + if ac.UnauthorizedUser.TLSInsecureSkipVerify != false || + ac.UnauthorizedUser.httpTransport.TLSClientConfig.InsecureSkipVerify != false { + t.Fatalf("unexpected TLSInsecureSkipVerify value for unauthorized_user") + } + +} + func getSrcPaths(paths []string) []*SrcPath { var sps []*SrcPath for _, path := range paths { diff --git a/app/vmauth/main.go b/app/vmauth/main.go index 709f83f026..3d3a94c21d 100644 --- a/app/vmauth/main.go +++ b/app/vmauth/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "crypto/tls" "errors" "flag" "fmt" @@ -15,6 +16,8 @@ import ( "sync" "time" + "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/buildinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/envflag" @@ -24,7 +27,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/netutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" - "github.com/VictoriaMetrics/metrics" ) var ( @@ -191,7 +193,7 @@ func processRequest(w http.ResponseWriter, r *http.Request, ui *UserInfo) { } else { // Update path for regular routes. targetURL = mergeURLs(targetURL, u) } - ok := tryProcessingRequest(w, r, targetURL, hc, retryStatusCodes) + ok := tryProcessingRequest(w, r, targetURL, hc, retryStatusCodes, ui.httpTransport) bu.put() if ok { return @@ -205,12 +207,11 @@ func processRequest(w http.ResponseWriter, r *http.Request, ui *UserInfo) { httpserver.Errorf(w, r, "%s", err) } -func tryProcessingRequest(w http.ResponseWriter, r *http.Request, targetURL *url.URL, hc HeadersConf, retryStatusCodes []int) bool { +func tryProcessingRequest(w http.ResponseWriter, r *http.Request, targetURL *url.URL, hc HeadersConf, retryStatusCodes []int, transport *http.Transport) bool { // This code has been copied from net/http/httputil/reverseproxy.go req := sanitizeRequestHeaders(r) req.URL = targetURL updateHeadersByConfig(req.Header, hc.RequestHeaders) - transportOnce.Do(transportInit) res, err := transport.RoundTrip(req) rtb, rtbOK := req.Body.(*readTrackingBody) if err != nil { @@ -353,12 +354,7 @@ var ( missingRouteRequests = metrics.NewCounter(`vmauth_http_request_errors_total{reason="missing_route"}`) ) -var ( - transport *http.Transport - transportOnce sync.Once -) - -func transportInit() { +func getTransport(skipTLSVerification bool) *http.Transport { tr := http.DefaultTransport.(*http.Transport).Clone() tr.ResponseHeaderTimeout = *responseTimeout // Automatic compression must be disabled in order to fix https://github.com/VictoriaMetrics/VictoriaMetrics/issues/535 @@ -369,7 +365,11 @@ func transportInit() { if tr.MaxIdleConns != 0 && tr.MaxIdleConns < tr.MaxIdleConnsPerHost { tr.MaxIdleConns = tr.MaxIdleConnsPerHost } - transport = tr + if tr.TLSClientConfig == nil { + tr.TLSClientConfig = &tls.Config{} + } + tr.TLSClientConfig.InsecureSkipVerify = skipTLSVerification + return tr } var ( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 8f7c149c5d..f82a554604 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -76,6 +76,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert-tool](https://docs.victoriametrics.com/#vmalert-tool): add `unittest` command to run unittest for alerting and recording rules. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4789) for details. * FEATURE: dashboards/vmalert: add new panel `Missed evaluations` for indicating alerting groups that miss their evaluations. * FEATURE: all: track requests with wrong auth key and wrong basic auth at `vm_http_request_errors_total` [metric](https://docs.victoriametrics.com/#monitoring) with `reason="wrong_auth_key"` and `reason="wrong_basic_auth"`. See [this issue](https://github.com/victoriaMetrics/victoriaMetrics/issues/4590). Thanks to @venkatbvc for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5166). +* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which allows to disable TLS verification for backend connection. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): strip sensitive information such as auth headers or passwords from datasource, remote-read, remote-write or notifier URLs in log messages or UI. This behavior is by default and is controlled via `-datasource.showURL`, `-remoteRead.showURL`, `remoteWrite.showURL` or `-notifier.showURL` cmd-line flags. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5044). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): fix vmalert web UI when running on 32-bit architectures machine. diff --git a/docs/vmauth.md b/docs/vmauth.md index 9e68019f87..3de963ad44 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -192,6 +192,15 @@ users: password: "***" url_prefix: "http://localhost:8428?extra_label=team=dev" + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) + # are proxied to http://localhost:8428 with extra_label=team=dev query arg. + # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query?extra_label=team=dev + # TLS verification is ignored for https://localhost. +- username: "local-single-node-with-tls" + password: "***" + url_prefix: "https://localhost?extra_label=team=dev" + tls_insecure_skip_verify: false + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) # are load-balanced among http://vmselect1:8481/select/123/prometheus and http://vmselect2:8481/select/123/prometheus # For example, http://vmauth:8427/api/v1/query is proxied to the following urls in a round-robin manner: @@ -268,6 +277,7 @@ unauthorized_user: - http://vmselect-az1/?deny_partial_response=1 - http://vmselect-az2/?deny_partial_response=1 retry_status_codes: [503, 500] + tls_insecure_skip_verify: true ip_filters: allow_list: ["1.2.3.0/24", "127.0.0.1"] From 054367c421b284d918132d7ddb7f748dc3711d80 Mon Sep 17 00:00:00 2001 From: hagen1778 Date: Fri, 3 Nov 2023 16:22:23 +0100 Subject: [PATCH 02/48] docs: make docs-sync after 323f3720ed33a834ce32c2a6b95101aad2e5042c Signed-off-by: hagen1778 --- docs/vmauth.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/vmauth.md b/docs/vmauth.md index 3de963ad44..ade90019c6 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -195,11 +195,11 @@ users: # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) # are proxied to http://localhost:8428 with extra_label=team=dev query arg. # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query?extra_label=team=dev - # TLS verification is ignored for https://localhost. + # TLS verification is skipped for https://localhost. - username: "local-single-node-with-tls" password: "***" - url_prefix: "https://localhost?extra_label=team=dev" - tls_insecure_skip_verify: false + url_prefix: "https://localhost?extra_label=team=test" + tls_insecure_skip_verify: true # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) # are load-balanced among http://vmselect1:8481/select/123/prometheus and http://vmselect2:8481/select/123/prometheus From f90d2ec843063fa382e2add5206ecb3ecf6bed53 Mon Sep 17 00:00:00 2001 From: Yury Molodov Date: Fri, 3 Nov 2023 16:23:19 +0100 Subject: [PATCH 03/48] vmui: display query error on Explore metrics page (#5272) https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5202 --- README.md | 2 +- .../ExploreMetricGraph/ExploreMetricItemGraph.tsx | 3 ++- docs/CHANGELOG.md | 1 + docs/README.md | 2 +- docs/Single-server-VictoriaMetrics.md | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cc28ee6b79..175fff5424 100644 --- a/README.md +++ b/README.md @@ -442,7 +442,7 @@ This information is obtained from the `/api/v1/status/active_queries` HTTP endpo [VMUI](#vmui) provides an ability to explore metrics exported by a particular `job` / `instance` in the following way: 1. Open the `vmui` at `http://victoriametrics:8428/vmui/`. -1. Click the `Explore metrics` tab. +1. Click the `Explore Prometheus metrics` tab. 1. Select the `job` you want to explore. 1. Optionally select the `instance` for the selected job to explore. 1. Select metrics you want to explore and compare. diff --git a/app/vmui/packages/vmui/src/components/ExploreMetrics/ExploreMetricGraph/ExploreMetricItemGraph.tsx b/app/vmui/packages/vmui/src/components/ExploreMetrics/ExploreMetricGraph/ExploreMetricItemGraph.tsx index 936504372a..75aa6d4726 100644 --- a/app/vmui/packages/vmui/src/components/ExploreMetrics/ExploreMetricGraph/ExploreMetricItemGraph.tsx +++ b/app/vmui/packages/vmui/src/components/ExploreMetrics/ExploreMetricGraph/ExploreMetricItemGraph.tsx @@ -70,7 +70,7 @@ with (q = ${queryBase}) ( )`; }, [name, job, instance, rateEnabled, isBucket]); - const { isLoading, graphData, error, warning, isHistogram } = useFetchQuery({ + const { isLoading, graphData, error, queryErrors, warning, isHistogram } = useFetchQuery({ predefinedQuery: [query], visible: true, customStep: step, @@ -98,6 +98,7 @@ with (q = ${queryBase}) ( > {isLoading && } {error && {error}} + {queryErrors[0] && {queryErrors[0]}} {warning &&

{warning}

diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index f82a554604..3ad31d19f4 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -100,6 +100,7 @@ The sandbox cluster installation is running under the constant load generated by * BUGFIX: [vmstorage](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): log warning about switching to ReadOnly mode only on state change. Before, vmstorage would log this warning every 1s. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5159) for details. * BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): show browser authorization window for unauthorized requests to unsupported paths if the `unauthorized_user` section is specified. This allows properly authorizing the user. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5236) for details. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix the `Disable cache` toggle at `JSON` and `Table` views. Previously response caching was always enabled and couldn't be disabled at these views. +* BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): correctly display query errors on [Explore Prometheus Metrics](https://docs.victoriametrics.com/#metrics-explorer) page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5202) for details. ## [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) diff --git a/docs/README.md b/docs/README.md index 59eb6f018f..108e9678c2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -445,7 +445,7 @@ This information is obtained from the `/api/v1/status/active_queries` HTTP endpo [VMUI](#vmui) provides an ability to explore metrics exported by a particular `job` / `instance` in the following way: 1. Open the `vmui` at `http://victoriametrics:8428/vmui/`. -1. Click the `Explore metrics` tab. +1. Click the `Explore Prometheus metrics` tab. 1. Select the `job` you want to explore. 1. Optionally select the `instance` for the selected job to explore. 1. Select metrics you want to explore and compare. diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index 97f8bf8b73..6c8b4e6b60 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -453,7 +453,7 @@ This information is obtained from the `/api/v1/status/active_queries` HTTP endpo [VMUI](#vmui) provides an ability to explore metrics exported by a particular `job` / `instance` in the following way: 1. Open the `vmui` at `http://victoriametrics:8428/vmui/`. -1. Click the `Explore metrics` tab. +1. Click the `Explore Prometheus metrics` tab. 1. Select the `job` you want to explore. 1. Optionally select the `instance` for the selected job to explore. 1. Select metrics you want to explore and compare. From c07dc457867a03a860e875b0e0a6db91a03e1fd8 Mon Sep 17 00:00:00 2001 From: hagen1778 Date: Fri, 3 Nov 2023 22:04:50 +0100 Subject: [PATCH 04/48] app/vmalert: fix typo in `remoteWrite.concurrency` description Signed-off-by: hagen1778 --- app/vmalert/README.md | 2 +- app/vmalert/remotewrite/init.go | 2 +- docs/vmalert.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/vmalert/README.md b/app/vmalert/README.md index 0fa25d1fc6..79cd0e0d40 100644 --- a/app/vmalert/README.md +++ b/app/vmalert/README.md @@ -1232,7 +1232,7 @@ The shortlist of configuration flags is the following: -remoteWrite.bearerTokenFile string Optional path to bearer token file to use for -remoteWrite.url. -remoteWrite.concurrency int - Defines number of writers for concurrent writing into remote querier (default 1) + Defines number of writers for concurrent writing into remote write endpoint (default 1) -remoteWrite.disablePathAppend Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. -remoteWrite.flushInterval duration diff --git a/app/vmalert/remotewrite/init.go b/app/vmalert/remotewrite/init.go index 6285c56ba1..7bc1f90d60 100644 --- a/app/vmalert/remotewrite/init.go +++ b/app/vmalert/remotewrite/init.go @@ -30,7 +30,7 @@ var ( maxQueueSize = flag.Int("remoteWrite.maxQueueSize", 1e5, "Defines the max number of pending datapoints to remote write endpoint") maxBatchSize = flag.Int("remoteWrite.maxBatchSize", 1e3, "Defines max number of timeseries to be flushed at once") - concurrency = flag.Int("remoteWrite.concurrency", 1, "Defines number of writers for concurrent writing into remote querier") + concurrency = flag.Int("remoteWrite.concurrency", 1, "Defines number of writers for concurrent writing into remote write endpoint") flushInterval = flag.Duration("remoteWrite.flushInterval", 5*time.Second, "Defines interval of flushes to remote write endpoint") tlsInsecureSkipVerify = flag.Bool("remoteWrite.tlsInsecureSkipVerify", false, "Whether to skip tls verification when connecting to -remoteWrite.url") diff --git a/docs/vmalert.md b/docs/vmalert.md index 7db44ddba9..afe4e9e40c 100644 --- a/docs/vmalert.md +++ b/docs/vmalert.md @@ -1243,7 +1243,7 @@ The shortlist of configuration flags is the following: -remoteWrite.bearerTokenFile string Optional path to bearer token file to use for -remoteWrite.url. -remoteWrite.concurrency int - Defines number of writers for concurrent writing into remote querier (default 1) + Defines number of writers for concurrent writing into remote write endpoint (default 1) -remoteWrite.disablePathAppend Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. -remoteWrite.flushInterval duration From 4d2b98b7551e414246d4bcfe56a5ac66f64a1158 Mon Sep 17 00:00:00 2001 From: Github Actions <133988544+victoriametrics-bot@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:04:12 +0800 Subject: [PATCH 05/48] Automatic update operator docs from VictoriaMetrics/operator@b4b79da (#5291) --- docs/operator/CHANGELOG.md | 6 +++++- docs/operator/vars.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/operator/CHANGELOG.md b/docs/operator/CHANGELOG.md index e577aad553..d097f8412d 100644 --- a/docs/operator/CHANGELOG.md +++ b/docs/operator/CHANGELOG.md @@ -13,7 +13,11 @@ menu: ## Next release -- TODO +### Features + +- [vmoperator](./README.md): properly compare difference for `statefulSet` claimTemplate metadata. See [this commit](https://github.com/VictoriaMetrics/operator/commit/49f9c72b504582b06f72eda94055fd964a11d342) for details. +- [vmoperator](./README.md): sort `statefulSet` pods by id for rolling update order. See [this commit](https://github.com/VictoriaMetrics/operator/commit/e73b03acd073ec3eda34231083a48c6f79a6757b) for details. +- [vmoperator](./README.md): optimize statefulset update logic, that should reduce some unneeded operations. See [this PR](https://github.com/VictoriaMetrics/operator/pull/801) for details. ## [v0.39.1](https://github.com/VictoriaMetrics/operator/releases/tag/v0.39.1) - 1 Nov 2023 diff --git a/docs/operator/vars.md b/docs/operator/vars.md index d5af2929c2..aebf10ae1b 100644 --- a/docs/operator/vars.md +++ b/docs/operator/vars.md @@ -10,7 +10,7 @@ menu: # Auto Generated vars for package config - updated at Wed Nov 1 15:52:40 UTC 2023 + updated at Mon Nov 6 07:44:56 UTC 2023 | varible name | variable default value | variable required | variable description | From ea4ca70be1c998257009e4178e7782fe75fb9f4e Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Tue, 7 Nov 2023 09:27:44 +0100 Subject: [PATCH 06/48] docs: fix formatting in stream aggregation Signed-off-by: Artem Navoiev --- docs/stream-aggregation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stream-aggregation.md b/docs/stream-aggregation.md index 504a8f5b47..ec3bf71d9a 100644 --- a/docs/stream-aggregation.md +++ b/docs/stream-aggregation.md @@ -137,7 +137,7 @@ to one sample per 5 minutes per each input time series (this operation is also k The aggregated output metrics have the following names according to [output metric naming](#output-metric-names): -``` +```text # For input metrics ending with _total some_metric_total:5m_total From e4f44bad9160e8db9c417f1a1df1fd46ba70f6b7 Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Tue, 7 Nov 2023 09:31:21 +0100 Subject: [PATCH 07/48] docs: fix formatting in stream aggregation more Signed-off-by: Artem Navoiev --- docs/stream-aggregation.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/stream-aggregation.md b/docs/stream-aggregation.md index ec3bf71d9a..e0297c17a1 100644 --- a/docs/stream-aggregation.md +++ b/docs/stream-aggregation.md @@ -169,7 +169,7 @@ See [these docs](#aggregating-by-labels) for more details. The aggregated output metric has the following name according to [output metric naming](#output-metric-names): -``` +```text http_requests_total:30s_without_path_user_total ``` @@ -185,7 +185,7 @@ For example, if an advertising server generates `hits{some="labels"} 1` and `cli per each incoming hit and click, then the following [stream aggregation config](#stream-aggregation-config) can be used for counting these metrics per every 30 second interval: -```yml +```yaml - match: '{__name__=~"hits|clicks"}' interval: 30s outputs: [count_samples] @@ -194,7 +194,7 @@ can be used for counting these metrics per every 30 second interval: This config generates the following output metrics for `hits` and `clicks` input metrics according to [output metric naming](#output-metric-names): -``` +```text hits:30s_count_samples count1 clicks:30s_count_samples count2 ``` @@ -221,7 +221,7 @@ can be used for summing these metrics per every minute: This config generates the following output metrics according to [output metric naming](#output-metric-names): -``` +```text hits:1m_sum_samples sum1 clicks:1m_sum_samples sum2 ``` @@ -249,7 +249,7 @@ can be used for calculating 50th and 99th percentiles for these metrics every 30 This config generates the following output metrics according to [output metric naming](#output-metric-names): -``` +```text request_duration_seconds:30s_quantiles{quantile="0.50"} value1 request_duration_seconds:30s_quantiles{quantile="0.99"} value2 @@ -280,7 +280,7 @@ for these metrics every 60 seconds: This config generates the following output metrics according to [output metric naming](#output-metric-names). -``` +```text request_duration_seconds:60s_histogram_bucket{vmrange="start1...end1"} count1 request_duration_seconds:60s_histogram_bucket{vmrange="start2...end2"} count2 ... @@ -326,6 +326,7 @@ See also [quantiles over input metrics](#quantiles-over-input-metrics) and [aggr [Histogram](https://docs.victoriametrics.com/keyConcepts.html#histogram) is a set of [counter](https://docs.victoriametrics.com/keyConcepts.html#counter) metrics with different `vmrange` or `le` labels. As they're counters, the applicable aggregation output is [total](https://docs.victoriametrics.com/stream-aggregation.html#total): + ```yaml - match: 'http_request_duration_seconds_bucket' interval: 1m @@ -337,7 +338,8 @@ metrics with different `vmrange` or `le` labels. As they're counters, the applic ``` This config generates the following output metrics according to [output metric naming](#output-metric-names): -``` + +```text http_request_duration_seconds_bucket:1m_without_instance_total{le="0.1"} value1 http_request_duration_seconds_bucket:1m_without_instance_total{le="0.2"} value2 http_request_duration_seconds_bucket:1m_without_instance_total{le="0.4"} value3 @@ -368,7 +370,7 @@ See also [histograms over input metrics](#histograms-over-input-metrics) and [qu Output metric names for stream aggregation are constructed according to the following pattern: -``` +```text :[_by_][_without_]_ ``` @@ -391,7 +393,7 @@ during stream aggregation via `input_relabel_configs` and `output_relabel_config For example, the following config removes the `:1m_sum_samples` suffix added [to the output metric name](#output-metric-names): -```yml +```yaml - interval: 1m outputs: [sum_samples] output_relabel_configs: @@ -677,7 +679,7 @@ support the following approaches for hot reloading stream aggregation configs fr * By sending `SIGHUP` signal to `vmagent` or `victoria-metrics` process: - ```console + ```bash kill -SIGHUP `pidof vmagent` ``` From b51d16e74c1be9c07ee78bde0a6cacbd3c444501 Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Tue, 7 Nov 2023 09:54:32 +0100 Subject: [PATCH 08/48] docs: url example change the title h2->h3 h3->h4 for better indexing in search Signed-off-by: Artem Navoiev --- docs/url-examples.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/url-examples.md b/docs/url-examples.md index d20177a08f..93e6396f9b 100644 --- a/docs/url-examples.md +++ b/docs/url-examples.md @@ -10,7 +10,7 @@ menu: # VictoriaMetrics API examples -## /api/v1/admin/tsdb/delete_series +### /api/v1/admin/tsdb/delete_series **Deletes time series from VictoriaMetrics** @@ -81,7 +81,7 @@ Additional information: * [How to delete time series](https://docs.victoriametrics.com/#how-to-delete-time-series) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/export +### /api/v1/export **Exports raw samples from VictoriaMetrics in JSON line format** @@ -110,7 +110,7 @@ Additional information: * [How to export data in JSON line format](https://docs.victoriametrics.com/#how-to-export-data-in-json-line-format) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/export/csv +### /api/v1/export/csv **Exports raw samples from VictoriaMetrics in CSV format** @@ -138,7 +138,7 @@ Additional information: * [How to import time series](https://docs.victoriametrics.com/#how-to-import-time-series-data) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/export/native +### /api/v1/export/native **Exports raw samples from VictoriaMetrics in native format** @@ -166,7 +166,7 @@ More information: * [How to import time series](https://docs.victoriametrics.com/#how-to-import-time-series-data) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/import +### /api/v1/import **Imports data to VictoriaMetrics in JSON line format** @@ -194,7 +194,7 @@ More information: * [How to export time series](https://docs.victoriametrics.com/#how-to-export-time-series) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/import/csv +### /api/v1/import/csv **Imports CSV data to VictoriaMetrics** @@ -222,7 +222,7 @@ Additional information: * [How to export time series](https://docs.victoriametrics.com/#how-to-export-time-series) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/import/native +### /api/v1/import/native **Imports data to VictoriaMetrics in native format** @@ -248,7 +248,7 @@ Additional information: * [How to export time series](https://docs.victoriametrics.com/#how-to-export-time-series) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/import/prometheus +### /api/v1/import/prometheus **Imports data to VictoriaMetrics in Prometheus text exposition format** @@ -305,7 +305,7 @@ Additional information: * [Querying label values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/label/.../values +### /api/v1/label/.../values **Get a list of values for a particular label on the given time range** @@ -335,7 +335,7 @@ Additional information: * [Getting label names](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/query +### /api/v1/query **Performs PromQL/MetricsQL instant query** @@ -363,7 +363,7 @@ Additional information: * [Query language](https://docs.victoriametrics.com/keyConcepts.html#metricsql) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/query_range +### /api/v1/query_range **Performs PromQL/MetricsQL range query** @@ -391,7 +391,7 @@ Additional information: * [Query language](https://docs.victoriametrics.com/keyConcepts.html#metricsql) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /api/v1/series +### /api/v1/series **Returns series names with their labels on the given time range** @@ -422,7 +422,7 @@ Additional information: * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) VictoriaMetrics accepts `limit` query arg for `/api/v1/series` handlers for limiting the number of returned entries. For example, the query to `/api/v1/series?limit=5` returns a sample of up to 5 series, while ignoring the rest. If the provided `limit` value exceeds the corresponding `-search.maxSeries` command-line flag values, then limits specified in the command-line flags are used. -## /api/v1/status/tsdb +### /api/v1/status/tsdb **Cardinality statistics** @@ -449,7 +449,7 @@ Additional information: * [TSDB Stats](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /datadog +### /datadog **DataDog URL for Single-node VictoriaMetrics** @@ -471,7 +471,7 @@ http://vminsert:8480/insert/0/datadog
-## /datadog/api/v1/series +### /datadog/api/v1/series **Imports data in DataDog format into VictoriaMetrics** @@ -534,7 +534,7 @@ Additional information: * [How to send data from datadog agent](https://docs.victoriametrics.com/#how-to-send-data-from-datadog-agent) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /federate +### /federate **Returns federated metrics** @@ -562,7 +562,7 @@ Additional information: * [Prometheus-compatible federation data](https://prometheus.io/docs/prometheus/latest/federation/#configuring-federation) * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /graphite/metrics/find +### /graphite/metrics/find **Searches Graphite metrics in VictoriaMetrics** @@ -591,7 +591,7 @@ Additional information: * [How to send Graphite data to VictoriaMetrics](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-graphite-compatible-agents-such-as-statsd) * [URL Format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /influx/write +### /influx/write **Writes data with InfluxDB line protocol to VictoriaMetrics** @@ -618,7 +618,7 @@ Additional information: * [How to send Influx data to VictoriaMetrics](https://docs.victoriametrics.com/#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf) * [URL Format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) -## /internal/resetRollupResultCache +### /internal/resetRollupResultCache **Resets the response cache for previously served queries. It is recommended to invoke after [backfilling](https://docs.victoriametrics.com/#backfilling) procedure.** @@ -641,9 +641,9 @@ curl -Is http://:8481/select/internal/resetRollupResultCache -## TCP and UDP +### TCP and UDP -### How to send data from OpenTSDB-compatible agents to VictoriaMetrics +#### How to send data from OpenTSDB-compatible agents to VictoriaMetrics Turned off by default. Enable OpenTSDB receiver in VictoriaMetrics by setting `-opentsdbListenAddr` command-line flag. *If run from docker, '-opentsdbListenAddr' port should be exposed* @@ -691,7 +691,7 @@ Additional information: * [OpenTSDB http put API](http://opentsdb.net/docs/build/html/api_http/put.html) * [How to send data OpenTSDB data to VictoriaMetrics](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-opentsdb-compatible-agents) -### How to send Graphite data to VictoriaMetrics +#### How to send Graphite data to VictoriaMetrics Enable Graphite receiver in VictoriaMetrics by setting `-graphiteListenAddr` command-line flag. From 5afc6a5765b3fbfed14534c6b69837f0a7fb6f91 Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Tue, 7 Nov 2023 12:23:12 +0100 Subject: [PATCH 09/48] github actions: sync docs use the latest hugo version in CI Signed-off-by: Artem Navoiev --- .github/workflows/sync-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-docs.yml b/.github/workflows/sync-docs.yml index 1e6ca9d4ec..7af350ab97 100644 --- a/.github/workflows/sync-docs.yml +++ b/.github/workflows/sync-docs.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: {} env: PAGEFIND_VERSION: "1.0.3" - HUGO_VERSION: "0.119.0" + HUGO_VERSION: "latest" permissions: contents: read # This is required for actions/checkout and to commit back image update deployments: write From bffd30b57af09ba01a6ea40378fefa3b37468efd Mon Sep 17 00:00:00 2001 From: Roman Khavronenko Date: Wed, 8 Nov 2023 00:53:07 -0600 Subject: [PATCH 10/48] app/vmalert: update remote-write process (#5284) * app/vmalert: update remote-write process * automatically retry remote-write requests on closed connections. The change should reduce the amount of logs produced in environments with short-living connections or environments without support of keep-alive on network balancers. * increment `vmalert_remotewrite_errors_total` metric if all retries to send remote-write request failed. Before, this metric was incremented only if remote-write client's buffer is overloaded. * increment `vmalert_remotewrite_dropped_rows_total` amd `vmalert_remotewrite_dropped_bytes_total` metrics if remote-write client's buffer is overloaded. Before, these metrics were incremented only after unsuccessful HTTP calls. Signed-off-by: hagen1778 * Update docs/CHANGELOG.md --------- Signed-off-by: hagen1778 Co-authored-by: Hui Wang --- app/vmalert/remotewrite/client.go | 21 +++++++++++++++++++-- app/vmalert/rule/group.go | 5 ----- docs/CHANGELOG.md | 3 +++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/vmalert/remotewrite/client.go b/app/vmalert/remotewrite/client.go index 525f6b4592..6c012a350d 100644 --- a/app/vmalert/remotewrite/client.go +++ b/app/vmalert/remotewrite/client.go @@ -3,6 +3,7 @@ package remotewrite import ( "bytes" "context" + "errors" "flag" "fmt" "io" @@ -117,12 +118,19 @@ func NewClient(ctx context.Context, cfg Config) (*Client, error) { // Push adds timeseries into queue for writing into remote storage. // Push returns and error if client is stopped or if queue is full. func (c *Client) Push(s prompbmarshal.TimeSeries) error { + rwTotal.Inc() select { case <-c.doneCh: + rwErrors.Inc() + droppedRows.Add(len(s.Samples)) + droppedBytes.Add(s.Size()) return fmt.Errorf("client is closed") case c.input <- s: return nil default: + rwErrors.Inc() + droppedRows.Add(len(s.Samples)) + droppedBytes.Add(s.Size()) return fmt.Errorf("failed to push timeseries - queue is full (%d entries). "+ "Queue size is controlled by -remoteWrite.maxQueueSize flag", c.maxQueueSize) @@ -181,11 +189,14 @@ func (c *Client) run(ctx context.Context) { } var ( + rwErrors = metrics.NewCounter(`vmalert_remotewrite_errors_total`) + rwTotal = metrics.NewCounter(`vmalert_remotewrite_total`) + sentRows = metrics.NewCounter(`vmalert_remotewrite_sent_rows_total`) sentBytes = metrics.NewCounter(`vmalert_remotewrite_sent_bytes_total`) - sendDuration = metrics.NewFloatCounter(`vmalert_remotewrite_send_duration_seconds_total`) droppedRows = metrics.NewCounter(`vmalert_remotewrite_dropped_rows_total`) droppedBytes = metrics.NewCounter(`vmalert_remotewrite_dropped_bytes_total`) + sendDuration = metrics.NewFloatCounter(`vmalert_remotewrite_send_duration_seconds_total`) bufferFlushDuration = metrics.NewHistogram(`vmalert_remotewrite_flush_duration_seconds`) _ = metrics.NewGauge(`vmalert_remotewrite_concurrency`, func() float64 { @@ -222,6 +233,11 @@ func (c *Client) flush(ctx context.Context, wr *prompbmarshal.WriteRequest) { L: for attempts := 0; ; attempts++ { err := c.send(ctx, b) + if errors.Is(err, io.EOF) { + // Something in the middle between client and destination might be closing + // the connection. So we do a one more attempt in hope request will succeed. + err = c.send(ctx, b) + } if err == nil { sentRows.Add(len(wr.Timeseries)) sentBytes.Add(len(b)) @@ -259,6 +275,7 @@ L: } + rwErrors.Inc() droppedRows.Add(len(wr.Timeseries)) droppedBytes.Add(len(b)) logger.Errorf("attempts to send remote-write request failed - dropping %d time series", @@ -303,7 +320,7 @@ func (c *Client) send(ctx context.Context, data []byte) error { // Prometheus remote Write compatible receivers MUST switch resp.StatusCode / 100 { case 2: - // respond with a HTTP 2xx status code when the write is successful. + // respond with HTTP 2xx status code when write is successful. return nil case 4: if resp.StatusCode != http.StatusTooManyRequests { diff --git a/app/vmalert/rule/group.go b/app/vmalert/rule/group.go index 36fb046a4e..b635c1fa33 100644 --- a/app/vmalert/rule/group.go +++ b/app/vmalert/rule/group.go @@ -663,9 +663,6 @@ var ( execTotal = metrics.NewCounter(`vmalert_execution_total`) execErrors = metrics.NewCounter(`vmalert_execution_errors_total`) - - remoteWriteErrors = metrics.NewCounter(`vmalert_remotewrite_errors_total`) - remoteWriteTotal = metrics.NewCounter(`vmalert_remotewrite_total`) ) func (e *executor) exec(ctx context.Context, r Rule, ts time.Time, resolveDuration time.Duration, limit int) error { @@ -686,9 +683,7 @@ func (e *executor) exec(ctx context.Context, r Rule, ts time.Time, resolveDurati pushToRW := func(tss []prompbmarshal.TimeSeries) error { var lastErr error for _, ts := range tss { - remoteWriteTotal.Inc() if err := e.Rw.Push(ts); err != nil { - remoteWriteErrors.Inc() lastErr = fmt.Errorf("rule %q: remote write failure: %w", r, err) } } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3ad31d19f4..bb02b09683 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -56,6 +56,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): allow specifying full url in notifier static_configs target address, like `http://alertmanager:9093/test/api/v2/alerts`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5184). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): reduce the number of queries for restoring alerts state on start-up. The change should speed up the restore process and reduce pressure on `remoteRead.url`. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5265). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add label `file` pointing to the group's filename to metrics `vmalert_recording_.*` and `vmalert_alerts_.*`. The filename should help identifying alerting rules belonging to specific groups with identical names but different filenames. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5267). +* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): automatically retry remote-write requests on closed connections. The change should reduce the amount of logs produced in environments with short-living connections or environments without support of keep-alive on network balancers. * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): support data ingestion from [NewRelic infrastructure agent](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-newrelic-agent), [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3520) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4712). * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `-remoteWrite.shardByURL.labels` command-line flag, which can be used for specifying a list of labels for sharding outgoing samples among the configured `-remoteWrite.url` destinations if `-remoteWrite.shardByURL` command-line flag is set. See [these docs](https://docs.victoriametrics.com/vmagent.html#sharding-among-remote-storages) and [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4942) for details. * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): do not exit on startup when [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs) refer to non-existing or invalid files with auth configs, since these files may appear / updated later. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4959) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153). @@ -82,6 +83,8 @@ The sandbox cluster installation is running under the constant load generated by * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): fix vmalert web UI when running on 32-bit architectures machine. * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): do not send requests to configured remote systems when `-datasource.*`, `-remoteWrite.*`, `-remoteRead.*` or `-notifier.*` command-line flags refer files with invalid auth configs. Previously such requests were sent without properly set auth headers. Now the requests are sent only after the files are updated with valid auth configs. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly maintain alerts state in [replay mode](https://docs.victoriametrics.com/vmalert.html#rules-backfilling) if alert's `for` param was bigger than replay request range (usually a couple of hours). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5186) for details. +* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): increment `vmalert_remotewrite_errors_total` metric if all retries to send remote-write request failed. Before, this metric was incremented only if remote-write client's buffer is overloaded. +* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): increment `vmalert_remotewrite_dropped_rows_total` and `vmalert_remotewrite_dropped_bytes_total` metrics if remote-write client's buffer is overloaded. Before, these metrics were incremented only after unsuccessful HTTP calls. * BUGFIX: `vmselect`: improve performance and memory usage during query processing on machines with big number of CPU cores. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5087). * BUGFIX: dashboards: fix vminsert/vmstorage/vmselect metrics filtering when dashboard is used to display data from many sub-clusters with unique job names. Before, only one specific job could have been accounted for component-specific panels, instead of all available jobs for the component. * BUGFIX: dashboards/vmalert: apply `desc` sorting in tooltips for vmalert dashboard in order to improve visibility of the outliers on graph. From 746cc93e955de39dba46d624ad53f4bb5e87ec99 Mon Sep 17 00:00:00 2001 From: Github Actions <133988544+victoriametrics-bot@users.noreply.github.com> Date: Wed, 8 Nov 2023 21:59:10 +0800 Subject: [PATCH 11/48] Automatic update Grafana datasource docs from VictoriaMetrics/grafana-datasource@52bdb4a (#5304) --- docs/grafana-datasource.md | 391 +++++++++++++++++++++++++++++++++ docs/provision_datasources.png | Bin 0 -> 536593 bytes 2 files changed, 391 insertions(+) create mode 100644 docs/grafana-datasource.md create mode 100644 docs/provision_datasources.png diff --git a/docs/grafana-datasource.md b/docs/grafana-datasource.md new file mode 100644 index 0000000000..1610b7cedf --- /dev/null +++ b/docs/grafana-datasource.md @@ -0,0 +1,391 @@ + +--- +sort: 38 +weight: 38 +title: Grafana datasource +menu: + docs: + parent: victoriametrics + weight: 38 +aliases: +- /grafana-datasource.html" +--- + +# VictoriaMetrics datasource for Grafana +The [VictoriaMetrics](http://docs.victoriametrics.com/) datasource plugin allows you to query and visualize +data from VictoriaMetrics in Grafana. + +* [Motivation](#motivation) +* [Installation](#installation) +* [How to use WITH templates](#how-to-use-with-templates) +* [How to make new release](#how-to-make-new-release) +* [Frequently Asked Questions](#faq) +* [License](#license) + +## Motivation + +Thanks to VictoriaMetrics compatibility with Prometheus API users can use +[Prometheus datasource](https://docs.victoriametrics.com/#grafana-setup) for Grafana to query data from VictoriaMetrics. +But with time, Prometheus and VictoriaMetrics diverge more and more. After some unexpected changes to Prometheus datasource +we decided to create a datasource plugin specifically for VictoriaMetrics. +The benefits of using VictoriaMetrics plugin are the following: + +* [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) functions support; +* Supports [query tracing](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#query-tracing) in Explore mode or right in panel's expressions; +* Supports [WITH expressions](https://github.com/VictoriaMetrics/grafana-datasource#how-to-use-with-templates); +* Plugin fixes [label names validation](https://github.com/grafana/grafana/issues/42615) issue; +* Integration with [vmui](https://docs.victoriametrics.com/#vmui). + +## Installation + +Installing VictoriaMetrics Grafana datasource [requires](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#allow_loading_unsigned_plugins) +the following changes to Grafana's `grafana.ini` config: +``` ini +[plugins] +allow_loading_unsigned_plugins = victoriametrics-datasource +``` + +See [why VictoriaMetrics datasource is unsigned](#why-victoriaMetrics-datasource-is-unsigned). + +For detailed instructions on how to install the plugin on Grafana Cloud or +locally, please checkout the [Plugin installation docs](https://grafana.com/docs/grafana/latest/plugins/installation/). + +### Grafana Provisioning + +Provision of Grafana plugin requires to create +[datasource config file](http://docs.grafana.org/administration/provisioning/#datasources). + +Example of config file for provisioning VictoriaMetrics datasource is the following: + +```yaml +apiVersion: 1 + +# List of data sources to insert/update depending on what's +# available in the database. +datasources: + # Name of the VictoriaMetrics datasource + # displayed in Grafana panels and queries. + - name: VictoriaMetrics + # Sets the data source type. + type: victoriametrics-datasource + # Sets the access mode, either + # proxy or direct (Server or Browser in the UI). + # Some data sources are incompatible with any setting + # but proxy (Server). + access: proxy + # Sets default URL of the single node version of VictoriaMetrics + url: http://victoriametrics:8428 + # Sets the pre-selected datasource for new panels. + # You can set only one default data source per organization. + isDefault: true + + # Name of the VictoriaMetrics datasource + # displayed in Grafana panels and queries. + - name: VictoriaMetrics - cluster + # Sets the data source type. + type: victoriametrics-datasource + # Sets the access mode, either + # proxy or direct (Server or Browser in the UI). + # Some data sources are incompatible with any setting + # but proxy (Server). + access: proxy + # Sets default URL of the cluster version of VictoriaMetrics + url: http://vmselect:8481/select/0/prometheus + # Sets the pre-selected datasource for new panels. + # You can set only one default data source per organization. + isDefault: false +``` + +Please find the example of provisioning Grafana instance with VictoriaMetrics datasource below: + +1. Create folder `./provisioning/datasource` with datasource example file: + +1. Download the latest release: + + ``` bash + ver=$(curl -s https://api.github.com/repos/VictoriaMetrics/grafana-datasource/releases/latest | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + curl -L https://github.com/VictoriaMetrics/grafana-datasource/releases/download/$ver/victoriametrics-datasource-$ver.tar.gz -o plugin.tar.gz + tar -xf plugin.tar.gz -C ./victoriametrics-datasource + rm plugin.tar.gz + ``` + +1. Define Grafana installation via docker-compose: + + ```yaml + version: '3.0' + services: + grafana: + container_name: 'grafana-datasource' + build: + context: ./.config + args: + grafana_version: ${GRAFANA_VERSION:-9.1.2} + ports: + - 3000:3000/tcp + volumes: + - ./victoriametrics-datasource:/var/lib/grafana/plugins/grafana-datasource + - ./provisioning:/etc/grafana/provisioning + ``` + +1. Run docker-compose file: + +``` +docker-compose -f docker-compose.yaml up +``` + +When Grafana starts successfully datasources should be present on the datasources tab + +

+ Configuration +

+ +### Install in Kubernetes + +#### Grafana helm chart + +Example with Grafana [helm chart](https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md): + +``` yaml +extraInitContainers: + - name: "load-vm-ds-plugin" + image: "curlimages/curl:7.85.0" + command: [ "/bin/sh" ] + workingDir: "/var/lib/grafana" + securityContext: + runAsUser: 472 + runAsNonRoot: true + runAsGroup: 472 + args: + - "-c" + - | + set -ex + mkdir -p /var/lib/grafana/plugins/ + ver=$(curl -s https://api.github.com/repos/VictoriaMetrics/grafana-datasource/releases/latest | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + curl -L https://github.com/VictoriaMetrics/grafana-datasource/releases/download/$ver/victoriametrics-datasource-$ver.tar.gz -o /var/lib/grafana/plugins/plugin.tar.gz + tar -xf /var/lib/grafana/plugins/plugin.tar.gz -C /var/lib/grafana/plugins/ + rm /var/lib/grafana/plugins/plugin.tar.gz + volumeMounts: + - name: storage + mountPath: /var/lib/grafana +``` + +This example uses init container to download and install plugin. To allow Grafana using this container as a sidecar +set the following config: +```yaml +sidecar: + datasources: + initDatasources: true + enabled: true +``` +See more about chart settings [here](https://github.com/grafana/helm-charts/blob/541d97051de87a309362e02d08741ffc868cfcd6/charts/grafana/values.yaml) + +Another option would be to build custom Grafana image with plugin based on same installation instructions. + +#### Grafana operator + +Example with Grafana [operator](https://github.com/grafana-operator/grafana-operator): + +```yaml +apiVersion: grafana.integreatly.org/v1beta1 +kind: Grafana +metadata: + name: grafana-vm +spec: + persistentVolumeClaim: + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Mi + deployment: + spec: + template: + spec: + initContainers: + - name: "load-vm-ds-plugin" + image: "curlimages/curl:7.85.0" + command: [ "/bin/sh" ] + workingDir: "/var/lib/grafana" + securityContext: + runAsUser: 10001 + runAsNonRoot: true + runAsGroup: 10001 + args: + - "-c" + - | + set -ex + mkdir -p /var/lib/grafana/plugins/ + ver=$(curl -s https://api.github.com/repos/VictoriaMetrics/grafana-datasource/releases/latest | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + curl -L https://github.com/VictoriaMetrics/grafana-datasource/releases/download/$ver/victoriametrics-datasource-$ver.tar.gz -o /var/lib/grafana/plugins/plugin.tar.gz + tar -xf /var/lib/grafana/plugins/plugin.tar.gz -C /var/lib/grafana/plugins/ + rm /var/lib/grafana/plugins/plugin.tar.gz + volumeMounts: + - name: grafana-data + mountPath: /var/lib/grafana + config: + plugins: + allow_loading_unsigned_plugins: victoriametrics-datasource +``` + +See [Grafana operator reference](https://grafana-operator.github.io/grafana-operator/docs/grafana/) to find more about +Grafana operator. +This example uses init container to download and install plugin. + +### Dev release installation + + +1. To download plugin build and move contents into Grafana plugins directory: + + ``` bash + ver=$(curl -s https://api.github.com/repos/VictoriaMetrics/grafana-datasource/releases/latest | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + curl -L https://github.com/VictoriaMetrics/grafana-datasource/releases/download/$ver/victoriametrics-datasource-$ver.tar.gz -o /var/lib/grafana/plugins/plugin.tar.gz + tar -xf /var/lib/grafana/plugins/plugin.tar.gz -C /var/lib/grafana/plugins/ + rm /var/lib/grafana/plugins/plugin.tar.gz + ``` + +1. Restart Grafana + + +## Getting started development + +### 1. Configure Grafana +Installing dev version of Grafana plugin requires to change `grafana.ini` config to allow loading unsigned plugins: +``` ini +# Directory where Grafana will automatically scan and look for plugins +plugins = {{path to directory with plugin}} +``` +``` ini +[plugins] +allow_loading_unsigned_plugins = victoriametrics-datasource +``` +### 2. Run the plugin +In the project directory, you can run: +``` +# install dependencies +yarn install + +# run the app in the development mode +yarn dev + +# build the plugin for production to the `dist` folder and zip build +yarn build:zip +``` + +### 3. How to build backend plugin + +From the root folder of the project run the following command: +``` +make victoriametrics-backend-plugin-build +``` +This command will build executable multi-platform files to the `dist` folder for the following platforms: +* linux/amd64 +* linux/arm64 +* linux/arm +* linux/386 +* amd64 +* arm64 +* windows + +### 4.How to build frontend plugin +From the root folder of the project run the following command: +``` +make victorimetrics-frontend-plugin-build +``` +This command will build all frontend app into `dist` folder. + +### 5. How to build frontend and backend parts of the plugin: +When frontend and backend parts of the plugin is required, run the following command from +the root folder of the project: +``` +make victoriametrics-datasource-plugin-build +``` +This command will build frontend part and backend part or the plugin and locate both +parts into `dist` folder. + +## How to use WITH templates + +The `WITH` templates feature simplifies the construction and management of complex queries. +You can try this feature in the [WITH templates playground](https://play.victoriametrics.com/select/accounting/1/6a716b0f-38bc-4856-90ce-448fd713e3fe/expand-with-exprs). + +The "WITH templates" section allows you to create expressions with templates that can be used in dashboards. + +WITH expressions are stored in the datasource object. If the dashboard gets exported, the associated WITH templates will not be included in the resulting JSON (due to technical limitations) and need to be migrated separately. + +### Defining WITH Expressions + +1. Navigate to the dashboard where you want to add a template.
+ *Note: templates are available within the dashboard scope.* +1. Click the `WITH templates` button. +1. Enter the expression in the input field. Once done, press the `Save` button to apply the changes. For example: + ``` + commonFilters = {instance=~"$node:$port",job=~"$job"}, + + # `cpuCount` is the number of CPUs on the node + cpuCount = count(count(node_cpu_seconds_total{commonFilters}) by (cpu)), + + # `cpuIdle` is the sum of idle CPU cores + cpuIdle = sum(rate(node_cpu_seconds_total{mode='idle',commonFilters}[5m])) + ``` + + You can specify a comment before the variable and use markdown in it. The comment will be displayed as a hint during auto-completion. The comment can span multiple lines. + +### Using WITH Expressions + +After saving the template, you can enter it into the query editor field: +``` +((cpuCount - cpuIdle) * 100) / cpuCount +``` + +Thus, the entire query will look as follows: + +``` +WITH ( + commonFilters = {instance=~"$node:$port",job=~"$job"}, + cpuCount = count(count(node_cpu_seconds_total{commonFilters}) by (cpu)), + cpuIdle = sum(rate(node_cpu_seconds_total{mode='idle',commonFilters}[5m])) +) +((cpuCount - cpuIdle) * 100) / cpuCount +``` +To view the raw query in the interface, enable the `Raw` toggle. + +## How to make new release + +1. Make sure there are no open security issues. +1. Create a release tag: + * `git tag -s v1.xx.y` in `master` branch +1. Run `TAG=v1.xx.y make build-release` to build and package binaries in `*.tar.gz` release archives. +1. Run `git push origin v1.xx.y` to push the tag created `v1.xx.y` at step 2 to public GitHub repository +1. Go to and verify that draft release with the name `TAG` has been created + and this release contains all the needed binaries and checksums. +1. Remove the `draft` checkbox for the `TAG` release and manually publish it. + + +## FAQ + +### Why VictoriaMetrics datasource is unsigned? + +Based on our previous experience of [developing Grafana plugins](https://grafana.com/grafana/plugins/vertamedia-clickhouse-datasource/) +the signing procedure was a formal act. But when we tried [to sign the plugin](https://grafana.com/docs/grafana/latest/developers/plugins/publish-a-plugin/sign-a-plugin/) +we were told by GrafanaLabs representative the plugin falls into a Commercial signature level. It matters not +if plugin or VictoriaMetrics itself are opensource. The announced cost of Commercial signature level was much higher +than expected, so we interrupted the procedure. + +### How to convert dashboard from Prometheus to VictoriaMetrics datasource? + +Make sure that VictoriaMetrics datasource plugin is [installed](#installation), and a new datasource is created from the plugin. + +Each panel in Grafana dashboard has a datasource dropdown when in Edit mode. Just choose the VictoriaMetrics datasource +instead of Prometheus datasource in dropdown. + +If datasource is configured via Grafana variable, then change variable to VictoriaMetrics datasource type. + +### Why VictoriaMetrics datasource doesn't support alerting? + +Grafana doesn't allow forwarding Alert requests to alerting API /api/v1/rules for plugins which are not of Prometheus +or Loki type. See more details [here](https://github.com/VictoriaMetrics/grafana-datasource/issues/59#issuecomment-1541456768). + + +## License + +This project is licensed under the [AGPL-3.0-only](https://github.com/VictoriaMetrics/grafana-datasource/blob/main/LICENSE). diff --git a/docs/provision_datasources.png b/docs/provision_datasources.png new file mode 100644 index 0000000000000000000000000000000000000000..7c633f91af95f8a166f957974840df59ae6cba52 GIT binary patch literal 536593 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�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

y_y^&Raxas)Vhd@Qk_)abAjqkf* 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

E@(3NRGo3`)KPA*G} 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 literal 0 HcmV?d00001 From 2b15f2fc8cb4d424649f62266049b56956889a04 Mon Sep 17 00:00:00 2001 From: Github Actions <133988544+victoriametrics-bot@users.noreply.github.com> Date: Wed, 8 Nov 2023 22:19:12 +0800 Subject: [PATCH 12/48] Automatic update Grafana datasource docs from VictoriaMetrics/grafana-datasource@cc18249 (#5305) --- docs/grafana-datasource.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/grafana-datasource.md b/docs/grafana-datasource.md index 1610b7cedf..151ba964e2 100644 --- a/docs/grafana-datasource.md +++ b/docs/grafana-datasource.md @@ -1,4 +1,3 @@ - --- sort: 38 weight: 38 From 930d26b2ffe3a566329b6362ffd66f92857a22e2 Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Wed, 8 Nov 2023 18:12:29 +0100 Subject: [PATCH 13/48] docs: vmagent change the codeblock languages Signed-off-by: Artem Navoiev --- docs/vmagent.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/vmagent.md b/docs/vmagent.md index d6ae0b1d7b..3a71b0695b 100644 --- a/docs/vmagent.md +++ b/docs/vmagent.md @@ -71,7 +71,7 @@ and sending the data to the Prometheus-compatible remote storage: Example command for writing the data received via [supported push-based protocols](#how-to-push-data-to-vmagent) to [single-node VictoriaMetrics](https://docs.victoriametrics.com/) located at `victoria-metrics-host:8428`: -```console +```bash /path/to/vmagent -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -80,7 +80,7 @@ the data to [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-V Example command for scraping Prometheus targets and writing the data to single-node VictoriaMetrics: -```console +```bash /path/to/vmagent -promscrape.config=/path/to/prometheus.yml -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -121,7 +121,7 @@ additionally to pull-based Prometheus-compatible targets' scraping: * Sending `SIGHUP` signal to `vmagent` process: - ```console + ```bash kill -SIGHUP `pidof vmagent` ``` @@ -336,7 +336,7 @@ in the `scrape_config_files` section of `-promscrape.config` file. For example, loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: -```yml +```yaml scrape_config_files: - configs/*.yml - single_scrape_config.yml @@ -346,7 +346,7 @@ scrape_config_files: Every referred file can contain arbitrary number of [supported scrape configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs). There is no need in specifying top-level `scrape_configs` section in these files. For example: -```yml +```yaml - job_name: foo static_configs: - targets: ["vmagent:8429"] @@ -386,7 +386,7 @@ Extra labels can be added to metrics collected by `vmagent` via the following me For example, the following command starts `vmagent`, which adds `{datacenter="foobar"}` label to all the metrics pushed to all the configured remote storage systems (all the `-remoteWrite.url` flag values): - ``` + ```bash /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` @@ -751,7 +751,7 @@ stream parsing mode can be explicitly enabled in the following places: Examples: -```yml +```yaml scrape_configs: - job_name: 'big-federate' stream_parse: true @@ -778,7 +778,7 @@ Each `vmagent` instance in the cluster must use identical `-promscrape.config` f in the range `0 ... N-1`, where `N` is the number of `vmagent` instances in the cluster specified via `-promscrape.cluster.membersCount`. For example, the following commands spread scrape targets among a cluster of two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... ``` @@ -790,7 +790,7 @@ By default, each scrape target is scraped only by a single `vmagent` instance in then `-promscrape.cluster.replicationFactor` command-line flag must be set to the desired number of replicas. For example, the following commands start a cluster of three `vmagent` instances, where each target is scraped by two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=2 -promscrape.config=/path/to/config.yml ... @@ -804,7 +804,7 @@ The `-promscrape.cluster.memberLabel` command-line flag allows specifying a name The value of the `member num` label is set to `-promscrape.cluster.memberNum`. For example, the following config instructs adding `vmagent_instance="0"` label to all the metrics scraped by the given `vmagent` instance: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.cluster.memberLabel=vmagent_instance ``` @@ -831,7 +831,7 @@ See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2679) `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs target scraping via https proxy at `https://proxy-addr:1234`: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -848,7 +848,7 @@ Proxy can be configured with the following optional settings: For example: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -998,7 +998,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at the beginning of some interval, then `scrape_align_interval` option must be used. For example, the following config aligns hourly scrapes to the beginning of hour: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1h @@ -1008,7 +1008,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at specific offset, then `scrape_offset` option must be used. For example, the following config instructs `vmagent` to scrape the target at 10 seconds of every minute: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1m @@ -1021,14 +1021,14 @@ If you have suggestions for improvements or have found a bug - please open an is The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: - ```yml + ```yaml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: - ```yml + ```yaml - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true @@ -1072,7 +1072,7 @@ For example, `-kafka.consumer.topic.brokers=host1:9092;host2:9092`. The following command starts `vmagent`, which reads metrics in InfluxDB line protocol format from Kafka broker at `localhost:9092` from the topic `metrics-by-telegraf` and sends them to remote storage at `http://localhost:8428/api/v1/write`: -```console +```bash ./bin/vmagent -remoteWrite.url=http://localhost:8428/api/v1/write \ -kafka.consumer.topic.brokers=localhost:9092 \ -kafka.consumer.topic.format=influx \ @@ -1095,7 +1095,7 @@ These command-line flags are available only in [enterprise](https://docs.victori which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/latest) page (see `vmutils-...-enterprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. -``` +```text -kafka.consumer.topic array Kafka topic names for data consumption. Supports an array of values separated by comma or specified via multiple flags. @@ -1140,13 +1140,13 @@ Two types of auth are supported: * sasl with username and password: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SASL_SSL&sasl.mechanisms=PLAIN -remoteWrite.basicAuth.username=user -remoteWrite.basicAuth.password=password ``` * tls certificates: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` @@ -1177,7 +1177,7 @@ The `` may be manually set via `PKG_TAG=foobar make package-vmagent`. The base docker image is [alpine](https://hub.docker.com/_/alpine) but it is possible to use any other base image by setting it via `` environment variable. For example, the following command builds the image on top of [scratch](https://hub.docker.com/_/scratch) image: -```console +```bash ROOT_IMAGE=scratch make package-vmagent ``` @@ -1205,7 +1205,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b

-```console +```bash curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof ``` @@ -1215,7 +1215,7 @@ curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof
-```console +```bash curl http://0.0.0.0:8429/debug/pprof/profile > cpu.pprof ``` @@ -1231,7 +1231,7 @@ It is safe sharing the collected profiles from security point of view, since the `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their descriptions and default values: -``` +```text ./vmagent -help vmagent collects metrics data via popular data ingestion protocols and routes them to VictoriaMetrics. From 73a18621827bfd7ae46199b25fe111f0531a09e7 Mon Sep 17 00:00:00 2001 From: Zakhar Bessarab Date: Wed, 8 Nov 2023 21:51:14 +0400 Subject: [PATCH 14/48] docs/changelog: document vmbackupmanager bugfix (#5303) Signed-off-by: Zakhar Bessarab --- docs/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index bb02b09683..4aa1b91070 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -104,6 +104,7 @@ The sandbox cluster installation is running under the constant load generated by * BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): show browser authorization window for unauthorized requests to unsupported paths if the `unauthorized_user` section is specified. This allows properly authorizing the user. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5236) for details. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix the `Disable cache` toggle at `JSON` and `Table` views. Previously response caching was always enabled and couldn't be disabled at these views. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): correctly display query errors on [Explore Prometheus Metrics](https://docs.victoriametrics.com/#metrics-explorer) page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5202) for details. +* BUGFIX: [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html): correctly print error in logs when copying backup fails. Previously, error was displayed in metrics but was missing in logs. ## [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) From 2474281f1b19b6dac68f796fb7b81153c90a9758 Mon Sep 17 00:00:00 2001 From: PhracturedBlue Date: Thu, 9 Nov 2023 00:50:21 -0800 Subject: [PATCH 15/48] Support building images via podman (#4978) --- README.md | 12 ++++++++++++ deployment/docker/Makefile | 16 +++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 175fff5424..e4e99ae5b6 100644 --- a/README.md +++ b/README.md @@ -1126,6 +1126,18 @@ For example, the following command builds the image on top of [scratch](https:// ROOT_IMAGE=scratch make package-victoria-metrics ``` +#### Building VictoriaMetrics with Podman + +VictoriaMetrics can be built with Podman in either rootful or rootless mode. + +When building via rootlful Podman, simply add `DOCKER=podman` to the relevant `make` commandline. To build +via rootless Podman, add `DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` to the `make` +commandline. + +For example: `make victoria-metrics-pure DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` + +Note that `production` builds are not supported via Podman becuase Podman does not support `buildx`. + ## Start with docker-compose [Docker-compose](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/docker-compose.yml) diff --git a/deployment/docker/Makefile b/deployment/docker/Makefile index 8b79334ae9..c7994bce97 100644 --- a/deployment/docker/Makefile +++ b/deployment/docker/Makefile @@ -8,9 +8,11 @@ CERTS_IMAGE := alpine:3.18.4 GO_BUILDER_IMAGE := golang:1.21.3-alpine BUILDER_IMAGE := local/builder:2.0.0-$(shell echo $(GO_BUILDER_IMAGE) | tr :/ __)-1 BASE_IMAGE := local/base:1.1.4-$(shell echo $(ROOT_IMAGE) | tr :/ __)-$(shell echo $(CERTS_IMAGE) | tr :/ __) -DOCKER_BUILD ?= docker build -DOCKER_COMPOSE ?= docker compose -DOCKER_IMAGE_LS ?= docker image ls --format '{{.Repository}}:{{.Tag}}' +DOCKER ?= docker +DOCKER_RUN ?= $(DOCKER) run +DOCKER_BUILD ?= $(DOCKER) build +DOCKER_COMPOSE ?= $(DOCKER) compose +DOCKER_IMAGE_LS ?= $(DOCKER) image ls --format '{{.Repository}}:{{.Tag}}' package-base: ($(DOCKER_IMAGE_LS) | grep -q '$(BASE_IMAGE)$$') \ @@ -29,7 +31,7 @@ package-builder: app-via-docker: package-builder mkdir -p gocache-for-docker - docker run --rm \ + $(DOCKER_RUN) --rm \ --user $(shell id -u):$(shell id -g) \ --mount type=bind,src="$(shell pwd)",dst=/VictoriaMetrics \ -w /VictoriaMetrics \ @@ -44,7 +46,7 @@ app-via-docker: package-builder app-via-docker-windows: package-builder mkdir -p gocache-for-docker - docker run --rm \ + $(DOCKER_RUN) --rm \ --user $(shell id -u):$(shell id -g) \ --mount type=bind,src="$(shell pwd)",dst=/VictoriaMetrics \ -w /VictoriaMetrics \ @@ -72,7 +74,7 @@ publish-via-docker: \ app-via-docker-linux-arm64 \ app-via-docker-linux-ppc64le \ app-via-docker-linux-386 - docker buildx build \ + $(DOCKER) buildx build \ --platform=linux/amd64,linux/arm,linux/arm64,linux/ppc64le,linux/386 \ --build-arg certs_image=$(CERTS_IMAGE) \ --build-arg root_image=$(ROOT_IMAGE) \ @@ -86,7 +88,7 @@ publish-via-docker: \ bin run-via-docker: package-via-docker - docker run -it --rm \ + $(DOCKER_RUN) -it --rm \ --user $(shell id -u):$(shell id -g) \ --net host \ $(DOCKER_OPTS) \ From d407d13e7b45e18a248710f844121d279008a365 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Thu, 2 Nov 2023 21:37:49 +0100 Subject: [PATCH 16/48] Makefile: update golangci-lint version from v1.54.2 to v1.55.1 See https://github.com/golangci/golangci-lint/releases/tag/v1.55.1 --- Makefile | 2 +- lib/snapshot/snapshot.go | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index af37bfa551..8d7b9d609f 100644 --- a/Makefile +++ b/Makefile @@ -486,7 +486,7 @@ golangci-lint: install-golangci-lint golangci-lint run install-golangci-lint: - which golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.54.2 + which golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.55.1 govulncheck: install-govulncheck govulncheck ./... diff --git a/lib/snapshot/snapshot.go b/lib/snapshot/snapshot.go index a3b321224a..9af1997cac 100644 --- a/lib/snapshot/snapshot.go +++ b/lib/snapshot/snapshot.go @@ -51,11 +51,11 @@ func Create(createSnapshotURL string) (string, error) { if snap.Status == "ok" { logger.Infof("Snapshot %s created", snap.Snapshot) return snap.Snapshot, nil - } else if snap.Status == "error" { - return "", errors.New(snap.Msg) - } else { - return "", fmt.Errorf("Unkown status: %v", snap.Status) } + if snap.Status == "error" { + return "", errors.New(snap.Msg) + } + return "", fmt.Errorf("Unkown status: %v", snap.Status) } // Delete deletes a snapshot via the provided api endpoint @@ -89,11 +89,11 @@ func Delete(deleteSnapshotURL string, snapshotName string) error { if snap.Status == "ok" { logger.Infof("Snapshot %s deleted", snapshotName) return nil - } else if snap.Status == "error" { - return errors.New(snap.Msg) - } else { - return fmt.Errorf("Unkown status: %v", snap.Status) } + if snap.Status == "error" { + return errors.New(snap.Msg) + } + return fmt.Errorf("Unkown status: %v", snap.Status) } // Validate validates the snapshotName From a9a26c20b5da45f687da93582c7b9a3b032c40a1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 10 Nov 2023 20:58:32 +0100 Subject: [PATCH 17/48] docs/Single-server-VictoriaMetrics.md: make `High availability` section more clear --- README.md | 55 +++++++++++----------- docs/README.md | 67 ++++++++++++++++----------- docs/Single-server-VictoriaMetrics.md | 67 ++++++++++++++++----------- docs/vmagent.md | 48 +++++++++---------- 4 files changed, 132 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index e4e99ae5b6..c6b591e718 100644 --- a/README.md +++ b/README.md @@ -1695,43 +1695,44 @@ See also [cardinality limiter](#cardinality-limiter) and [capacity planning docs ## High availability -* Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). -* Pass addresses of these instances to [vmagent](https://docs.victoriametrics.com/vmagent.html) via `-remoteWrite.url` command-line flag: +The general approach for achieving high availability is the following: + +- to run two identically configured VictoriaMetrics instances in distinct datacenters (availability zones) +- to store the collected data simultaneously into these instances via [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus +- to query the first VictoriaMetrics instance and to fail over to the second instance when the first instance becomes temporarily unavailable. + +Such a setup guarantees that the collected data isn't lost when one of VictoriaMetrics instance becomes unavailable. +The collected data continues to be written to the available VictoriaMetrics instance, so it should be available for querying. +Both [vmagent](https://docs.victoriametrics.com/vmagent.html) and Prometheus buffer the collected data locally if they cannot send it +to the configured remote storage. So the collected data will be written to the temporarily unavailable VictoriaMetrics instance +after it becomes available. + +If you use [vmagent](https://docs.victoriametrics.com/vmagent.html) for storing the data into VictoriaMetrics, +then it can be configured with multiple `-remoteWrite.url` command-line flags, where every flag points to the VictoriaMetrics +instance in a particular availability zone, in order to replicate the collected data to all the VictoriaMetrics instances. +For example, the following command instructs `vmagent` to replicate data to `vm-az1` and `vm-az2` instances of VictoriaMetrics: ```console -/path/to/vmagent -remoteWrite.url=http://:8428/api/v1/write -remoteWrite.url=http://:8428/api/v1/write +/path/to/vmagent \ + -remoteWrite.url=http://:8428/api/v1/write \ + -remoteWrite.url=http://:8428/api/v1/write ``` -Alternatively these addresses may be passed to `remote_write` section in Prometheus config: +If you use Prometheus for collecting and writing the data to VictoriaMetrics, +then the following [`remote_write`](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write) section +in Prometheus config can be used for replicating the collected data to `vm-az1` and `vm-az2` VictoriaMetrics instances: ```yml remote_write: - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 - # ... - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 + - url: http://:8428/api/v1/write + - url: http://:8428/api/v1/write ``` -* Apply the updated config: +It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups, +since it uses lower amounts of RAM, CPU and network bandwidth than Prometheus. -```console -kill -HUP `pidof prometheus` -``` - -It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups. - -* Now Prometheus should write data into all the configured `remote_write` urls in parallel. -* Set up [Promxy](https://github.com/jacksontj/promxy) in front of all the VictoriaMetrics replicas. -* Set up Prometheus datasource in Grafana that points to Promxy. - -If you have Prometheus HA pairs with replicas `r1` and `r2` in each pair, then configure each `r1` -to write data to `victoriametrics-addr-1`, while each `r2` should write data to `victoriametrics-addr-2`. - -Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances -with the enabled de-duplication. See [this section](#deduplication) for details. +If you use identically configured [vmagent](https://docs.victoriametrics.com/vmagent.html) instances for collecting the same data +and sending it to VictoriaMetrics, then do not forget enabling [deduplication](#deduplication) at VictoriaMetrics side. ## Deduplication diff --git a/docs/README.md b/docs/README.md index 108e9678c2..9fb8b2d6dc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1129,6 +1129,18 @@ For example, the following command builds the image on top of [scratch](https:// ROOT_IMAGE=scratch make package-victoria-metrics ``` +#### Building VictoriaMetrics with Podman + +VictoriaMetrics can be built with Podman in either rootful or rootless mode. + +When building via rootlful Podman, simply add `DOCKER=podman` to the relevant `make` commandline. To build +via rootless Podman, add `DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` to the `make` +commandline. + +For example: `make victoria-metrics-pure DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` + +Note that `production` builds are not supported via Podman becuase Podman does not support `buildx`. + ## Start with docker-compose [Docker-compose](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/docker-compose.yml) @@ -1686,43 +1698,44 @@ See also [cardinality limiter](#cardinality-limiter) and [capacity planning docs ## High availability -* Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). -* Pass addresses of these instances to [vmagent](https://docs.victoriametrics.com/vmagent.html) via `-remoteWrite.url` command-line flag: +The general approach for achieving high availability is the following: + +- to run two identically configured VictoriaMetrics instances in distinct datacenters (availability zones) +- to store the collected data simultaneously into these instances via [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus +- to query the first VictoriaMetrics instance and to fail over to the second instance when the first instance becomes temporarily unavailable. + +Such a setup guarantees that the collected data isn't lost when one of VictoriaMetrics instance becomes unavailable. +The collected data continues to be written to the available VictoriaMetrics instance, so it should be available for querying. +Both [vmagent](https://docs.victoriametrics.com/vmagent.html) and Prometheus buffer the collected data locally if they cannot send it +to the configured remote storage. So the collected data will be written to the temporarily unavailable VictoriaMetrics instance +after it becomes available. + +If you use [vmagent](https://docs.victoriametrics.com/vmagent.html) for storing the data into VictoriaMetrics, +then it can be configured with multiple `-remoteWrite.url` command-line flags, where every flag points to the VictoriaMetrics +instance in a particular availability zone, in order to replicate the collected data to all the VictoriaMetrics instances. +For example, the following command instructs `vmagent` to replicate data to `vm-az1` and `vm-az2` instances of VictoriaMetrics: ```console -/path/to/vmagent -remoteWrite.url=http://:8428/api/v1/write -remoteWrite.url=http://:8428/api/v1/write +/path/to/vmagent \ + -remoteWrite.url=http://:8428/api/v1/write \ + -remoteWrite.url=http://:8428/api/v1/write ``` -Alternatively these addresses may be passed to `remote_write` section in Prometheus config: +If you use Prometheus for collecting and writing the data to VictoriaMetrics, +then the following [`remote_write`](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write) section +in Prometheus config can be used for replicating the collected data to `vm-az1` and `vm-az2` VictoriaMetrics instances: ```yml remote_write: - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 - # ... - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 + - url: http://:8428/api/v1/write + - url: http://:8428/api/v1/write ``` -* Apply the updated config: +It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups, +since it uses lower amounts of RAM, CPU and network bandwidth than Prometheus. -```console -kill -HUP `pidof prometheus` -``` - -It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups. - -* Now Prometheus should write data into all the configured `remote_write` urls in parallel. -* Set up [Promxy](https://github.com/jacksontj/promxy) in front of all the VictoriaMetrics replicas. -* Set up Prometheus datasource in Grafana that points to Promxy. - -If you have Prometheus HA pairs with replicas `r1` and `r2` in each pair, then configure each `r1` -to write data to `victoriametrics-addr-1`, while each `r2` should write data to `victoriametrics-addr-2`. - -Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances -with the enabled de-duplication. See [this section](#deduplication) for details. +If you use identically configured [vmagent](https://docs.victoriametrics.com/vmagent.html) instances for collecting the same data +and sending it to VictoriaMetrics, then do not forget enabling [deduplication](#deduplication) at VictoriaMetrics side. ## Deduplication diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index 6c8b4e6b60..a29541ebbe 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -1137,6 +1137,18 @@ For example, the following command builds the image on top of [scratch](https:// ROOT_IMAGE=scratch make package-victoria-metrics ``` +#### Building VictoriaMetrics with Podman + +VictoriaMetrics can be built with Podman in either rootful or rootless mode. + +When building via rootlful Podman, simply add `DOCKER=podman` to the relevant `make` commandline. To build +via rootless Podman, add `DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` to the `make` +commandline. + +For example: `make victoria-metrics-pure DOCKER=podman DOCKER_RUN="podman run --userns=keep-id"` + +Note that `production` builds are not supported via Podman becuase Podman does not support `buildx`. + ## Start with docker-compose [Docker-compose](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/docker-compose.yml) @@ -1694,43 +1706,44 @@ See also [cardinality limiter](#cardinality-limiter) and [capacity planning docs ## High availability -* Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). -* Pass addresses of these instances to [vmagent](https://docs.victoriametrics.com/vmagent.html) via `-remoteWrite.url` command-line flag: +The general approach for achieving high availability is the following: + +- to run two identically configured VictoriaMetrics instances in distinct datacenters (availability zones) +- to store the collected data simultaneously into these instances via [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus +- to query the first VictoriaMetrics instance and to fail over to the second instance when the first instance becomes temporarily unavailable. + +Such a setup guarantees that the collected data isn't lost when one of VictoriaMetrics instance becomes unavailable. +The collected data continues to be written to the available VictoriaMetrics instance, so it should be available for querying. +Both [vmagent](https://docs.victoriametrics.com/vmagent.html) and Prometheus buffer the collected data locally if they cannot send it +to the configured remote storage. So the collected data will be written to the temporarily unavailable VictoriaMetrics instance +after it becomes available. + +If you use [vmagent](https://docs.victoriametrics.com/vmagent.html) for storing the data into VictoriaMetrics, +then it can be configured with multiple `-remoteWrite.url` command-line flags, where every flag points to the VictoriaMetrics +instance in a particular availability zone, in order to replicate the collected data to all the VictoriaMetrics instances. +For example, the following command instructs `vmagent` to replicate data to `vm-az1` and `vm-az2` instances of VictoriaMetrics: ```console -/path/to/vmagent -remoteWrite.url=http://:8428/api/v1/write -remoteWrite.url=http://:8428/api/v1/write +/path/to/vmagent \ + -remoteWrite.url=http://:8428/api/v1/write \ + -remoteWrite.url=http://:8428/api/v1/write ``` -Alternatively these addresses may be passed to `remote_write` section in Prometheus config: +If you use Prometheus for collecting and writing the data to VictoriaMetrics, +then the following [`remote_write`](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write) section +in Prometheus config can be used for replicating the collected data to `vm-az1` and `vm-az2` VictoriaMetrics instances: ```yml remote_write: - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 - # ... - - url: http://:8428/api/v1/write - queue_config: - max_samples_per_send: 10000 + - url: http://:8428/api/v1/write + - url: http://:8428/api/v1/write ``` -* Apply the updated config: +It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups, +since it uses lower amounts of RAM, CPU and network bandwidth than Prometheus. -```console -kill -HUP `pidof prometheus` -``` - -It is recommended to use [vmagent](https://docs.victoriametrics.com/vmagent.html) instead of Prometheus for highly loaded setups. - -* Now Prometheus should write data into all the configured `remote_write` urls in parallel. -* Set up [Promxy](https://github.com/jacksontj/promxy) in front of all the VictoriaMetrics replicas. -* Set up Prometheus datasource in Grafana that points to Promxy. - -If you have Prometheus HA pairs with replicas `r1` and `r2` in each pair, then configure each `r1` -to write data to `victoriametrics-addr-1`, while each `r2` should write data to `victoriametrics-addr-2`. - -Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances -with the enabled de-duplication. See [this section](#deduplication) for details. +If you use identically configured [vmagent](https://docs.victoriametrics.com/vmagent.html) instances for collecting the same data +and sending it to VictoriaMetrics, then do not forget enabling [deduplication](#deduplication) at VictoriaMetrics side. ## Deduplication diff --git a/docs/vmagent.md b/docs/vmagent.md index 3a71b0695b..d6ae0b1d7b 100644 --- a/docs/vmagent.md +++ b/docs/vmagent.md @@ -71,7 +71,7 @@ and sending the data to the Prometheus-compatible remote storage: Example command for writing the data received via [supported push-based protocols](#how-to-push-data-to-vmagent) to [single-node VictoriaMetrics](https://docs.victoriametrics.com/) located at `victoria-metrics-host:8428`: -```bash +```console /path/to/vmagent -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -80,7 +80,7 @@ the data to [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-V Example command for scraping Prometheus targets and writing the data to single-node VictoriaMetrics: -```bash +```console /path/to/vmagent -promscrape.config=/path/to/prometheus.yml -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -121,7 +121,7 @@ additionally to pull-based Prometheus-compatible targets' scraping: * Sending `SIGHUP` signal to `vmagent` process: - ```bash + ```console kill -SIGHUP `pidof vmagent` ``` @@ -336,7 +336,7 @@ in the `scrape_config_files` section of `-promscrape.config` file. For example, loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: -```yaml +```yml scrape_config_files: - configs/*.yml - single_scrape_config.yml @@ -346,7 +346,7 @@ scrape_config_files: Every referred file can contain arbitrary number of [supported scrape configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs). There is no need in specifying top-level `scrape_configs` section in these files. For example: -```yaml +```yml - job_name: foo static_configs: - targets: ["vmagent:8429"] @@ -386,7 +386,7 @@ Extra labels can be added to metrics collected by `vmagent` via the following me For example, the following command starts `vmagent`, which adds `{datacenter="foobar"}` label to all the metrics pushed to all the configured remote storage systems (all the `-remoteWrite.url` flag values): - ```bash + ``` /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` @@ -751,7 +751,7 @@ stream parsing mode can be explicitly enabled in the following places: Examples: -```yaml +```yml scrape_configs: - job_name: 'big-federate' stream_parse: true @@ -778,7 +778,7 @@ Each `vmagent` instance in the cluster must use identical `-promscrape.config` f in the range `0 ... N-1`, where `N` is the number of `vmagent` instances in the cluster specified via `-promscrape.cluster.membersCount`. For example, the following commands spread scrape targets among a cluster of two `vmagent` instances: -```text +``` /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... ``` @@ -790,7 +790,7 @@ By default, each scrape target is scraped only by a single `vmagent` instance in then `-promscrape.cluster.replicationFactor` command-line flag must be set to the desired number of replicas. For example, the following commands start a cluster of three `vmagent` instances, where each target is scraped by two `vmagent` instances: -```text +``` /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=2 -promscrape.config=/path/to/config.yml ... @@ -804,7 +804,7 @@ The `-promscrape.cluster.memberLabel` command-line flag allows specifying a name The value of the `member num` label is set to `-promscrape.cluster.memberNum`. For example, the following config instructs adding `vmagent_instance="0"` label to all the metrics scraped by the given `vmagent` instance: -```text +``` /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.cluster.memberLabel=vmagent_instance ``` @@ -831,7 +831,7 @@ See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2679) `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs target scraping via https proxy at `https://proxy-addr:1234`: -```yaml +```yml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -848,7 +848,7 @@ Proxy can be configured with the following optional settings: For example: -```yaml +```yml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -998,7 +998,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at the beginning of some interval, then `scrape_align_interval` option must be used. For example, the following config aligns hourly scrapes to the beginning of hour: - ```yaml + ```yml scrape_configs: - job_name: foo scrape_interval: 1h @@ -1008,7 +1008,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at specific offset, then `scrape_offset` option must be used. For example, the following config instructs `vmagent` to scrape the target at 10 seconds of every minute: - ```yaml + ```yml scrape_configs: - job_name: foo scrape_interval: 1m @@ -1021,14 +1021,14 @@ If you have suggestions for improvements or have found a bug - please open an is The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: - ```yaml + ```yml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: - ```yaml + ```yml - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true @@ -1072,7 +1072,7 @@ For example, `-kafka.consumer.topic.brokers=host1:9092;host2:9092`. The following command starts `vmagent`, which reads metrics in InfluxDB line protocol format from Kafka broker at `localhost:9092` from the topic `metrics-by-telegraf` and sends them to remote storage at `http://localhost:8428/api/v1/write`: -```bash +```console ./bin/vmagent -remoteWrite.url=http://localhost:8428/api/v1/write \ -kafka.consumer.topic.brokers=localhost:9092 \ -kafka.consumer.topic.format=influx \ @@ -1095,7 +1095,7 @@ These command-line flags are available only in [enterprise](https://docs.victori which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/latest) page (see `vmutils-...-enterprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. -```text +``` -kafka.consumer.topic array Kafka topic names for data consumption. Supports an array of values separated by comma or specified via multiple flags. @@ -1140,13 +1140,13 @@ Two types of auth are supported: * sasl with username and password: -```bash +```console ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SASL_SSL&sasl.mechanisms=PLAIN -remoteWrite.basicAuth.username=user -remoteWrite.basicAuth.password=password ``` * tls certificates: -```bash +```console ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` @@ -1177,7 +1177,7 @@ The `` may be manually set via `PKG_TAG=foobar make package-vmagent`. The base docker image is [alpine](https://hub.docker.com/_/alpine) but it is possible to use any other base image by setting it via `` environment variable. For example, the following command builds the image on top of [scratch](https://hub.docker.com/_/scratch) image: -```bash +```console ROOT_IMAGE=scratch make package-vmagent ``` @@ -1205,7 +1205,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b
-```bash +```console curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof ``` @@ -1215,7 +1215,7 @@ curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof
-```bash +```console curl http://0.0.0.0:8429/debug/pprof/profile > cpu.pprof ``` @@ -1231,7 +1231,7 @@ It is safe sharing the collected profiles from security point of view, since the `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their descriptions and default values: -```text +``` ./vmagent -help vmagent collects metrics data via popular data ingestion protocols and routes them to VictoriaMetrics. From dc668b8246fc038a80b26ffe4ada5073cab83479 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 10 Nov 2023 20:59:57 +0100 Subject: [PATCH 18/48] docs/Articles.md: add a link to https://blog.cloudflare.com/introducing-http-traffic-anomalies-notifications/ --- docs/Articles.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Articles.md b/docs/Articles.md index fff19672f0..aec6f85177 100644 --- a/docs/Articles.md +++ b/docs/Articles.md @@ -17,6 +17,7 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). ## Third-party articles and slides about VictoriaMetrics * [Why Roblox Picked VictoriaMetrics for Observability Data Overhaul](https://www.datanami.com/2023/05/30/why-roblox-picked-victoriametrics-for-observability-data-overhaul/) +* [Cludflare: Introducing notifications for HTTP Traffic Anomalies](https://blog.cloudflare.com/introducing-http-traffic-anomalies-notifications/) * [The (Almost) Infinitely Scalable Open Source Monitoring Dream](https://www.forbes.com/sites/adrianbridgwater/2022/08/16/the-almost-infinitely-scalable-open-source-monitoring-dream/) * [The Agility In Cloud Observability](https://www.forbes.com/sites/adrianbridgwater/2023/07/05/the-agility-in-cloud-observability/) * [Monitoring at scale with Victoria Metrics](https://tech.bedrockstreaming.com/2022/09/06/monitoring-at-scale-with-victoriametrics.html) From 22498c50874c1bb8713badbb8d0f647f3dc68d1d Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 10 Nov 2023 21:26:51 +0100 Subject: [PATCH 19/48] docs/Articles.md: sort third-party articles by importance --- docs/Articles.md | 66 ++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/Articles.md b/docs/Articles.md index aec6f85177..bdb8591e4d 100644 --- a/docs/Articles.md +++ b/docs/Articles.md @@ -16,36 +16,44 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). ## Third-party articles and slides about VictoriaMetrics -* [Why Roblox Picked VictoriaMetrics for Observability Data Overhaul](https://www.datanami.com/2023/05/30/why-roblox-picked-victoriametrics-for-observability-data-overhaul/) +* [Datanami: Why Roblox Picked VictoriaMetrics for Observability Data Overhaul](https://www.datanami.com/2023/05/30/why-roblox-picked-victoriametrics-for-observability-data-overhaul/) * [Cludflare: Introducing notifications for HTTP Traffic Anomalies](https://blog.cloudflare.com/introducing-http-traffic-anomalies-notifications/) -* [The (Almost) Infinitely Scalable Open Source Monitoring Dream](https://www.forbes.com/sites/adrianbridgwater/2022/08/16/the-almost-infinitely-scalable-open-source-monitoring-dream/) -* [The Agility In Cloud Observability](https://www.forbes.com/sites/adrianbridgwater/2023/07/05/the-agility-in-cloud-observability/) -* [Monitoring at scale with Victoria Metrics](https://tech.bedrockstreaming.com/2022/09/06/monitoring-at-scale-with-victoriametrics.html) +* [Grammarly: Better, Faster, Cheaper: How Grammarly Improved Monitoring by Over 10x with VictoriaMetrics](https://www.grammarly.com/blog/engineering/monitoring-with-victoriametrics/) +* [CERN: CMS monitoring R&D: Real-time monitoring and alerts](https://indico.cern.ch/event/877333/contributions/3696707/attachments/1972189/3281133/CMS_mon_RD_for_opInt.pdf) +* [CERN: The CMS monitoring infrastructure and applications](https://arxiv.org/pdf/2007.03630.pdf) +* [Forbes: The (Almost) Infinitely Scalable Open Source Monitoring Dream](https://www.forbes.com/sites/adrianbridgwater/2022/08/16/the-almost-infinitely-scalable-open-source-monitoring-dream/) +* [Forbes: The Agility In Cloud Observability](https://www.forbes.com/sites/adrianbridgwater/2023/07/05/the-agility-in-cloud-observability/) +* [Bedrock: Monitoring at scale with Victoria Metrics](https://tech.bedrockstreaming.com/2022/09/06/monitoring-at-scale-with-victoriametrics.html) +* [Percona: Optimizing the Storage of Large Volumes of Metrics for a Long Time in VictoriaMetrics](https://percona.community/blog/2022/06/02/long-time-keeping-metrics-victoriametrics/) +* [Percona: Foiled by the Firewall: A Tale of Transition From Prometheus to VictoriaMetrics](https://www.percona.com/blog/2020/12/01/foiled-by-the-firewall-a-tale-of-transition-from-prometheus-to-victoriametrics/) +* [Percona: Observations on Better Resource Usage with Percona Monitoring and Management v2.12.0](https://www.percona.com/blog/2020/12/23/observations-on-better-resource-usage-with-percona-monitoring-and-management-v2-12-0/) +* [Percona: How do We Keep Metrics for a Long Time in VictoriaMetrics](https://www.youtube.com/watch?v=SGZjY7xgDwE) +* [Miro: Prometheus High Availability and Fault Tolerance strategy, long term storage with VictoriaMetrics](https://medium.com/miro-engineering/prometheus-high-availability-and-fault-tolerance-strategy-long-term-storage-with-victoriametrics-82f6f3f0409e) +* [ZERODHA: Infrastructure monitoring with Prometheus at Zerodha](https://zerodha.tech/blog/infra-monitoring-at-zerodha/) +* [ZERODHA: Monitoring K8S with VictoriaMetrics](https://docs.google.com/presentation/d/1g7yUyVEaAp4tPuRy-MZbPXKqJ1z78_5VKuV841aQfsg/edit) +* [Criteo: VictoriaMetrics, a stress-free Prometheus Remote Storage for 1 Billion metrics](https://medium.com/criteo-engineering/victoriametrics-a-prometheus-remote-storage-solution-57081a3d8e61) +* [Abios Gaming: Choosing a Time Series Database for High Cardinality Aggregations](https://abiosgaming.com/press/high-cardinality-aggregations/) +* [Cybozu: Monitoring Kubernetes clusters with VictoriaMetrics and Grafana](https://blog.cybozu.io/entry/2021/03/18/115743) +* [Razorpay: Scaling to trillions of metric data points](https://engineering.razorpay.com/scaling-to-trillions-of-metric-data-points-f569a5b654f2) +* [Fly.io: Fly's Prometheus Metrics](https://fly.io/blog/measuring-fly/) +* [Sismology: Iguana Solutions’ Monitoring System](https://medium.com/nerd-for-tech/sismology-iguana-solutions-monitoring-system-f46e4170447f) +* [Nordic APIs: Monitoring with Prometheus, Grafana, AlertManager and VictoriaMetrics](https://nordicapis.com/api-monitoring-with-prometheus-grafana-alertmanager-and-victoriametrics/) +* [Smarkets: How we improved our Kubernetes monitoring at Smarkets, and how you could too](https://smarketshq.com/monitoring-kubernetes-clusters-41a4b24c19e3) +* [Mist: Kubernetes and VictoriaMetrics in Mist v4.6](https://mist.io/blog/2021-11-26-kubernetes-and-victoriametrics-in-Mist-v4-6) +* [Kintone: Multi-tenancy monitoring system for Kubernetes cluster using VictoriaMetrics and operators](https://blog.kintone.io/entry/2021/03/31/175256) +* [Alteos: Observability, Availability & DORA’s Research Program](https://medium.com/alteos-tech-blog/observability-availability-and-doras-research-program-85deb6680e78) +* [Brewblox: InfluxDB to Victoria Metrics](https://www.brewblox.com/dev/decisions/20210718_victoria_metrics.html) +* [Techetio: Evaluating Backend Options For Prometheus Metrics](https://www.techetio.com/2022/08/21/evaluating-backend-options-for-prometheus-metrics/) +* [Asserts: Announcing Asserts](https://www.asserts.ai/blog/announcing-asserts/) * [Optimizing Linkerd metrics in Prometheus](https://aatarasoff.medium.com/optimizing-linkerd-metrics-in-prometheus-de607ec10f6b) -* [Optimizing the Storage of Large Volumes of Metrics for a Long Time in VictoriaMetrics](https://percona.community/blog/2022/06/02/long-time-keeping-metrics-victoriametrics/) -* [How do We Keep Metrics for a Long Time in VictoriaMetrics](https://www.youtube.com/watch?v=SGZjY7xgDwE) -* [Announcing Asserts](https://www.asserts.ai/blog/announcing-asserts/) -* [Choosing a Time Series Database for High Cardinality Aggregations](https://abiosgaming.com/press/high-cardinality-aggregations/) -* [Scaling to trillions of metric data points](https://engineering.razorpay.com/scaling-to-trillions-of-metric-data-points-f569a5b654f2) * [VictoriaMetrics vs. OpenTSDB](https://blg.robot-house.us/posts/tsdbs-grow/) * [Monitoring of multiple OpenShift clusters with VictoriaMetrics](https://medium.com/ibm-garage/monitoring-of-multiple-openshift-clusters-with-victoriametrics-d4f0979e2544) -* [Fly's Prometheus Metrics](https://fly.io/blog/measuring-fly/) * [Ultra Monitoring with Victoria Metrics](https://dev.to/aws-builders/ultra-monitoring-with-victoria-metrics-1p2) -* [Infrastructure monitoring with Prometheus at Zerodha](https://zerodha.tech/blog/infra-monitoring-at-zerodha/) -* [Sismology: Iguana Solutions’ Monitoring System](https://medium.com/nerd-for-tech/sismology-iguana-solutions-monitoring-system-f46e4170447f) -* [Prometheus High Availability and Fault Tolerance strategy, long term storage with VictoriaMetrics](https://medium.com/miro-engineering/prometheus-high-availability-and-fault-tolerance-strategy-long-term-storage-with-victoriametrics-82f6f3f0409e) -* [Monitoring with Prometheus, Grafana, AlertManager and VictoriaMetrics](https://www.sensedia.com/post/monitoring-with-prometheus-grafana-alertmanager-and-victoriametrics) -* [How we improved our Kubernetes monitoring at Smarkets, and how you could too](https://smarketshq.com/monitoring-kubernetes-clusters-41a4b24c19e3) -* [Kubernetes and VictoriaMetrics in Mist v4.6](https://mist.io/blog/2021-11-26-kubernetes-and-victoriametrics-in-Mist-v4-6) -* [Foiled by the Firewall: A Tale of Transition From Prometheus to VictoriaMetrics](https://www.percona.com/blog/2020/12/01/foiled-by-the-firewall-a-tale-of-transition-from-prometheus-to-victoriametrics/) -* [Observations on Better Resource Usage with Percona Monitoring and Management v2.12.0](https://www.percona.com/blog/2020/12/23/observations-on-better-resource-usage-with-percona-monitoring-and-management-v2-12-0/) -* [Better Prometheus rate() function with VictoriaMetrics](https://www.percona.com/blog/2020/02/28/better-prometheus-rate-function-with-victoriametrics/) -* [Percona monitoring and management migration from Prometheus to VictoriaMetrics FAQ](https://www.percona.com/blog/2020/12/16/percona-monitoring-and-management-migration-from-prometheus-to-victoriametrics-faq/) -* [Compiling a Percona Monitoring and Management v2 Client in ARM: Raspberry Pi 3 Reprise](https://www.percona.com/blog/2021/05/26/compiling-a-percona-monitoring-and-management-v2-client-in-arm-raspberry-pi-3/) +* [Percona: Better Prometheus rate() function with VictoriaMetrics](https://www.percona.com/blog/2020/02/28/better-prometheus-rate-function-with-victoriametrics/) +* [Percona: Percona monitoring and management migration from Prometheus to VictoriaMetrics FAQ](https://www.percona.com/blog/2020/12/16/percona-monitoring-and-management-migration-from-prometheus-to-victoriametrics-faq/) +* [Percona: Compiling a Percona Monitoring and Management v2 Client in ARM: Raspberry Pi 3 Reprise](https://www.percona.com/blog/2021/05/26/compiling-a-percona-monitoring-and-management-v2-client-in-arm-raspberry-pi-3/) +* [Percona: Tame Kubernetes Costs with Percona Monitoring and Management and Prometheus Operator](https://www.percona.com/blog/2021/02/12/tame-kubernetes-costs-with-percona-monitoring-and-management-and-prometheus-operator/) * [Making peace with Prometheus rate()](https://blog.doit-intl.com/making-peace-with-prometheus-rate-43a3ea75c4cf) -* [Monitoring K8S with VictoriaMetrics](https://docs.google.com/presentation/d/1g7yUyVEaAp4tPuRy-MZbPXKqJ1z78_5VKuV841aQfsg/edit) -* [CMS monitoring R&D: Real-time monitoring and alerts](https://indico.cern.ch/event/877333/contributions/3696707/attachments/1972189/3281133/CMS_mon_RD_for_opInt.pdf) -* [The CMS monitoring infrastructure and applications](https://arxiv.org/pdf/2007.03630.pdf) * [Disk usage: VictoriaMetrics vs Prometheus](https://stas.starikevich.com/posts/disk-usage-for-vm-versus-prometheus/) * [Benchmarking time series workloads on Apache Kudu using TSBS](https://blog.cloudera.com/benchmarking-time-series-workloads-on-apache-kudu-using-tsbs/) * [What are Open Source Time Series Databases?](https://www.iunera.com/kraken/fabric/time-series-database/) @@ -56,13 +64,8 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [Monitoring Kubernetes with VictoriaMetrics+Prometheus](https://speakerdeck.com/bo0km4n/victoriametrics-plus-prometheusdegou-zhu-surufu-shu-kubernetesfalsejian-shi-ji-pan) * [High-performance Graphite storage solution on top of VictoriaMetrics](https://golangexample.com/a-high-performance-graphite-storage-solution/) * [Cloud Native Model Driven Telemetry Stack on OpenShift](https://cer6erus.medium.com/cloud-native-model-driven-telemetry-stack-on-openshift-80712621f5bc) -* [Observability, Availability & DORA’s Research Program](https://medium.com/alteos-tech-blog/observability-availability-and-doras-research-program-85deb6680e78) -* [Tame Kubernetes Costs with Percona Monitoring and Management and Prometheus Operator](https://www.percona.com/blog/2021/02/12/tame-kubernetes-costs-with-percona-monitoring-and-management-and-prometheus-operator/) * [Prometheus VictoriaMetrics On AWS ECS](https://dalefro.medium.com/prometheus-victoria-metrics-on-aws-ecs-62448e266090) -* [API Monitoring With Prometheus, Grafana, AlertManager and VictoriaMetrics](https://nordicapis.com/api-monitoring-with-prometheus-grafana-alertmanager-and-victoriametrics/) * [Solving Metrics at scale with VictoriaMetrics](https://www.youtube.com/watch?v=QgLMztnj7-8) -* [Monitoring Kubernetes clusters with VictoriaMetrics and Grafana](https://blog.cybozu.io/entry/2021/03/18/115743) -* [Multi-tenancy monitoring system for Kubernetes cluster using VictoriaMetrics and operators](https://blog.kintone.io/entry/2021/03/31/175256) * [Monitoring as Code на базе VictoriaMetrics и Grafana](https://habr.com/ru/post/568090/) * [Push Prometheus metrics to VictoriaMetrics or other exporters](https://pythonawesome.com/push-prometheus-metrics-to-victoriametrics-or-other-exporters/) * [Install and configure VictoriaMetrics on Debian](https://www.vultr.com/docs/install-and-configure-victoriametrics-on-debian) @@ -71,16 +74,12 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [How we tried using VictoriaMetrics and Thanos at the same time](https://medium.com/@uburro/how-we-tried-using-victoriametrics-and-thanos-at-the-same-time-48803d2a638b) * [Prometheus, Grafana, and Kubernetes, Oh My!](https://www.groundcover.com/blog/prometheus-grafana-kubernetes) * [Explaining modern server monitoring stacks for self-hosting](https://dataswamp.org/~solene/2022-09-11-exploring-monitoring-stacks.html) -* [Brewblox: InfluxDB to Victoria Metrics](https://www.brewblox.com/dev/decisions/20210718_victoria_metrics.html) * [VictoriaMetrics static scraper](https://blog.differentpla.net/blog/2022/10/16/victoria-metrics-static-scraper/) * [VictoriaMetrics and Open Cosmos boldly takes edge computing to the edge of space](https://www.iot-now.com/2022/07/19/122423-victoriametrics-and-open-cosmos-boldly-takes-edge-computing-to-the-edge-of-space/) -* [Evaluating Backend Options For Prometheus Metrics](https://www.techetio.com/2022/08/21/evaluating-backend-options-for-prometheus-metrics/) * [Time Series in the Multiverse of Madness (in Korean)](https://www.youtube.com/watch?v=OUyXPgVcdw4), plus [these slides](https://deview.kr/data/deview/session/attach/%5B2B4%5DVictoriaMetrics_%E1%84%89%E1%85%B5%E1%84%80%E1%85%A8%E1%84%8B%E1%85%A7%E1%86%AF_%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5_%E1%84%83%E1%85%A2%E1%84%92%E1%85%A9%E1%86%AB%E1%84%83%E1%85%A9%E1%86%AB%E1%84%8B%E1%85%B4_%E1%84%86%E1%85%A5%E1%86%AF%E1%84%90%E1%85%B5%E1%84%87%E1%85%A5%E1%84%89%E1%85%B3_Kor+Eng.pdf) * [VictoriaMetrics: an overview and its use instead of Prometheus](https://rtfm.co.ua/en/victoriametrics-an-overview-and-its-use-instead-of-prometheus/) * [VictoriaMetrics: deploying a Kubernetes monitoring stack](https://rtfm.co.ua/en/victoriametrics-deploying-a-kubernetes-monitoring-stack/) * [VictoriaMetrics: VMAuth – Proxy, Authentication, and Authorization](https://rtfm.co.ua/en/victoriametrics-vmauth-proxy-authentication-and-authorization/) -* [Better, Faster, Cheaper: How Grammarly Improved Monitoring by Over 10x with VictoriaMetrics](https://www.grammarly.com/blog/engineering/monitoring-with-victoriametrics/) -* [VictoriaMetrics, a stress-free Prometheus Remote Storage for 1 Billion metrics](https://medium.com/criteo-engineering/victoriametrics-a-prometheus-remote-storage-solution-57081a3d8e61) * [Solving metrics at scale with VictoriaMetrics](https://sarthak-acoustic.medium.com/solving-metrics-at-scale-with-victoriametrics-ac9c306826c3) * [VictoriaMetrics: a comprehensive guide](https://medium.com/@seifeddinerajhi/victoriametrics-a-comprehensive-guide-comparing-it-to-prometheus-and-implementing-kubernetes-03eb8feb0cc2) @@ -137,6 +136,7 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [How ClickHouse inspired us to build a high performance time series database](https://www.youtube.com/watch?v=p9qjb_yoBro). See also [slides](https://docs.google.com/presentation/d/1SdFrwsyR-HMXfbzrY8xfDZH_Dg6E7E5NJ84tQozMn3w/edit?usp=sharing) * [OSA Con 2022: Specifics of data analysis in Time Series Databases](https://www.youtube.com/watch?v=_zORxrgLtec) * [OSMC 2022. VictoriaMetrics: scaling to 100 million metrics per second](https://www.youtube.com/watch?v=xfed9_Q0_qU). See also [slides](https://www.slideshare.net/NETWAYS/osmc-2022-victoriametrics-scaling-to-100-million-metrics-per-second-by-aliaksandr-valialkin) +* [OSMC 2023. Large-scale logging made easy](https://docs.google.com/presentation/d/e/2PACX-1vTDs-Ggs89Xp-Q6s6JAuututM-j43ohssght5ar2egb_uCoxibb2VkrrqG931Tt4eRWfy9JJRJ39Qyy/pub?start=false&loop=false&delayms=3000) * [CNCF Paris Meetup 2022-09-15 - VictoriaMetrics - The cost of scale in Prometheus ecosystem](https://www.youtube.com/watch?v=gcZYHpri2Hw). See also [slides](https://docs.google.com/presentation/d/1jhZuKnAXi15M-mdBP5a4ZAiyrMeHhYmzO8xcZ6pMyLc/edit?usp=sharing) * [VictoriaMetrics Meetup December 2022](https://www.youtube.com/watch?v=Mesc6JBFNhQ). See also [slides for "VictoriaMetrics 2022: new features" talk](https://docs.google.com/presentation/d/1jI7XZoodmuzLymdu4MToG9onAKQjzCNwMO2NDupyUkQ/edit?usp=sharing). * [Comparing Thanos to VictoriaMetrics cluster](https://faun.pub/comparing-thanos-to-victoriametrics-cluster-b193bea1683) From 010dc15d16d246a12d40c6052de62519d3fe3e22 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 10 Nov 2023 21:54:25 +0100 Subject: [PATCH 20/48] lib/blockcache: do not cache entries, which were attempted to be accessed 1 or 2 times Previously entries which were accessed only 1 time weren't cached. It has been appeared that some rarely executed heavy queries may read indexdb block twice in a row instead of once. There is no need in caching such a block then. This change should eliminate cache size spikes for indexdb/dataBlocks when such heavy queries are executed. Expose -blockcache.missesBeforeCaching command-line flag, which can be used for fine-tuning the number of cache misses needed before storing the block in the caching. --- README.md | 2 ++ docs/CHANGELOG.md | 1 + docs/Cluster-VictoriaMetrics.md | 2 ++ docs/README.md | 2 ++ docs/Single-server-VictoriaMetrics.md | 2 ++ lib/blockcache/blockcache.go | 21 +++++++++------ lib/blockcache/blockcache_test.go | 38 ++++++++++++++------------- 7 files changed, 42 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index c6b591e718..5b2d87c2cc 100644 --- a/README.md +++ b/README.md @@ -2526,6 +2526,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li ``` -bigMergeConcurrency int Deprecated: this flag does nothing. Please use -smallMergeConcurrency for controlling the concurrency of background merges. See https://docs.victoriametrics.com/#storage + -blockcache.missesBeforeCaching int + The number of cache misses before putting the block into cache. Higher values may reduce indexdb/dataBlocks cache size at the cost of higher CPU and disk read usage (default 2) -cacheExpireDuration duration Items are removed from in-memory caches after they aren't accessed for this duration. Lower values may reduce memory usage at the cost of higher CPU usage. See also -prevCacheRemovalPercent (default 30m0s) -configAuthKey string diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4aa1b91070..612625bebc 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -78,6 +78,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: dashboards/vmalert: add new panel `Missed evaluations` for indicating alerting groups that miss their evaluations. * FEATURE: all: track requests with wrong auth key and wrong basic auth at `vm_http_request_errors_total` [metric](https://docs.victoriametrics.com/#monitoring) with `reason="wrong_auth_key"` and `reason="wrong_basic_auth"`. See [this issue](https://github.com/victoriaMetrics/victoriaMetrics/issues/4590). Thanks to @venkatbvc for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5166). * FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which allows to disable TLS verification for backend connection. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). +* FEATURE: `vmstorage`: add `-blockcache.missesBeforeCaching` command-line flag, which can be used for fine-tuning RAM usage for `indexdb/dataBlocks` cache when queries touching big number of time series are executed. * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): strip sensitive information such as auth headers or passwords from datasource, remote-read, remote-write or notifier URLs in log messages or UI. This behavior is by default and is controlled via `-datasource.showURL`, `-remoteRead.showURL`, `remoteWrite.showURL` or `-notifier.showURL` cmd-line flags. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5044). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): fix vmalert web UI when running on 32-bit architectures machine. diff --git a/docs/Cluster-VictoriaMetrics.md b/docs/Cluster-VictoriaMetrics.md index 18a846aee5..9e199fcfb4 100644 --- a/docs/Cluster-VictoriaMetrics.md +++ b/docs/Cluster-VictoriaMetrics.md @@ -1332,6 +1332,8 @@ Below is the output for `/path/to/vmstorage -help`: ``` -bigMergeConcurrency int Deprecated: this flag does nothing. Please use -smallMergeConcurrency for controlling the concurrency of background merges. See https://docs.victoriametrics.com/#storage + -blockcache.missesBeforeCaching int + The number of cache misses before putting the block into cache. Higher values may reduce indexdb/dataBlocks cache size at the cost of higher CPU and disk read usage (default 2) -cacheExpireDuration duration Items are removed from in-memory caches after they aren't accessed for this duration. Lower values may reduce memory usage at the cost of higher CPU usage. See also -prevCacheRemovalPercent (default 30m0s) -cluster.tls diff --git a/docs/README.md b/docs/README.md index 9fb8b2d6dc..3432fda58d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2529,6 +2529,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li ``` -bigMergeConcurrency int Deprecated: this flag does nothing. Please use -smallMergeConcurrency for controlling the concurrency of background merges. See https://docs.victoriametrics.com/#storage + -blockcache.missesBeforeCaching int + The number of cache misses before putting the block into cache. Higher values may reduce indexdb/dataBlocks cache size at the cost of higher CPU and disk read usage (default 2) -cacheExpireDuration duration Items are removed from in-memory caches after they aren't accessed for this duration. Lower values may reduce memory usage at the cost of higher CPU usage. See also -prevCacheRemovalPercent (default 30m0s) -configAuthKey string diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index a29541ebbe..9e16d636b3 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -2537,6 +2537,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li ``` -bigMergeConcurrency int Deprecated: this flag does nothing. Please use -smallMergeConcurrency for controlling the concurrency of background merges. See https://docs.victoriametrics.com/#storage + -blockcache.missesBeforeCaching int + The number of cache misses before putting the block into cache. Higher values may reduce indexdb/dataBlocks cache size at the cost of higher CPU and disk read usage (default 2) -cacheExpireDuration duration Items are removed from in-memory caches after they aren't accessed for this duration. Lower values may reduce memory usage at the cost of higher CPU usage. See also -prevCacheRemovalPercent (default 30m0s) -configAuthKey string diff --git a/lib/blockcache/blockcache.go b/lib/blockcache/blockcache.go index ce2aaab0e0..fecb62b975 100644 --- a/lib/blockcache/blockcache.go +++ b/lib/blockcache/blockcache.go @@ -2,6 +2,7 @@ package blockcache import ( "container/heap" + "flag" "sync" "sync/atomic" "time" @@ -12,6 +13,9 @@ import ( "github.com/cespare/xxhash/v2" ) +var missesBeforeCaching = flag.Int("blockcache.missesBeforeCaching", 2, "The number of cache misses before putting the block into cache. "+ + "Higher values may reduce indexdb/dataBlocks cache size at the cost of higher CPU and disk read usage") + // Cache caches Block entries. // // Call NewCache() for creating new Cache. @@ -184,7 +188,7 @@ type cache struct { // perKeyMisses contains per-block cache misses. // - // Blocks with less than 2 cache misses aren't stored in the cache in order to prevent from eviction for frequently accessed items. + // Blocks with up to *missesBeforeCaching cache misses aren't stored in the cache in order to prevent from eviction for frequently accessed items. perKeyMisses map[Key]int // The heap for removing the least recently used entries from m. @@ -300,13 +304,14 @@ func (c *cache) GetBlock(k Key) Block { func (c *cache) PutBlock(k Key, b Block) { c.mu.Lock() defer c.mu.Unlock() - // If the entry wasn't accessed yet (e.g. c.perKeyMisses[k] == 0), then cache it, since it is likely it will be accessed soon. - // Do not cache the entry only if there was only a single unsuccessful attempt to access it. - // This may be one-time-wonders entry, which won't be accessed more, so there is no need in caching it. - doNotCache := c.perKeyMisses[k] == 1 - if doNotCache { - // Do not cache b if it has been requested only once (aka one-time-wonders items). - // This should reduce memory usage for the cache. + misses := c.perKeyMisses[k] + if misses > 0 && misses <= *missesBeforeCaching { + // If the entry wasn't accessed yet (e.g. misses == 0), then cache it, + // since it has been just created without consulting the cache and will be accessed soon. + // + // Do not cache the entry if there were up to *missesBeforeCaching unsuccessful attempts to access it. + // This may be one-time-wonders entry, which won't be accessed more, so do not cache it + // in order to save memory for frequently accessed items. return } diff --git a/lib/blockcache/blockcache_test.go b/lib/blockcache/blockcache_test.go index fde5d01561..175093028b 100644 --- a/lib/blockcache/blockcache_test.go +++ b/lib/blockcache/blockcache_test.go @@ -83,20 +83,22 @@ func TestCache(t *testing.T) { if n := c.Misses(); n != 2 { t.Fatalf("unexpected number of misses; got %d; want %d", n, 2) } - // Store the missed entry to the cache. It shouldn't be stored because of the previous cache miss - c.PutBlock(k, &b) - if n := c.SizeBytes(); n != 0 { - t.Fatalf("unexpected SizeBytes(); got %d; want %d", n, 0) - } - // Verify that the entry wasn't stored to the cache. - if b1 := c.GetBlock(k); b1 != nil { - t.Fatalf("unexpected non-nil block obtained after removing all the blocks for the part; got %v", b1) - } - if n := c.Requests(); n != 4 { - t.Fatalf("unexpected number of requests; got %d; want %d", n, 4) - } - if n := c.Misses(); n != 3 { - t.Fatalf("unexpected number of misses; got %d; want %d", n, 3) + for i := 0; i < *missesBeforeCaching; i++ { + // Store the missed entry to the cache. It shouldn't be stored because of the previous cache miss + c.PutBlock(k, &b) + if n := c.SizeBytes(); n != 0 { + t.Fatalf("unexpected SizeBytes(); got %d; want %d", n, 0) + } + // Verify that the entry wasn't stored to the cache. + if b1 := c.GetBlock(k); b1 != nil { + t.Fatalf("unexpected non-nil block obtained after removing all the blocks for the part; got %v", b1) + } + if n := c.Requests(); n != uint64(4+i) { + t.Fatalf("unexpected number of requests; got %d; want %d", n, 4+i) + } + if n := c.Misses(); n != uint64(3+i) { + t.Fatalf("unexpected number of misses; got %d; want %d", n, 3+i) + } } // Store the entry again. Now it must be stored because of the second cache miss. c.PutBlock(k, &b) @@ -106,11 +108,11 @@ func TestCache(t *testing.T) { if b1 := c.GetBlock(k); b1 != &b { t.Fatalf("unexpected block obtained; got %v; want %v", b1, &b) } - if n := c.Requests(); n != 5 { - t.Fatalf("unexpected number of requests; got %d; want %d", n, 5) + if n := c.Requests(); n != uint64(4+*missesBeforeCaching) { + t.Fatalf("unexpected number of requests; got %d; want %d", n, 4+*missesBeforeCaching) } - if n := c.Misses(); n != 3 { - t.Fatalf("unexpected number of misses; got %d; want %d", n, 3) + if n := c.Misses(); n != uint64(2+*missesBeforeCaching) { + t.Fatalf("unexpected number of misses; got %d; want %d", n, 2+*missesBeforeCaching) } // Manually clean the cache. The entry shouldn't be deleted because it was recently accessed. From 2db1a664e14a72f2396e7ec069d12c54b0349310 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 10 Nov 2023 22:28:31 +0100 Subject: [PATCH 21/48] deployment: update Go builder from Go1.21.3 to Go1.21.4 See https://github.com/golang/go/issues?q=milestone%3AGo1.21.4+label%3ACherryPickApproved --- .github/workflows/check-licenses.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/main.yml | 6 +++--- app/vmui/Dockerfile-web | 2 +- deployment/docker/Makefile | 2 +- deployment/logs-benchmark/docker-compose-elk.yml | 2 +- deployment/logs-benchmark/docker-compose-loki.yml | 2 +- docs/CHANGELOG.md | 2 +- snap/local/Makefile | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/check-licenses.yml b/.github/workflows/check-licenses.yml index 28852f8361..52af9c352f 100644 --- a/.github/workflows/check-licenses.yml +++ b/.github/workflows/check-licenses.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Go uses: actions/setup-go@main with: - go-version: 1.21.3 + go-version: 1.21.4 id: go - name: Code checkout uses: actions/checkout@master diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ab7e324a1d..20152ba970 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -57,7 +57,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 check-latest: true cache: true if: ${{ matrix.language == 'go' }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a0d88242b3..88dead7cd1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 check-latest: true cache: true @@ -56,7 +56,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 check-latest: true cache: true @@ -81,7 +81,7 @@ jobs: id: go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 check-latest: true cache: true diff --git a/app/vmui/Dockerfile-web b/app/vmui/Dockerfile-web index 687a3cc6a6..0626f2f786 100644 --- a/app/vmui/Dockerfile-web +++ b/app/vmui/Dockerfile-web @@ -1,4 +1,4 @@ -FROM golang:1.21.3 as build-web-stage +FROM golang:1.21.4 as build-web-stage COPY build /build WORKDIR /build diff --git a/deployment/docker/Makefile b/deployment/docker/Makefile index c7994bce97..59dcc52921 100644 --- a/deployment/docker/Makefile +++ b/deployment/docker/Makefile @@ -5,7 +5,7 @@ DOCKER_NAMESPACE ?= victoriametrics ROOT_IMAGE ?= alpine:3.18.4 CERTS_IMAGE := alpine:3.18.4 -GO_BUILDER_IMAGE := golang:1.21.3-alpine +GO_BUILDER_IMAGE := golang:1.21.4-alpine BUILDER_IMAGE := local/builder:2.0.0-$(shell echo $(GO_BUILDER_IMAGE) | tr :/ __)-1 BASE_IMAGE := local/base:1.1.4-$(shell echo $(ROOT_IMAGE) | tr :/ __)-$(shell echo $(CERTS_IMAGE) | tr :/ __) DOCKER ?= docker diff --git a/deployment/logs-benchmark/docker-compose-elk.yml b/deployment/logs-benchmark/docker-compose-elk.yml index 0b96af0530..8362cf9ed3 100644 --- a/deployment/logs-benchmark/docker-compose-elk.yml +++ b/deployment/logs-benchmark/docker-compose-elk.yml @@ -18,7 +18,7 @@ services: - vlogs generator: - image: golang:1.21.3-alpine + image: golang:1.21.4-alpine restart: always working_dir: /go/src/app volumes: diff --git a/deployment/logs-benchmark/docker-compose-loki.yml b/deployment/logs-benchmark/docker-compose-loki.yml index 2318840527..c8eb148450 100644 --- a/deployment/logs-benchmark/docker-compose-loki.yml +++ b/deployment/logs-benchmark/docker-compose-loki.yml @@ -2,7 +2,7 @@ version: '3' services: generator: - image: golang:1.21.3-alpine + image: golang:1.21.4-alpine restart: always working_dir: /go/src/app volumes: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 612625bebc..a7bd0e0c6b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -31,7 +31,7 @@ The sandbox cluster installation is running under the constant load generated by **vmalert's cmd-line flag `datasource.queryTimeAlignment` was deprecated and will have no effect anymore. It will be completely removed in next releases. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5049) and more detailed changes below.** **vmalert's cmd-line flag `datasource.lookback` will be deprecated soon. Please use `-rule.evalDelay` command-line flag instead. It will have no effect in next release and be removed in future releases. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5155).** -* SECURITY: upgrade Go builder from Go1.21.1 to Go1.21.3. See [the list of issues addressed in Go1.21.2](https://github.com/golang/go/issues?q=milestone%3AGo1.21.2+label%3ACherryPickApproved) and [the list of issues addressed in Go1.21.3](https://github.com/golang/go/issues?q=milestone%3AGo1.21.3+label%3ACherryPickApproved). +* SECURITY: upgrade Go builder from Go1.21.1 to Go1.21.4. See [the list of issues addressed in Go1.21.2](https://github.com/golang/go/issues?q=milestone%3AGo1.21.2+label%3ACherryPickApproved), [the list of issues addressed in Go1.21.3](https://github.com/golang/go/issues?q=milestone%3AGo1.21.3+label%3ACherryPickApproved) and [the list of issues addressed in Go1.21.4](https://github.com/golang/go/issues?q=milestone%3AGo1.21.4+label%3ACherryPickApproved). * FEATURE: `vmselect`: improve performance for repeated [instant queries](https://docs.victoriametrics.com/keyConcepts.html#instant-query) if they contain one of the following [rollup functions](https://docs.victoriametrics.com/MetricsQL.html#rollup-functions): - [avg_over_time](https://docs.victoriametrics.com/MetricsQL.html#avg_over_time) diff --git a/snap/local/Makefile b/snap/local/Makefile index a1600157ce..d315871b5e 100644 --- a/snap/local/Makefile +++ b/snap/local/Makefile @@ -1,4 +1,4 @@ -GO_VERSION ?=1.21.3 +GO_VERSION ?=1.21.4 SNAP_BUILDER_IMAGE := local/snap-builder:2.0.0-$(shell echo $(GO_VERSION) | tr :/ __) From 80213f07faf4b0095b0c3792cf21098cac11384e Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sat, 11 Nov 2023 12:09:25 +0100 Subject: [PATCH 22/48] app/vmselect/promql: optimize instant queries with min_over_time() and max_over_time() rollup functions This is a follow-up for 41a0fdaf39ea99708cf1c899332910965d62dcfc --- app/vmselect/promql/eval.go | 366 ++++++++++++++++++++++++++++++------ docs/CHANGELOG.md | 20 +- 2 files changed, 324 insertions(+), 62 deletions(-) diff --git a/app/vmselect/promql/eval.go b/app/vmselect/promql/eval.go index aa84185e82..7b53180cc8 100644 --- a/app/vmselect/promql/eval.go +++ b/app/vmselect/promql/eval.go @@ -41,7 +41,7 @@ var ( "See also -search.logSlowQueryDuration and -search.maxMemoryPerQuery") noStaleMarkers = flag.Bool("search.noStaleMarkers", false, "Set this flag to true if the database doesn't contain Prometheus stale markers, "+ "so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets") - minWindowForInstantRollupOptimization = flagutil.NewDuration("search.minWindowForInstantRollupOptimization", "6h", "Enable cache-based optimization for repeated queries "+ + minWindowForInstantRollupOptimization = flagutil.NewDuration("search.minWindowForInstantRollupOptimization", "3h", "Enable cache-based optimization for repeated queries "+ "to /api/v1/query (aka instant queries), which contain rollup functions with lookbehind window exceeding the given value") ) @@ -1084,6 +1084,59 @@ func evalInstantRollup(qt *querytracer.Tracer, ec *EvalConfig, funcName string, } return offset >= maxOffset } + deleteCachedSeries := func(qt *querytracer.Tracer) { + rollupResultCacheV.DeleteInstantValues(qt, expr, window, ec.Step, ec.EnforcedTagFilterss) + } + getCachedSeries := func(qt *querytracer.Tracer) ([]*timeseries, int64, error) { + again: + offset := int64(0) + tssCached := rollupResultCacheV.GetInstantValues(qt, expr, window, ec.Step, ec.EnforcedTagFilterss) + ec.QueryStats.addSeriesFetched(len(tssCached)) + if len(tssCached) == 0 { + // Cache miss. Re-populate the missing data. + start := int64(fasttime.UnixTimestamp()*1000) - cacheTimestampOffset.Milliseconds() + offset = timestamp - start + if offset < 0 { + start = timestamp + offset = 0 + } + if tooBigOffset(offset) { + qt.Printf("cannot apply instant rollup optimization because the -search.cacheTimestampOffset=%s is too big "+ + "for the requested time=%s and window=%d", cacheTimestampOffset, storage.TimestampToHumanReadableFormat(timestamp), window) + tss, err := evalAt(qt, timestamp, window) + return tss, 0, err + } + qt.Printf("calculating the rollup at time=%s, because it is missing in the cache", storage.TimestampToHumanReadableFormat(start)) + tss, err := evalAt(qt, start, window) + if err != nil { + return nil, 0, err + } + if hasDuplicateSeries(tss) { + qt.Printf("cannot apply instant rollup optimization because the result contains duplicate series") + tss, err := evalAt(qt, timestamp, window) + return tss, 0, err + } + rollupResultCacheV.PutInstantValues(qt, expr, window, ec.Step, ec.EnforcedTagFilterss, tss) + return tss, offset, nil + } + // Cache hit. Verify whether it is OK to use the cached data. + offset = timestamp - tssCached[0].Timestamps[0] + if offset < 0 { + qt.Printf("do not apply instant rollup optimization because the cached values have bigger timestamp=%s than the requested one=%s", + storage.TimestampToHumanReadableFormat(tssCached[0].Timestamps[0]), storage.TimestampToHumanReadableFormat(timestamp)) + // Delete the outdated cached values, so the cache could be re-populated with newer values. + deleteCachedSeries(qt) + goto again + } + if tooBigOffset(offset) { + qt.Printf("do not apply instant rollup optimization because the offset=%d between the requested timestamp "+ + "and the cached values is too big comparing to window=%d", offset, window) + // Delete the outdated cached values, so the cache could be re-populated with newer values. + deleteCachedSeries(qt) + goto again + } + return tssCached, offset, nil + } if !ec.mayCache() { qt.Printf("do not apply instant rollup optimization because of disabled cache") @@ -1159,6 +1212,136 @@ func evalInstantRollup(qt *querytracer.Tracer, ec *EvalConfig, funcName string, }, } return evalExpr(qt, ec, be) + case "max_over_time": + if iafc != nil { + if strings.ToLower(iafc.ae.Name) != "max" { + qt.Printf("do not apply instant rollup optimization for non-max incremental aggregate %s()", iafc.ae.Name) + return evalAt(qt, timestamp, window) + } + } + + // Calculate + // + // max_over_time(m[window] @ timestamp) + // + // as the maximum of + // + // - max_over_time(m[window] @ (timestamp-offset)) + // - max_over_time(m[offset] @ timestamp) + // + // if max_over_time(m[offset] @ (timestamp-window)) < max_over_time(m[window] @ (timestamp-offset)) + // otherwise do not apply the optimization + // + // where + // + // - max_over_time(m[window] @ (timestamp-offset)) is obtained from cache + // - max_over_time(m[offset] @ timestamp) and max_over_time(m[offset] @ (timestamp-window)) are calculated from the storage + // These rollups are calculated faster than max_over_time(m[window]) because offset is smaller than window. + qtChild := qt.NewChild("optimized calculation for instant rollup %s at time=%s with lookbehind window=%d", + expr.AppendString(nil), storage.TimestampToHumanReadableFormat(timestamp), window) + defer qtChild.Done() + + tssCached, offset, err := getCachedSeries(qtChild) + if err != nil { + return nil, err + } + if offset == 0 { + return tssCached, nil + } + // Calculate max_over_time(m[offset] @ (timestamp - window)) + tssEnd, err := evalAt(qtChild, timestamp-window, offset) + if err != nil { + return nil, err + } + if hasDuplicateSeries(tssEnd) { + qtChild.Printf("cannot apply instant rollup optimization, since tssEnd contains duplicate series") + return evalAt(qtChild, timestamp, window) + } + // Verify whether tssCached values are bigger than tssEnd values. + // If this isn't the case, then the optimization cannot be applied. + if !isLowerInstantValues(tssEnd, tssCached) { + qtChild.Printf("cannot apply instant rollup optimization, since tssEnd contains bigger values than tssCached") + deleteCachedSeries(qtChild) + return evalAt(qt, timestamp, window) + } + + // Calculate max_over_time(m[offset] @ timestamp) + tssStart, err := evalAt(qtChild, timestamp, offset) + if err != nil { + return nil, err + } + if hasDuplicateSeries(tssStart) { + qtChild.Printf("cannot apply instant rollup optimization, since tssStart contains duplicate series") + return evalAt(qtChild, timestamp, window) + } + // Calculate the result + tss := getMaxInstantValues(qtChild, tssCached, tssStart) + return tss, nil + case "min_over_time": + if iafc != nil { + if strings.ToLower(iafc.ae.Name) != "min" { + qt.Printf("do not apply instant rollup optimization for non-min incremental aggregate %s()", iafc.ae.Name) + return evalAt(qt, timestamp, window) + } + } + + // Calculate + // + // min_over_time(m[window] @ timestamp) + // + // as the minimum of + // + // - min_over_time(m[window] @ (timestamp-offset)) + // - min_over_time(m[offset] @ timestamp) + // + // if min_over_time(m[offset] @ (timestamp-window)) > min_over_time(m[window] @ (timestamp-offset)) + // otherwise do not apply the optimization + // + // where + // + // - min_over_time(m[window] @ (timestamp-offset)) is obtained from cache + // - min_over_time(m[offset] @ timestamp) and min_over_time(m[offset] @ (timestamp-window)) are calculated from the storage + // These rollups are calculated faster than min_over_time(m[window]) because offset is smaller than window. + qtChild := qt.NewChild("optimized calculation for instant rollup %s at time=%s with lookbehind window=%d", + expr.AppendString(nil), storage.TimestampToHumanReadableFormat(timestamp), window) + defer qtChild.Done() + + tssCached, offset, err := getCachedSeries(qtChild) + if err != nil { + return nil, err + } + if offset == 0 { + return tssCached, nil + } + // Calculate min_over_time(m[offset] @ (timestamp - window)) + tssEnd, err := evalAt(qtChild, timestamp-window, offset) + if err != nil { + return nil, err + } + if hasDuplicateSeries(tssEnd) { + qtChild.Printf("cannot apply instant rollup optimization, since tssEnd contains duplicate series") + return evalAt(qtChild, timestamp, window) + } + // Verify whether tssCached values are smaller than tssEnd values. + // If this isn't the case, then the optimization cannot be applied. + if !isLowerInstantValues(tssCached, tssEnd) { + qtChild.Printf("cannot apply instant rollup optimization, since tssEnd contains smaller values than tssCached") + deleteCachedSeries(qtChild) + return evalAt(qt, timestamp, window) + } + + // Calculate min_over_time(m[offset] @ timestamp) + tssStart, err := evalAt(qtChild, timestamp, offset) + if err != nil { + return nil, err + } + if hasDuplicateSeries(tssStart) { + qtChild.Printf("cannot apply instant rollup optimization, since tssStart contains duplicate series") + return evalAt(qtChild, timestamp, window) + } + // Calculate the result + tss := getMinInstantValues(qtChild, tssCached, tssStart) + return tss, nil case "count_eq_over_time", "count_gt_over_time", @@ -1191,65 +1374,33 @@ func evalInstantRollup(qt *querytracer.Tracer, ec *EvalConfig, funcName string, expr.AppendString(nil), storage.TimestampToHumanReadableFormat(timestamp), window) defer qtChild.Done() - again: - offset := int64(0) - tssCached := rollupResultCacheV.GetInstantValues(qtChild, expr, window, ec.Step, ec.EnforcedTagFilterss) - ec.QueryStats.addSeriesFetched(len(tssCached)) - if len(tssCached) == 0 { - // Cache miss. Re-populate it - start := int64(fasttime.UnixTimestamp()*1000) - cacheTimestampOffset.Milliseconds() - offset = timestamp - start - if offset < 0 { - start = timestamp - offset = 0 - } - if tooBigOffset(offset) { - qtChild.Printf("cannot apply instant rollup optimization because the -search.cacheTimestampOffset=%s is too big "+ - "for the requested time=%s and window=%d", cacheTimestampOffset, storage.TimestampToHumanReadableFormat(timestamp), window) - return evalAt(qtChild, timestamp, window) - } - qtChild.Printf("calculating the rollup at time=%s, because it is missing in the cache", storage.TimestampToHumanReadableFormat(start)) - tss, err := evalAt(qtChild, start, window) - if err != nil { - return nil, err - } - rollupResultCacheV.PutInstantValues(qtChild, expr, window, ec.Step, ec.EnforcedTagFilterss, tss) - tssCached = tss - } else { - offset = timestamp - tssCached[0].Timestamps[0] - if offset < 0 { - qtChild.Printf("do not apply instant rollup optimization because the cached values have bigger timestamp=%s than the requested one=%s", - storage.TimestampToHumanReadableFormat(tssCached[0].Timestamps[0]), storage.TimestampToHumanReadableFormat(timestamp)) - // Delete the outdated cached values, so the cache could be re-populated with newer values. - rollupResultCacheV.DeleteInstantValues(qtChild, expr, window, ec.Step, ec.EnforcedTagFilterss) - goto again - } - if tooBigOffset(offset) { - qtChild.Printf("do not apply instant rollup optimization because the offset=%d between the requested timestamp "+ - "and the cached values is too big comparing to window=%d", offset, window) - // Delete the outdated cached values, so the cache could be re-populated with newer values. - rollupResultCacheV.DeleteInstantValues(qtChild, expr, window, ec.Step, ec.EnforcedTagFilterss) - goto again - } + tssCached, offset, err := getCachedSeries(qtChild) + if err != nil { + return nil, err } if offset == 0 { - qtChild.Printf("return cached values, since they have the requested timestamp=%s", storage.TimestampToHumanReadableFormat(timestamp)) return tssCached, nil } - // Calculate count_over_time(m[offset] @ timestamp) + // Calculate rf(m[offset] @ timestamp) tssStart, err := evalAt(qtChild, timestamp, offset) if err != nil { return nil, err } - // Calculate count_over_time(m[offset] @ (timestamp - window)) + if hasDuplicateSeries(tssStart) { + qtChild.Printf("cannot apply instant rollup optimization, since tssStart contains duplicate series") + return evalAt(qtChild, timestamp, window) + } + // Calculate rf(m[offset] @ (timestamp - window)) tssEnd, err := evalAt(qtChild, timestamp-window, offset) if err != nil { return nil, err } - tss, err := mergeInstantValues(qtChild, tssCached, tssStart, tssEnd) - if err != nil { - return nil, fmt.Errorf("cannot merge instant series: %w", err) + if hasDuplicateSeries(tssEnd) { + qtChild.Printf("cannot apply instant rollup optimization, since tssEnd contains duplicate series") + return evalAt(qtChild, timestamp, window) } + // Calculate the result + tss := getSumInstantValues(qtChild, tssCached, tssStart, tssEnd) return tss, nil default: qt.Printf("instant rollup optimization isn't implemented for %s()", funcName) @@ -1257,9 +1408,118 @@ func evalInstantRollup(qt *querytracer.Tracer, ec *EvalConfig, funcName string, } } -// mergeInstantValues calculates tssCached + tssStart - tssEnd -func mergeInstantValues(qt *querytracer.Tracer, tssCached, tssStart, tssEnd []*timeseries) ([]*timeseries, error) { - qt = qt.NewChild("merge instant values across series; cached=%d, start=%d, end=%d", len(tssCached), len(tssStart), len(tssEnd)) +func hasDuplicateSeries(tss []*timeseries) bool { + m := make(map[string]struct{}, len(tss)) + bb := bbPool.Get() + defer bbPool.Put(bb) + + for _, ts := range tss { + bb.B = marshalMetricNameSorted(bb.B[:0], &ts.MetricName) + if _, ok := m[string(bb.B)]; ok { + return true + } + m[string(bb.B)] = struct{}{} + } + return false +} + +// isLowerInstantValues verifies that tssA contains lower values than tssB +func isLowerInstantValues(tssA, tssB []*timeseries) bool { + assertInstantValues(tssA) + assertInstantValues(tssB) + + m := make(map[string]*timeseries, len(tssA)) + bb := bbPool.Get() + defer bbPool.Put(bb) + + for _, ts := range tssA { + bb.B = marshalMetricNameSorted(bb.B[:0], &ts.MetricName) + if _, ok := m[string(bb.B)]; ok { + logger.Panicf("BUG: duplicate series found: %s", &ts.MetricName) + } + m[string(bb.B)] = ts + } + + for _, tsB := range tssB { + bb.B = marshalMetricNameSorted(bb.B[:0], &tsB.MetricName) + tsA := m[string(bb.B)] + if tsA != nil && !math.IsNaN(tsA.Values[0]) && !math.IsNaN(tsB.Values[0]) { + if tsA.Values[0] >= tsB.Values[0] { + return false + } + } + } + return true +} + +func getMinInstantValues(qt *querytracer.Tracer, tssCached, tssStart []*timeseries) []*timeseries { + qt = qt.NewChild("calculate the minimum for instant values across series; cached=%d, start=%d", len(tssCached), len(tssStart)) + defer qt.Done() + + getMin := func(a, b float64) float64 { + if a < b { + return a + } + return b + } + tss := getMinMaxInstantValues(tssCached, tssStart, getMin) + qt.Printf("resulting series=%d", len(tss)) + return tss +} + +func getMaxInstantValues(qt *querytracer.Tracer, tssCached, tssStart []*timeseries) []*timeseries { + qt = qt.NewChild("calculate the maximum for instant values across series; cached=%d, start=%d", len(tssCached), len(tssStart)) + defer qt.Done() + + getMax := func(a, b float64) float64 { + if a > b { + return a + } + return b + } + tss := getMinMaxInstantValues(tssCached, tssStart, getMax) + qt.Printf("resulting series=%d", len(tss)) + return tss +} + +func getMinMaxInstantValues(tssCached, tssStart []*timeseries, f func(a, b float64) float64) []*timeseries { + assertInstantValues(tssCached) + assertInstantValues(tssStart) + + m := make(map[string]*timeseries, len(tssCached)) + bb := bbPool.Get() + defer bbPool.Put(bb) + + for _, ts := range tssCached { + bb.B = marshalMetricNameSorted(bb.B[:0], &ts.MetricName) + if _, ok := m[string(bb.B)]; ok { + logger.Panicf("BUG: duplicate series found: %s", &ts.MetricName) + } + m[string(bb.B)] = ts + } + + for _, ts := range tssStart { + bb.B = marshalMetricNameSorted(bb.B[:0], &ts.MetricName) + tsCached := m[string(bb.B)] + if tsCached != nil && !math.IsNaN(tsCached.Values[0]) { + if !math.IsNaN(ts.Values[0]) { + tsCached.Values[0] = f(ts.Values[0], tsCached.Values[0]) + } + } else { + m[string(bb.B)] = ts + } + } + + rvs := make([]*timeseries, 0, len(m)) + for _, ts := range m { + rvs = append(rvs, ts) + } + return rvs +} + +// getSumInstantValues calculates tssCached + tssStart - tssEnd +func getSumInstantValues(qt *querytracer.Tracer, tssCached, tssStart, tssEnd []*timeseries) []*timeseries { + qt = qt.NewChild("calculate the sum for instant values across series; cached=%d, start=%d, end=%d", len(tssCached), len(tssStart), len(tssEnd)) defer qt.Done() assertInstantValues(tssCached) @@ -1272,8 +1532,8 @@ func mergeInstantValues(qt *querytracer.Tracer, tssCached, tssStart, tssEnd []*t for _, ts := range tssCached { bb.B = marshalMetricNameSorted(bb.B[:0], &ts.MetricName) - if tsExisting := m[string(bb.B)]; tsExisting != nil { - return nil, fmt.Errorf("duplicate series found: %s", &ts.MetricName) + if _, ok := m[string(bb.B)]; ok { + logger.Panicf("BUG: duplicate series found: %s", &ts.MetricName) } m[string(bb.B)] = ts } @@ -1305,7 +1565,7 @@ func mergeInstantValues(qt *querytracer.Tracer, tssCached, tssStart, tssEnd []*t rvs = append(rvs, ts) } qt.Printf("resulting series=%d", len(rvs)) - return rvs, nil + return rvs } func assertInstantValues(tss []*timeseries) { diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a7bd0e0c6b..17696e6620 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -34,15 +34,17 @@ The sandbox cluster installation is running under the constant load generated by * SECURITY: upgrade Go builder from Go1.21.1 to Go1.21.4. See [the list of issues addressed in Go1.21.2](https://github.com/golang/go/issues?q=milestone%3AGo1.21.2+label%3ACherryPickApproved), [the list of issues addressed in Go1.21.3](https://github.com/golang/go/issues?q=milestone%3AGo1.21.3+label%3ACherryPickApproved) and [the list of issues addressed in Go1.21.4](https://github.com/golang/go/issues?q=milestone%3AGo1.21.4+label%3ACherryPickApproved). * FEATURE: `vmselect`: improve performance for repeated [instant queries](https://docs.victoriametrics.com/keyConcepts.html#instant-query) if they contain one of the following [rollup functions](https://docs.victoriametrics.com/MetricsQL.html#rollup-functions): - - [avg_over_time](https://docs.victoriametrics.com/MetricsQL.html#avg_over_time) - - [sum_over_time](https://docs.victoriametrics.com/MetricsQL.html#sum_over_time) - - [count_eq_over_time](https://docs.victoriametrics.com/MetricsQL.html#count_eq_over_time) - - [count_gt_over_time](https://docs.victoriametrics.com/MetricsQL.html#count_gt_over_time) - - [count_le_over_time](https://docs.victoriametrics.com/MetricsQL.html#count_le_over_time) - - [count_ne_over_time](https://docs.victoriametrics.com/MetricsQL.html#count_ne_over_time) - - [count_over_time](https://docs.victoriametrics.com/MetricsQL.html#count_over_time) - - [increase](https://docs.victoriametrics.com/MetricsQL.html#increase) - - [rate](https://docs.victoriametrics.com/MetricsQL.html#rate) + - [`avg_over_time`](https://docs.victoriametrics.com/MetricsQL.html#avg_over_time) + - [`sum_over_time`](https://docs.victoriametrics.com/MetricsQL.html#sum_over_time) + - [`count_eq_over_time`](https://docs.victoriametrics.com/MetricsQL.html#count_eq_over_time) + - [`count_gt_over_time`](https://docs.victoriametrics.com/MetricsQL.html#count_gt_over_time) + - [`count_le_over_time`](https://docs.victoriametrics.com/MetricsQL.html#count_le_over_time) + - [`count_ne_over_time`](https://docs.victoriametrics.com/MetricsQL.html#count_ne_over_time) + - [`count_over_time`](https://docs.victoriametrics.com/MetricsQL.html#count_over_time) + - [`increase`](https://docs.victoriametrics.com/MetricsQL.html#increase) + - [`max_over_time`](https://docs.victoriametrics.com/MetricsQL.html#max_over_time) + - [`min_over_time`](https://docs.victoriametrics.com/MetricsQL.html#min_over_time) + - [`rate`](https://docs.victoriametrics.com/MetricsQL.html#rate) The optimization is enabled when these functions contain lookbehind window in square brackets bigger or equal to `6h` (the threshold can be changed via `-search.minWindowForInstantRollupOptimization` command-line flag). The optimization improves performance for SLO/SLI-like queries such as `avg_over_time(up[30d])` or `sum(rate(http_request_errors_total[3d])) / sum(rate(http_requests_total[3d]))`, which can be generated by [sloth](https://github.com/slok/sloth) or similar projects. * FEATURE: `vmselect`: improve query performance on systems with big number of CPU cores (`>=32`). Add `-search.maxWorkersPerQuery` command-line flag, which can be used for fine-tuning query performance on systems with big number of CPU cores. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5195). * FEATURE: `vmselect`: expose `vm_memory_intensive_queries_total` counter metric which gets increased each time `-search.logQueryMemoryUsage` memory limit is exceeded by a query. This metric should help to identify expensive and heavy queries without inspecting the logs. From 230230cf0b9bdcb19f8ae9869651fdbe50f50a81 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sat, 11 Nov 2023 12:30:08 +0100 Subject: [PATCH 23/48] lib/logger: add `-loggerMaxArgLen` command-line flag for fine-tuning the maximum length of logged args --- README.md | 2 ++ app/vmselect/promql/eval.go | 7 ++++++- app/vmselect/promql/rollup_result_cache.go | 11 ++++++----- docs/CHANGELOG.md | 1 + docs/README.md | 2 ++ docs/Single-server-VictoriaMetrics.md | 2 ++ lib/bytesutil/bytesutil.go | 11 ----------- lib/logger/logger.go | 18 +++++------------- lib/storage/search.go | 3 ++- lib/storage/tag_filters.go | 3 ++- lib/stringsutil/stringsutil.go | 16 ++++++++++++++++ 11 files changed, 44 insertions(+), 32 deletions(-) create mode 100644 lib/stringsutil/stringsutil.go diff --git a/README.md b/README.md index 5b2d87c2cc..2a92447b53 100644 --- a/README.md +++ b/README.md @@ -2655,6 +2655,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li Allows renaming fields in JSON formatted logs. Example: "ts:timestamp,msg:message" renames "ts" to "timestamp" and "msg" to "message". Supported fields: ts, level, caller, msg -loggerLevel string Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + -loggerMaxArgLen int + The maximum length of a single logged argument. Longer arguments are replaced with 'arg_start..arg_end', where 'arg_start' and 'arg_end' is prefix and suffix of the arg with the length not exceeding -loggerMaxArgLen / 2 (default 500) -loggerOutput string Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string diff --git a/app/vmselect/promql/eval.go b/app/vmselect/promql/eval.go index 7b53180cc8..dc930117e8 100644 --- a/app/vmselect/promql/eval.go +++ b/app/vmselect/promql/eval.go @@ -23,6 +23,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/memory" "github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/stringsutil" "github.com/VictoriaMetrics/metrics" "github.com/VictoriaMetrics/metricsql" ) @@ -259,7 +260,7 @@ func getTimestamps(start, end, step int64, maxPointsPerSeries int) []int64 { func evalExpr(qt *querytracer.Tracer, ec *EvalConfig, e metricsql.Expr) ([]*timeseries, error) { if qt.Enabled() { query := string(e.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) mayCache := ec.mayCache() qt = qt.NewChild("eval: query=%s, timeRange=%s, step=%d, mayCache=%v", query, ec.timeRangeString(), ec.Step, mayCache) } @@ -1409,6 +1410,10 @@ func evalInstantRollup(qt *querytracer.Tracer, ec *EvalConfig, funcName string, } func hasDuplicateSeries(tss []*timeseries) bool { + if len(tss) <= 1 { + return false + } + m := make(map[string]struct{}, len(tss)) bb := bbPool.Get() defer bbPool.Put(bb) diff --git a/app/vmselect/promql/rollup_result_cache.go b/app/vmselect/promql/rollup_result_cache.go index a90c9d2e6e..f0b98381e8 100644 --- a/app/vmselect/promql/rollup_result_cache.go +++ b/app/vmselect/promql/rollup_result_cache.go @@ -17,6 +17,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/memory" "github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/stringsutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/workingsetcache" "github.com/VictoriaMetrics/fastcache" "github.com/VictoriaMetrics/metrics" @@ -205,7 +206,7 @@ func ResetRollupResultCache() { func (rrc *rollupResultCache) GetInstantValues(qt *querytracer.Tracer, expr metricsql.Expr, window, step int64, etfss [][]storage.TagFilter) []*timeseries { if qt.Enabled() { query := string(expr.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) qt = qt.NewChild("rollup cache get instant values: query=%s, window=%d, step=%d", query, window, step) defer qt.Done() } @@ -227,7 +228,7 @@ func (rrc *rollupResultCache) GetInstantValues(qt *querytracer.Tracer, expr metr func (rrc *rollupResultCache) PutInstantValues(qt *querytracer.Tracer, expr metricsql.Expr, window, step int64, etfss [][]storage.TagFilter, tss []*timeseries) { if qt.Enabled() { query := string(expr.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) startStr := "" if len(tss) > 0 { startStr = storage.TimestampToHumanReadableFormat(tss[0].Timestamps[0]) @@ -260,7 +261,7 @@ func (rrc *rollupResultCache) DeleteInstantValues(qt *querytracer.Tracer, expr m if qt.Enabled() { query := string(expr.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) qt.Printf("rollup result cache delete instant values: query=%s, window=%d, step=%d", query, window, step) } } @@ -268,7 +269,7 @@ func (rrc *rollupResultCache) DeleteInstantValues(qt *querytracer.Tracer, expr m func (rrc *rollupResultCache) GetSeries(qt *querytracer.Tracer, ec *EvalConfig, expr metricsql.Expr, window int64) (tss []*timeseries, newStart int64) { if qt.Enabled() { query := string(expr.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) qt = qt.NewChild("rollup cache get series: query=%s, timeRange=%s, window=%d, step=%d", query, ec.timeRangeString(), window, ec.Step) defer qt.Done() } @@ -353,7 +354,7 @@ var resultBufPool bytesutil.ByteBufferPool func (rrc *rollupResultCache) PutSeries(qt *querytracer.Tracer, ec *EvalConfig, expr metricsql.Expr, window int64, tss []*timeseries) { if qt.Enabled() { query := string(expr.AppendString(nil)) - query = bytesutil.LimitStringLen(query, 300) + query = stringsutil.LimitStringLen(query, 300) qt = qt.NewChild("rollup cache put series: query=%s, timeRange=%s, step=%d, window=%d, series=%d", query, ec.timeRangeString(), ec.Step, window, len(tss)) defer qt.Done() } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 17696e6620..fe3b2f2e9f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -81,6 +81,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: all: track requests with wrong auth key and wrong basic auth at `vm_http_request_errors_total` [metric](https://docs.victoriametrics.com/#monitoring) with `reason="wrong_auth_key"` and `reason="wrong_basic_auth"`. See [this issue](https://github.com/victoriaMetrics/victoriaMetrics/issues/4590). Thanks to @venkatbvc for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5166). * FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which allows to disable TLS verification for backend connection. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). * FEATURE: `vmstorage`: add `-blockcache.missesBeforeCaching` command-line flag, which can be used for fine-tuning RAM usage for `indexdb/dataBlocks` cache when queries touching big number of time series are executed. +* FEATURE: add `-loggerMaxArgLen` command-line flag for fine-tuning the maximum lengths of logged args. * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): strip sensitive information such as auth headers or passwords from datasource, remote-read, remote-write or notifier URLs in log messages or UI. This behavior is by default and is controlled via `-datasource.showURL`, `-remoteRead.showURL`, `remoteWrite.showURL` or `-notifier.showURL` cmd-line flags. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5044). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): fix vmalert web UI when running on 32-bit architectures machine. diff --git a/docs/README.md b/docs/README.md index 3432fda58d..1f57c0436c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2658,6 +2658,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li Allows renaming fields in JSON formatted logs. Example: "ts:timestamp,msg:message" renames "ts" to "timestamp" and "msg" to "message". Supported fields: ts, level, caller, msg -loggerLevel string Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + -loggerMaxArgLen int + The maximum length of a single logged argument. Longer arguments are replaced with 'arg_start..arg_end', where 'arg_start' and 'arg_end' is prefix and suffix of the arg with the length not exceeding -loggerMaxArgLen / 2 (default 500) -loggerOutput string Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index 9e16d636b3..5e63299fec 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -2666,6 +2666,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li Allows renaming fields in JSON formatted logs. Example: "ts:timestamp,msg:message" renames "ts" to "timestamp" and "msg" to "message". Supported fields: ts, level, caller, msg -loggerLevel string Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + -loggerMaxArgLen int + The maximum length of a single logged argument. Longer arguments are replaced with 'arg_start..arg_end', where 'arg_start' and 'arg_end' is prefix and suffix of the arg with the length not exceeding -loggerMaxArgLen / 2 (default 500) -loggerOutput string Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string diff --git a/lib/bytesutil/bytesutil.go b/lib/bytesutil/bytesutil.go index 8d9d1c5607..daa01232d5 100644 --- a/lib/bytesutil/bytesutil.go +++ b/lib/bytesutil/bytesutil.go @@ -79,14 +79,3 @@ func ToUnsafeBytes(s string) (b []byte) { slh.Cap = sh.Len return b } - -// LimitStringLen limits the length of s to maxLen. -// -// If len(s) > maxLen, then the function concatenates s prefix with s suffix. -func LimitStringLen(s string, maxLen int) string { - if maxLen <= 4 || len(s) <= maxLen { - return s - } - n := maxLen/2 - 1 - return s[:n] + ".." + s[len(s)-n:] -} diff --git a/lib/logger/logger.go b/lib/logger/logger.go index e5d93660dd..1575e25c37 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -13,6 +13,7 @@ import ( "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/buildinfo" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/stringsutil" "github.com/VictoriaMetrics/metrics" ) @@ -23,6 +24,8 @@ var ( loggerTimezone = flag.String("loggerTimezone", "UTC", "Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. "+ "For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local") disableTimestamps = flag.Bool("loggerDisableTimestamps", false, "Whether to disable writing timestamps in logs") + maxLogArgLen = flag.Int("loggerMaxArgLen", 500, "The maximum length of a single logged argument. Longer arguments are replaced with 'arg_start..arg_end', "+ + "where 'arg_start' and 'arg_end' is prefix and suffix of the arg with the length not exceeding -loggerMaxArgLen / 2") errorsPerSecondLimit = flag.Int("loggerErrorsPerSecondLimit", 0, `Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit`) warnsPerSecondLimit = flag.Int("loggerWarnsPerSecondLimit", 0, `Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit`) @@ -134,7 +137,7 @@ func logLevelSkipframes(skipframes int, level, format string, args []interface{} if shouldSkipLog(level) { return } - msg := formatLogMessage(500, format, args) + msg := formatLogMessage(*maxLogArgLen, format, args) logMessage(level, msg, 3+skipframes) } @@ -149,23 +152,12 @@ func formatLogMessage(maxArgLen int, format string, args []interface{}) string { x = x[n+1:] if strings.HasPrefix(x, "s") || strings.HasPrefix(x, "q") { s := fmt.Sprintf("%s", args[i]) - args[i] = limitStringLength(maxArgLen, s) + args[i] = stringsutil.LimitStringLen(s, maxArgLen) } } return fmt.Sprintf(format, args...) } -func limitStringLength(maxLen int, s string) string { - if len(s) <= maxLen { - return s - } - n := (maxLen / 2) - 1 - if n < 0 { - n = 0 - } - return s[:n] + ".." + s[len(s)-n:] -} - func logLimiterCleaner() { for { time.Sleep(time.Second) diff --git a/lib/storage/search.go b/lib/storage/search.go index f5b4ab7f89..9c33cbf683 100644 --- a/lib/storage/search.go +++ b/lib/storage/search.go @@ -10,6 +10,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/fasttime" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/stringsutil" ) // BlockRef references a Block. @@ -277,7 +278,7 @@ type TagFilter struct { // String returns string representation of tf. func (tf *TagFilter) String() string { op := tf.getOp() - value := bytesutil.LimitStringLen(string(tf.Value), 60) + value := stringsutil.LimitStringLen(string(tf.Value), 60) if len(tf.Key) == 0 { return fmt.Sprintf("__name__%s%q", op, value) } diff --git a/lib/storage/tag_filters.go b/lib/storage/tag_filters.go index bc74925901..3ef0acc615 100644 --- a/lib/storage/tag_filters.go +++ b/lib/storage/tag_filters.go @@ -16,6 +16,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/lrucache" "github.com/VictoriaMetrics/VictoriaMetrics/lib/memory" "github.com/VictoriaMetrics/VictoriaMetrics/lib/regexutil" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/stringsutil" ) // convertToCompositeTagFilterss converts tfss to composite filters. @@ -293,7 +294,7 @@ func (tf *tagFilter) Less(other *tagFilter) bool { // String returns human-readable tf value. func (tf *tagFilter) String() string { op := tf.getOp() - value := bytesutil.LimitStringLen(string(tf.value), 60) + value := stringsutil.LimitStringLen(string(tf.value), 60) if bytes.Equal(tf.key, graphiteReverseTagKey) { return fmt.Sprintf("__graphite_reverse__%s%q", op, value) } diff --git a/lib/stringsutil/stringsutil.go b/lib/stringsutil/stringsutil.go new file mode 100644 index 0000000000..cd5754cfd1 --- /dev/null +++ b/lib/stringsutil/stringsutil.go @@ -0,0 +1,16 @@ +package stringsutil + +// LimitStringLen limits the length of s with maxLen. +// +// If len(s) > maxLen, then s is replaced with "s_prefix..s_suffix", +// so the total length of the returned string doesn't exceed maxLen. +func LimitStringLen(s string, maxLen int) string { + if len(s) <= maxLen || maxLen <= 4 { + return s + } + n := (maxLen / 2) - 1 + if n < 0 { + n = 0 + } + return s[:n] + ".." + s[len(s)-n:] +} From 0df8489e0a6d03b94ae1facfecbc88fefd20e53a Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sat, 11 Nov 2023 12:31:32 +0100 Subject: [PATCH 24/48] app/vmagent/README.md: sync with docs/vmagent.md after 930d26b2ffe3a566329b6362ffd66f92857a22e2 --- app/vmagent/README.md | 48 +++++++++++++++++++++---------------------- docs/vmagent.md | 48 +++++++++++++++++++++---------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/app/vmagent/README.md b/app/vmagent/README.md index c2c3cd1421..a1804825e3 100644 --- a/app/vmagent/README.md +++ b/app/vmagent/README.md @@ -60,7 +60,7 @@ and sending the data to the Prometheus-compatible remote storage: Example command for writing the data received via [supported push-based protocols](#how-to-push-data-to-vmagent) to [single-node VictoriaMetrics](https://docs.victoriametrics.com/) located at `victoria-metrics-host:8428`: -```console +```bash /path/to/vmagent -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -69,7 +69,7 @@ the data to [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-V Example command for scraping Prometheus targets and writing the data to single-node VictoriaMetrics: -```console +```bash /path/to/vmagent -promscrape.config=/path/to/prometheus.yml -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -110,7 +110,7 @@ additionally to pull-based Prometheus-compatible targets' scraping: * Sending `SIGHUP` signal to `vmagent` process: - ```console + ```bash kill -SIGHUP `pidof vmagent` ``` @@ -325,7 +325,7 @@ in the `scrape_config_files` section of `-promscrape.config` file. For example, loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: -```yml +```yaml scrape_config_files: - configs/*.yml - single_scrape_config.yml @@ -335,7 +335,7 @@ scrape_config_files: Every referred file can contain arbitrary number of [supported scrape configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs). There is no need in specifying top-level `scrape_configs` section in these files. For example: -```yml +```yaml - job_name: foo static_configs: - targets: ["vmagent:8429"] @@ -375,7 +375,7 @@ Extra labels can be added to metrics collected by `vmagent` via the following me For example, the following command starts `vmagent`, which adds `{datacenter="foobar"}` label to all the metrics pushed to all the configured remote storage systems (all the `-remoteWrite.url` flag values): - ``` + ```bash /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` @@ -740,7 +740,7 @@ stream parsing mode can be explicitly enabled in the following places: Examples: -```yml +```yaml scrape_configs: - job_name: 'big-federate' stream_parse: true @@ -767,7 +767,7 @@ Each `vmagent` instance in the cluster must use identical `-promscrape.config` f in the range `0 ... N-1`, where `N` is the number of `vmagent` instances in the cluster specified via `-promscrape.cluster.membersCount`. For example, the following commands spread scrape targets among a cluster of two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... ``` @@ -779,7 +779,7 @@ By default, each scrape target is scraped only by a single `vmagent` instance in then `-promscrape.cluster.replicationFactor` command-line flag must be set to the desired number of replicas. For example, the following commands start a cluster of three `vmagent` instances, where each target is scraped by two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=2 -promscrape.config=/path/to/config.yml ... @@ -793,7 +793,7 @@ The `-promscrape.cluster.memberLabel` command-line flag allows specifying a name The value of the `member num` label is set to `-promscrape.cluster.memberNum`. For example, the following config instructs adding `vmagent_instance="0"` label to all the metrics scraped by the given `vmagent` instance: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.cluster.memberLabel=vmagent_instance ``` @@ -820,7 +820,7 @@ See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2679) `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs target scraping via https proxy at `https://proxy-addr:1234`: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -837,7 +837,7 @@ Proxy can be configured with the following optional settings: For example: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -987,7 +987,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at the beginning of some interval, then `scrape_align_interval` option must be used. For example, the following config aligns hourly scrapes to the beginning of hour: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1h @@ -997,7 +997,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at specific offset, then `scrape_offset` option must be used. For example, the following config instructs `vmagent` to scrape the target at 10 seconds of every minute: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1m @@ -1010,14 +1010,14 @@ If you have suggestions for improvements or have found a bug - please open an is The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: - ```yml + ```yaml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: - ```yml + ```yaml - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true @@ -1061,7 +1061,7 @@ For example, `-kafka.consumer.topic.brokers=host1:9092;host2:9092`. The following command starts `vmagent`, which reads metrics in InfluxDB line protocol format from Kafka broker at `localhost:9092` from the topic `metrics-by-telegraf` and sends them to remote storage at `http://localhost:8428/api/v1/write`: -```console +```bash ./bin/vmagent -remoteWrite.url=http://localhost:8428/api/v1/write \ -kafka.consumer.topic.brokers=localhost:9092 \ -kafka.consumer.topic.format=influx \ @@ -1084,7 +1084,7 @@ These command-line flags are available only in [enterprise](https://docs.victori which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/latest) page (see `vmutils-...-enterprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. -``` +```text -kafka.consumer.topic array Kafka topic names for data consumption. Supports an array of values separated by comma or specified via multiple flags. @@ -1129,13 +1129,13 @@ Two types of auth are supported: * sasl with username and password: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SASL_SSL&sasl.mechanisms=PLAIN -remoteWrite.basicAuth.username=user -remoteWrite.basicAuth.password=password ``` * tls certificates: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` @@ -1166,7 +1166,7 @@ The `` may be manually set via `PKG_TAG=foobar make package-vmagent`. The base docker image is [alpine](https://hub.docker.com/_/alpine) but it is possible to use any other base image by setting it via `` environment variable. For example, the following command builds the image on top of [scratch](https://hub.docker.com/_/scratch) image: -```console +```bash ROOT_IMAGE=scratch make package-vmagent ``` @@ -1194,7 +1194,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b
-```console +```bash curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof ``` @@ -1204,7 +1204,7 @@ curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof
-```console +```bash curl http://0.0.0.0:8429/debug/pprof/profile > cpu.pprof ``` @@ -1220,7 +1220,7 @@ It is safe sharing the collected profiles from security point of view, since the `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their descriptions and default values: -``` +```text ./vmagent -help vmagent collects metrics data via popular data ingestion protocols and routes them to VictoriaMetrics. diff --git a/docs/vmagent.md b/docs/vmagent.md index d6ae0b1d7b..3a71b0695b 100644 --- a/docs/vmagent.md +++ b/docs/vmagent.md @@ -71,7 +71,7 @@ and sending the data to the Prometheus-compatible remote storage: Example command for writing the data received via [supported push-based protocols](#how-to-push-data-to-vmagent) to [single-node VictoriaMetrics](https://docs.victoriametrics.com/) located at `victoria-metrics-host:8428`: -```console +```bash /path/to/vmagent -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -80,7 +80,7 @@ the data to [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-V Example command for scraping Prometheus targets and writing the data to single-node VictoriaMetrics: -```console +```bash /path/to/vmagent -promscrape.config=/path/to/prometheus.yml -remoteWrite.url=https://victoria-metrics-host:8428/api/v1/write ``` @@ -121,7 +121,7 @@ additionally to pull-based Prometheus-compatible targets' scraping: * Sending `SIGHUP` signal to `vmagent` process: - ```console + ```bash kill -SIGHUP `pidof vmagent` ``` @@ -336,7 +336,7 @@ in the `scrape_config_files` section of `-promscrape.config` file. For example, loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: -```yml +```yaml scrape_config_files: - configs/*.yml - single_scrape_config.yml @@ -346,7 +346,7 @@ scrape_config_files: Every referred file can contain arbitrary number of [supported scrape configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs). There is no need in specifying top-level `scrape_configs` section in these files. For example: -```yml +```yaml - job_name: foo static_configs: - targets: ["vmagent:8429"] @@ -386,7 +386,7 @@ Extra labels can be added to metrics collected by `vmagent` via the following me For example, the following command starts `vmagent`, which adds `{datacenter="foobar"}` label to all the metrics pushed to all the configured remote storage systems (all the `-remoteWrite.url` flag values): - ``` + ```bash /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` @@ -751,7 +751,7 @@ stream parsing mode can be explicitly enabled in the following places: Examples: -```yml +```yaml scrape_configs: - job_name: 'big-federate' stream_parse: true @@ -778,7 +778,7 @@ Each `vmagent` instance in the cluster must use identical `-promscrape.config` f in the range `0 ... N-1`, where `N` is the number of `vmagent` instances in the cluster specified via `-promscrape.cluster.membersCount`. For example, the following commands spread scrape targets among a cluster of two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... ``` @@ -790,7 +790,7 @@ By default, each scrape target is scraped only by a single `vmagent` instance in then `-promscrape.cluster.replicationFactor` command-line flag must be set to the desired number of replicas. For example, the following commands start a cluster of three `vmagent` instances, where each target is scraped by two `vmagent` instances: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ... /path/to/vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=2 -promscrape.config=/path/to/config.yml ... @@ -804,7 +804,7 @@ The `-promscrape.cluster.memberLabel` command-line flag allows specifying a name The value of the `member num` label is set to `-promscrape.cluster.memberNum`. For example, the following config instructs adding `vmagent_instance="0"` label to all the metrics scraped by the given `vmagent` instance: -``` +```text /path/to/vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.cluster.memberLabel=vmagent_instance ``` @@ -831,7 +831,7 @@ See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2679) `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs target scraping via https proxy at `https://proxy-addr:1234`: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -848,7 +848,7 @@ Proxy can be configured with the following optional settings: For example: -```yml +```yaml scrape_configs: - job_name: foo proxy_url: https://proxy-addr:1234 @@ -998,7 +998,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at the beginning of some interval, then `scrape_align_interval` option must be used. For example, the following config aligns hourly scrapes to the beginning of hour: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1h @@ -1008,7 +1008,7 @@ If you have suggestions for improvements or have found a bug - please open an is * By default `vmagent` evenly spreads scrape load in time. If a particular scrape target must be scraped at specific offset, then `scrape_offset` option must be used. For example, the following config instructs `vmagent` to scrape the target at 10 seconds of every minute: - ```yml + ```yaml scrape_configs: - job_name: foo scrape_interval: 1m @@ -1021,14 +1021,14 @@ If you have suggestions for improvements or have found a bug - please open an is The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: - ```yml + ```yaml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: - ```yml + ```yaml - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true @@ -1072,7 +1072,7 @@ For example, `-kafka.consumer.topic.brokers=host1:9092;host2:9092`. The following command starts `vmagent`, which reads metrics in InfluxDB line protocol format from Kafka broker at `localhost:9092` from the topic `metrics-by-telegraf` and sends them to remote storage at `http://localhost:8428/api/v1/write`: -```console +```bash ./bin/vmagent -remoteWrite.url=http://localhost:8428/api/v1/write \ -kafka.consumer.topic.brokers=localhost:9092 \ -kafka.consumer.topic.format=influx \ @@ -1095,7 +1095,7 @@ These command-line flags are available only in [enterprise](https://docs.victori which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/latest) page (see `vmutils-...-enterprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. -``` +```text -kafka.consumer.topic array Kafka topic names for data consumption. Supports an array of values separated by comma or specified via multiple flags. @@ -1140,13 +1140,13 @@ Two types of auth are supported: * sasl with username and password: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SASL_SSL&sasl.mechanisms=PLAIN -remoteWrite.basicAuth.username=user -remoteWrite.basicAuth.password=password ``` * tls certificates: -```console +```bash ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` @@ -1177,7 +1177,7 @@ The `` may be manually set via `PKG_TAG=foobar make package-vmagent`. The base docker image is [alpine](https://hub.docker.com/_/alpine) but it is possible to use any other base image by setting it via `` environment variable. For example, the following command builds the image on top of [scratch](https://hub.docker.com/_/scratch) image: -```console +```bash ROOT_IMAGE=scratch make package-vmagent ``` @@ -1205,7 +1205,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b
-```console +```bash curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof ``` @@ -1215,7 +1215,7 @@ curl http://0.0.0.0:8429/debug/pprof/heap > mem.pprof
-```console +```bash curl http://0.0.0.0:8429/debug/pprof/profile > cpu.pprof ``` @@ -1231,7 +1231,7 @@ It is safe sharing the collected profiles from security point of view, since the `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their descriptions and default values: -``` +```text ./vmagent -help vmagent collects metrics data via popular data ingestion protocols and routes them to VictoriaMetrics. From bfec8a375174f6d7f9a70dad79e60addab9980d3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sat, 11 Nov 2023 12:46:57 +0100 Subject: [PATCH 25/48] app/vmauth: improve docs a bit after 323f3720ed33a834ce32c2a6b95101aad2e5042c Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240 --- app/vmauth/README.md | 7 +++---- app/vmauth/example_config.yml | 9 +++++++++ docs/CHANGELOG.md | 2 +- docs/vmauth.md | 7 +++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/vmauth/README.md b/app/vmauth/README.md index 5d5a1e8752..cfaeaf44d9 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -182,12 +182,12 @@ users: url_prefix: "http://localhost:8428?extra_label=team=dev" # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) - # are proxied to http://localhost:8428 with extra_label=team=dev query arg. - # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query?extra_label=team=dev + # are proxied to https://localhost:8428. + # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query # TLS verification is skipped for https://localhost. - username: "local-single-node-with-tls" password: "***" - url_prefix: "https://localhost?extra_label=team=test" + url_prefix: "https://localhost" tls_insecure_skip_verify: true # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) @@ -266,7 +266,6 @@ unauthorized_user: - http://vmselect-az1/?deny_partial_response=1 - http://vmselect-az2/?deny_partial_response=1 retry_status_codes: [503, 500] - tls_insecure_skip_verify: true ip_filters: allow_list: ["1.2.3.0/24", "127.0.0.1"] diff --git a/app/vmauth/example_config.yml b/app/vmauth/example_config.yml index 023adb9918..55d9d4d20c 100644 --- a/app/vmauth/example_config.yml +++ b/app/vmauth/example_config.yml @@ -42,6 +42,15 @@ users: password: "***" url_prefix: "http://localhost:8428?extra_label=team=dev" + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) + # are proxied to https://localhost:8428 + # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query + # TLS verification is ignored for https://localhost. +- username: "local-single-node-with-tls" + password: "***" + url_prefix: "https://localhost" + tls_insecure_skip_verify: true + # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) # are load-balanced among http://vmselect1:8481/select/123/prometheus and http://vmselect2:8481/select/123/prometheus # For example, http://vmauth:8427/api/v1/query is proxied to the following urls in a round-robin manner: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index fe3b2f2e9f..b2012f6ff0 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -79,7 +79,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert-tool](https://docs.victoriametrics.com/#vmalert-tool): add `unittest` command to run unittest for alerting and recording rules. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4789) for details. * FEATURE: dashboards/vmalert: add new panel `Missed evaluations` for indicating alerting groups that miss their evaluations. * FEATURE: all: track requests with wrong auth key and wrong basic auth at `vm_http_request_errors_total` [metric](https://docs.victoriametrics.com/#monitoring) with `reason="wrong_auth_key"` and `reason="wrong_basic_auth"`. See [this issue](https://github.com/victoriaMetrics/victoriaMetrics/issues/4590). Thanks to @venkatbvc for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5166). -* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which allows to disable TLS verification for backend connection. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). +* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which can be set on a per-user level to disable TLS verification for backend connections. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). * FEATURE: `vmstorage`: add `-blockcache.missesBeforeCaching` command-line flag, which can be used for fine-tuning RAM usage for `indexdb/dataBlocks` cache when queries touching big number of time series are executed. * FEATURE: add `-loggerMaxArgLen` command-line flag for fine-tuning the maximum lengths of logged args. diff --git a/docs/vmauth.md b/docs/vmauth.md index ade90019c6..a156742b8c 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -193,12 +193,12 @@ users: url_prefix: "http://localhost:8428?extra_label=team=dev" # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) - # are proxied to http://localhost:8428 with extra_label=team=dev query arg. - # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query?extra_label=team=dev + # are proxied to https://localhost:8428. + # For example, http://vmauth:8427/api/v1/query is routed to https://localhost/api/v1/query # TLS verification is skipped for https://localhost. - username: "local-single-node-with-tls" password: "***" - url_prefix: "https://localhost?extra_label=team=test" + url_prefix: "https://localhost" tls_insecure_skip_verify: true # All the requests to http://vmauth:8427 with the given Basic Auth (username:password) @@ -277,7 +277,6 @@ unauthorized_user: - http://vmselect-az1/?deny_partial_response=1 - http://vmselect-az2/?deny_partial_response=1 retry_status_codes: [503, 500] - tls_insecure_skip_verify: true ip_filters: allow_list: ["1.2.3.0/24", "127.0.0.1"] From ec72b750f210045f12e0c4f474be3009f15dd9b2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 08:05:16 +0100 Subject: [PATCH 26/48] docs/Articles.md: typo fix --- docs/Articles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Articles.md b/docs/Articles.md index bdb8591e4d..2012882d89 100644 --- a/docs/Articles.md +++ b/docs/Articles.md @@ -17,7 +17,7 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). ## Third-party articles and slides about VictoriaMetrics * [Datanami: Why Roblox Picked VictoriaMetrics for Observability Data Overhaul](https://www.datanami.com/2023/05/30/why-roblox-picked-victoriametrics-for-observability-data-overhaul/) -* [Cludflare: Introducing notifications for HTTP Traffic Anomalies](https://blog.cloudflare.com/introducing-http-traffic-anomalies-notifications/) +* [Cloudflare: Introducing notifications for HTTP Traffic Anomalies](https://blog.cloudflare.com/introducing-http-traffic-anomalies-notifications/) * [Grammarly: Better, Faster, Cheaper: How Grammarly Improved Monitoring by Over 10x with VictoriaMetrics](https://www.grammarly.com/blog/engineering/monitoring-with-victoriametrics/) * [CERN: CMS monitoring R&D: Real-time monitoring and alerts](https://indico.cern.ch/event/877333/contributions/3696707/attachments/1972189/3281133/CMS_mon_RD_for_opInt.pdf) * [CERN: The CMS monitoring infrastructure and applications](https://arxiv.org/pdf/2007.03630.pdf) From 61594d2bd85cf7bb66f24f36d28cff47db55ee5b Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 08:23:35 +0100 Subject: [PATCH 27/48] app/vmauth: follow-up for 323f3720ed33a834ce32c2a6b95101aad2e5042c - Re-use identically configured http.Transport across multiple users. This fixes handling of the limit on the number of connection, which can be established per each backend via -maxIdleConnsPerBackend command-line flag. This limit stopped working after 323f3720ed33a834ce32c2a6b95101aad2e5042c - Add docs about backend TLS setup at https://docs.victoriametrics.com/vmauth.html#backend-tls-setup - Add ability to disable backend TLS verification for all the users via -backend.tlsInsecureSkipVerify command-line flag. This flag may be useful when -auth.config contains big number of users, and every user must disable backend TLS verification. - Add ability to specify TLS Root CA via tls_ca_file option at per-user basis and via -backend.tlsCAFile command-line flag across all the users. Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240 --- app/vmauth/README.md | 25 ++++++++++++ app/vmauth/auth_config.go | 15 +++++-- app/vmauth/auth_config_test.go | 17 ++++++-- app/vmauth/main.go | 74 +++++++++++++++++++++++++++++++--- docs/CHANGELOG.md | 2 +- docs/vmauth.md | 25 ++++++++++++ 6 files changed, 145 insertions(+), 13 deletions(-) diff --git a/app/vmauth/README.md b/app/vmauth/README.md index cfaeaf44d9..96e656ba2f 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -101,6 +101,31 @@ The following [metrics](#monitoring) related to concurrency limits are exposed b - `vmauth_unauthorized_user_concurrent_requests_limit_reached_total` - the number of requests rejected with `429 Too Many Requests` error because of the concurrency limit has been reached for unauthorized users (if `unauthorized_user` section is used). +## Backend TLS setup + +By default `vmauth` uses system settings when performing requests to HTTPS backends specified via `url_prefix` option +in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config). These settings can be overridden with the following command-line flags: + +- `backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. + This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) + via `tls_insecure_skip_verify` option. For example: + + ```yml + - username: "foo" + url_prefix: "https://localhost" + tls_insecure_skip_verify: true + ``` + +- `backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. + The `backend.tlsCAFile` may point either to local file or to `http` / `https` url. + This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) + via `tls_ca_file` option. For example: + + ```yml + - username: "foo" + url_prefix: "https://localhost" + tls_ca_file: "/path/to/tls/root/ca" + ``` ## IP filters diff --git a/app/vmauth/auth_config.go b/app/vmauth/auth_config.go index 7c96ea66ed..3b11f2c6c0 100644 --- a/app/vmauth/auth_config.go +++ b/app/vmauth/auth_config.go @@ -50,7 +50,8 @@ type UserInfo struct { MaxConcurrentRequests int `yaml:"max_concurrent_requests,omitempty"` DefaultURL *URLPrefix `yaml:"default_url,omitempty"` RetryStatusCodes []int `yaml:"retry_status_codes,omitempty"` - TLSInsecureSkipVerify bool `yaml:"tls_insecure_skip_verify,omitempty"` + TLSInsecureSkipVerify *bool `yaml:"tls_insecure_skip_verify,omitempty"` + TLSCAFile string `yaml:"tls_ca_file,omitempty"` concurrencyLimitCh chan struct{} concurrencyLimitReached *metrics.Counter @@ -447,7 +448,11 @@ func parseAuthConfig(data []byte) (*AuthConfig, error) { _ = metrics.GetOrCreateGauge(`vmauth_unauthorized_user_concurrent_requests_current`, func() float64 { return float64(len(ui.concurrencyLimitCh)) }) - ui.httpTransport = getTransport(ui.TLSInsecureSkipVerify) + tr, err := getTransport(ui.TLSInsecureSkipVerify, ui.TLSCAFile) + if err != nil { + return nil, fmt.Errorf("cannot initialize HTTP transport: %w", err) + } + ui.httpTransport = tr } return &ac, nil } @@ -518,7 +523,11 @@ func parseAuthConfigUsers(ac *AuthConfig) (map[string]*UserInfo, error) { _ = metrics.GetOrCreateGauge(fmt.Sprintf(`vmauth_user_concurrent_requests_current{username=%q}`, name), func() float64 { return float64(len(ui.concurrencyLimitCh)) }) - ui.httpTransport = getTransport(ui.TLSInsecureSkipVerify) + tr, err := getTransport(ui.TLSInsecureSkipVerify, ui.TLSCAFile) + if err != nil { + return nil, fmt.Errorf("cannot initialize HTTP transport: %w", err) + } + ui.httpTransport = tr byAuthToken[at1] = ui byAuthToken[at2] = ui diff --git a/app/vmauth/auth_config_test.go b/app/vmauth/auth_config_test.go index bf9902e2be..8f24b60304 100644 --- a/app/vmauth/auth_config_test.go +++ b/app/vmauth/auth_config_test.go @@ -221,6 +221,7 @@ func TestParseAuthConfigSuccess(t *testing.T) { } // Single user + insecureSkipVerifyTrue := true f(` users: - username: foo @@ -234,11 +235,12 @@ users: Password: "bar", URLPrefix: mustParseURL("http://aaa:343/bbb"), MaxConcurrentRequests: 5, - TLSInsecureSkipVerify: true, + TLSInsecureSkipVerify: &insecureSkipVerifyTrue, }, }) // Multiple url_prefix entries + insecureSkipVerifyFalse := false f(` users: - username: foo @@ -246,6 +248,7 @@ users: url_prefix: - http://node1:343/bbb - http://node2:343/bbb + tls_insecure_skip_verify: false `, map[string]*UserInfo{ getAuthToken("", "foo", "bar"): { Username: "foo", @@ -254,6 +257,7 @@ users: "http://node1:343/bbb", "http://node2:343/bbb", }), + TLSInsecureSkipVerify: &insecureSkipVerifyFalse, }, }) @@ -475,15 +479,20 @@ unauthorized_user: } ui := m[getAuthToken("", "foo", "bar")] - if ui.TLSInsecureSkipVerify != true || ui.httpTransport.TLSClientConfig.InsecureSkipVerify != true { + if !isSetBool(ui.TLSInsecureSkipVerify, true) || !ui.httpTransport.TLSClientConfig.InsecureSkipVerify { t.Fatalf("unexpected TLSInsecureSkipVerify value for user foo") } - if ac.UnauthorizedUser.TLSInsecureSkipVerify != false || - ac.UnauthorizedUser.httpTransport.TLSClientConfig.InsecureSkipVerify != false { + if !isSetBool(ac.UnauthorizedUser.TLSInsecureSkipVerify, false) || ac.UnauthorizedUser.httpTransport.TLSClientConfig.InsecureSkipVerify { t.Fatalf("unexpected TLSInsecureSkipVerify value for unauthorized_user") } +} +func isSetBool(boolP *bool, expectedValue bool) bool { + if boolP == nil { + return false + } + return *boolP == expectedValue } func getSrcPaths(paths []string) []*SrcPath { diff --git a/app/vmauth/main.go b/app/vmauth/main.go index 3d3a94c21d..75bd8a4cb0 100644 --- a/app/vmauth/main.go +++ b/app/vmauth/main.go @@ -3,6 +3,7 @@ package main import ( "context" "crypto/tls" + "crypto/x509" "errors" "flag" "fmt" @@ -20,8 +21,10 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/buildinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding" "github.com/VictoriaMetrics/VictoriaMetrics/lib/envflag" "github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/netutil" @@ -48,6 +51,10 @@ var ( failTimeout = flag.Duration("failTimeout", 3*time.Second, "Sets a delay period for load balancing to skip a malfunctioning backend") maxRequestBodySizeToRetry = flagutil.NewBytes("maxRequestBodySizeToRetry", 16*1024, "The maximum request body size, which can be cached and re-tried at other backends. "+ "Bigger values may require more memory") + backendTLSInsecureSkipVerify = flag.Bool("backend.tlsInsecureSkipVerify", false, "Whether to skip TLS verification when connecting to backends over HTTPS. "+ + "See https://docs.victoriametrics.com/vmauth.html#backend-tls-setup") + backendTLSCAFile = flag.String("backend.TLSCAFile", "", "Optional path to TLS root CA file, which is used for TLS verification when connecting to backends over HTTPS. "+ + "See https://docs.victoriametrics.com/vmauth.html#backend-tls-setup") ) func main() { @@ -354,7 +361,48 @@ var ( missingRouteRequests = metrics.NewCounter(`vmauth_http_request_errors_total{reason="missing_route"}`) ) -func getTransport(skipTLSVerification bool) *http.Transport { +func getTransport(insecureSkipVerifyP *bool, caFile string) (*http.Transport, error) { + if insecureSkipVerifyP == nil { + insecureSkipVerifyP = backendTLSInsecureSkipVerify + } + insecureSkipVerify := *insecureSkipVerifyP + if caFile == "" { + caFile = *backendTLSCAFile + } + + bb := bbPool.Get() + defer bbPool.Put(bb) + + bb.B = appendTransportKey(bb.B[:0], insecureSkipVerify, caFile) + + transportMapLock.Lock() + defer transportMapLock.Unlock() + + tr := transportMap[string(bb.B)] + if tr == nil { + trLocal, err := newTransport(insecureSkipVerify, caFile) + if err != nil { + return nil, err + } + transportMap[string(bb.B)] = trLocal + tr = trLocal + } + + return tr, nil +} + +var transportMap = make(map[string]*http.Transport) +var transportMapLock sync.Mutex + +func appendTransportKey(dst []byte, insecureSkipVerify bool, caFile string) []byte { + dst = encoding.MarshalBool(dst, insecureSkipVerify) + dst = encoding.MarshalBytes(dst, bytesutil.ToUnsafeBytes(caFile)) + return dst +} + +var bbPool bytesutil.ByteBufferPool + +func newTransport(insecureSkipVerify bool, caFile string) (*http.Transport, error) { tr := http.DefaultTransport.(*http.Transport).Clone() tr.ResponseHeaderTimeout = *responseTimeout // Automatic compression must be disabled in order to fix https://github.com/VictoriaMetrics/VictoriaMetrics/issues/535 @@ -365,11 +413,27 @@ func getTransport(skipTLSVerification bool) *http.Transport { if tr.MaxIdleConns != 0 && tr.MaxIdleConns < tr.MaxIdleConnsPerHost { tr.MaxIdleConns = tr.MaxIdleConnsPerHost } - if tr.TLSClientConfig == nil { - tr.TLSClientConfig = &tls.Config{} + tlsCfg := tr.TLSClientConfig + if tlsCfg == nil { + tlsCfg = &tls.Config{} + tr.TLSClientConfig = tlsCfg } - tr.TLSClientConfig.InsecureSkipVerify = skipTLSVerification - return tr + if insecureSkipVerify || caFile != "" { + tlsCfg.ClientSessionCache = tls.NewLRUClientSessionCache(0) + tlsCfg.InsecureSkipVerify = insecureSkipVerify + if caFile != "" { + data, err := fs.ReadFileOrHTTP(caFile) + if err != nil { + return nil, fmt.Errorf("cannot read tls_ca_file: %w", err) + } + rootCA := x509.NewCertPool() + if !rootCA.AppendCertsFromPEM(data) { + return nil, fmt.Errorf("cannot parse data read from tls_ca_file %q", caFile) + } + tlsCfg.RootCAs = rootCA + } + } + return tr, nil } var ( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b2012f6ff0..c25373d120 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -79,7 +79,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert-tool](https://docs.victoriametrics.com/#vmalert-tool): add `unittest` command to run unittest for alerting and recording rules. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4789) for details. * FEATURE: dashboards/vmalert: add new panel `Missed evaluations` for indicating alerting groups that miss their evaluations. * FEATURE: all: track requests with wrong auth key and wrong basic auth at `vm_http_request_errors_total` [metric](https://docs.victoriametrics.com/#monitoring) with `reason="wrong_auth_key"` and `reason="wrong_basic_auth"`. See [this issue](https://github.com/victoriaMetrics/victoriaMetrics/issues/4590). Thanks to @venkatbvc for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5166). -* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add `tls_insecure_skip_verify` parameter which can be set on a per-user level to disable TLS verification for backend connections. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). +* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add ability to skip TLS verification and to specify TLS Root CA when connecting to backends. See [these docs](https://docs.victoriametrics.com/vmauth.html#backend-tls-setup) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240). * FEATURE: `vmstorage`: add `-blockcache.missesBeforeCaching` command-line flag, which can be used for fine-tuning RAM usage for `indexdb/dataBlocks` cache when queries touching big number of time series are executed. * FEATURE: add `-loggerMaxArgLen` command-line flag for fine-tuning the maximum lengths of logged args. diff --git a/docs/vmauth.md b/docs/vmauth.md index a156742b8c..a2ea738911 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -112,6 +112,31 @@ The following [metrics](#monitoring) related to concurrency limits are exposed b - `vmauth_unauthorized_user_concurrent_requests_limit_reached_total` - the number of requests rejected with `429 Too Many Requests` error because of the concurrency limit has been reached for unauthorized users (if `unauthorized_user` section is used). +## Backend TLS setup + +By default `vmauth` uses system settings when performing requests to HTTPS backends specified via `url_prefix` option +in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config). These settings can be overridden with the following command-line flags: + +- `backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. + This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) + via `tls_insecure_skip_verify` option. For example: + + ```yml + - username: "foo" + url_prefix: "https://localhost" + tls_insecure_skip_verify: true + ``` + +- `backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. + The `backend.tlsCAFile` may point either to local file or to `http` / `https` url. + This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) + via `tls_ca_file` option. For example: + + ```yml + - username: "foo" + url_prefix: "https://localhost" + tls_ca_file: "/path/to/tls/root/ca" + ``` ## IP filters From eded218e8c7478799956db40cb7dfe98a1c359d0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 09:02:49 +0100 Subject: [PATCH 28/48] app/vmauth: properly pass `Host` header to backends Previously the `Host` header was remained unchanged when passing it in requests to backends. This may improperly work if the backend uses host-based routing. While at it, allows http/2.0 requests to backends. While VictoriaMetrics components do not accept http/2.0 requests, other backends can require such requests. Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5240 --- app/vmauth/main.go | 3 +-- docs/CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/vmauth/main.go b/app/vmauth/main.go index 75bd8a4cb0..a63be3719c 100644 --- a/app/vmauth/main.go +++ b/app/vmauth/main.go @@ -218,6 +218,7 @@ func tryProcessingRequest(w http.ResponseWriter, r *http.Request, targetURL *url // This code has been copied from net/http/httputil/reverseproxy.go req := sanitizeRequestHeaders(r) req.URL = targetURL + req.Host = targetURL.Host updateHeadersByConfig(req.Header, hc.RequestHeaders) res, err := transport.RoundTrip(req) rtb, rtbOK := req.Body.(*readTrackingBody) @@ -407,8 +408,6 @@ func newTransport(insecureSkipVerify bool, caFile string) (*http.Transport, erro tr.ResponseHeaderTimeout = *responseTimeout // Automatic compression must be disabled in order to fix https://github.com/VictoriaMetrics/VictoriaMetrics/issues/535 tr.DisableCompression = true - // Disable HTTP/2.0, since VictoriaMetrics components don't support HTTP/2.0 (because there is no sense in this). - tr.ForceAttemptHTTP2 = false tr.MaxIdleConnsPerHost = *maxIdleConnsPerBackend if tr.MaxIdleConns != 0 && tr.MaxIdleConns < tr.MaxIdleConnsPerHost { tr.MaxIdleConns = tr.MaxIdleConnsPerHost diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c25373d120..89794137ca 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -106,6 +106,7 @@ The sandbox cluster installation is running under the constant load generated by * BUGFIX: [vmstorage](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): prevent deleted series to be searchable via `/api/v1/series` API if they were re-ingested with staleness markers. This situation could happen if user deletes the series from the target and from VM, and then vmagent sends stale markers for absent series. Thanks to @ilyatrefilov for the [issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5069) and [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5174). * BUGFIX: [vmstorage](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): log warning about switching to ReadOnly mode only on state change. Before, vmstorage would log this warning every 1s. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5159) for details. * BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): show browser authorization window for unauthorized requests to unsupported paths if the `unauthorized_user` section is specified. This allows properly authorizing the user. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5236) for details. +* BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): properly proxy requests to HTTP/2.0 backends and properly pass `Host` header to backends. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix the `Disable cache` toggle at `JSON` and `Table` views. Previously response caching was always enabled and couldn't be disabled at these views. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): correctly display query errors on [Explore Prometheus Metrics](https://docs.victoriametrics.com/#metrics-explorer) page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5202) for details. * BUGFIX: [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html): correctly print error in logs when copying backup fails. Previously, error was displayed in metrics but was missing in logs. From 25ff811d78a2e2e06ef6944b4c1079847c9cf054 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 09:12:55 +0100 Subject: [PATCH 29/48] docs/vmauth.md: add missing dashes in front of command-line flags at the `Backend TLS setup` section Dashes must be consistently used in front of command-line flags across the documentation. This is a follow up for 61594d2bd85cf7bb66f24f36d28cff47db55ee5b --- app/vmauth/README.md | 6 +++--- docs/vmauth.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/vmauth/README.md b/app/vmauth/README.md index 96e656ba2f..e6befcc852 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -106,7 +106,7 @@ The following [metrics](#monitoring) related to concurrency limits are exposed b By default `vmauth` uses system settings when performing requests to HTTPS backends specified via `url_prefix` option in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config). These settings can be overridden with the following command-line flags: -- `backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. +- `-backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) via `tls_insecure_skip_verify` option. For example: @@ -116,8 +116,8 @@ in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config tls_insecure_skip_verify: true ``` -- `backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. - The `backend.tlsCAFile` may point either to local file or to `http` / `https` url. +- `-backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. + The `-backend.tlsCAFile` may point either to local file or to `http` / `https` url. This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) via `tls_ca_file` option. For example: diff --git a/docs/vmauth.md b/docs/vmauth.md index a2ea738911..6375ed511f 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -117,7 +117,7 @@ The following [metrics](#monitoring) related to concurrency limits are exposed b By default `vmauth` uses system settings when performing requests to HTTPS backends specified via `url_prefix` option in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config). These settings can be overridden with the following command-line flags: -- `backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. +- `-backend.tlsInsecureSkipVerify` allows skipping TLS verification when connecting to HTTPS backends. This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) via `tls_insecure_skip_verify` option. For example: @@ -127,8 +127,8 @@ in the [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config tls_insecure_skip_verify: true ``` -- `backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. - The `backend.tlsCAFile` may point either to local file or to `http` / `https` url. +- `-backend.tlsCAFile` allows specifying the path to TLS Root CA, which will be used for TLS verification when connecting to HTTPS backends. + The `-backend.tlsCAFile` may point either to local file or to `http` / `https` url. This global setting can be overridden at per-user level inside [`-auth.config`](https://docs.victoriametrics.com/vmauth.html#auth-config) via `tls_ca_file` option. For example: From ba058a45147042a4fbbb6e6707253703633034ef Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 09:24:29 +0100 Subject: [PATCH 30/48] docs/CHANGELOG.md: remove trailing whitespace after bffd30b57af09ba01a6ea40378fefa3b37468efd --- docs/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 89794137ca..ab5cebf337 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -58,7 +58,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): allow specifying full url in notifier static_configs target address, like `http://alertmanager:9093/test/api/v2/alerts`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5184). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): reduce the number of queries for restoring alerts state on start-up. The change should speed up the restore process and reduce pressure on `remoteRead.url`. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5265). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add label `file` pointing to the group's filename to metrics `vmalert_recording_.*` and `vmalert_alerts_.*`. The filename should help identifying alerting rules belonging to specific groups with identical names but different filenames. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5267). -* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): automatically retry remote-write requests on closed connections. The change should reduce the amount of logs produced in environments with short-living connections or environments without support of keep-alive on network balancers. +* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): automatically retry remote-write requests on closed connections. The change should reduce the amount of logs produced in environments with short-living connections or environments without support of keep-alive on network balancers. * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): support data ingestion from [NewRelic infrastructure agent](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-newrelic-agent), [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3520) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4712). * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `-remoteWrite.shardByURL.labels` command-line flag, which can be used for specifying a list of labels for sharding outgoing samples among the configured `-remoteWrite.url` destinations if `-remoteWrite.shardByURL` command-line flag is set. See [these docs](https://docs.victoriametrics.com/vmagent.html#sharding-among-remote-storages) and [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4942) for details. * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): do not exit on startup when [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs) refer to non-existing or invalid files with auth configs, since these files may appear / updated later. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4959) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153). From 4722b70c89535f3d8a4e4c74aafdc857738173b7 Mon Sep 17 00:00:00 2001 From: Dmytro Kozlov Date: Mon, 13 Nov 2023 09:51:49 +0100 Subject: [PATCH 31/48] lib/stringsutil: fix failing test (#5313) We have failed test on master branch. ``` --- FAIL: TestFormatLogMessage (0.00s) logger_test.go:24: unexpected result; got "foo: abcde, \"foo bar baz\", xx" want "foo: a..e, \"f..z\", xx" ``` if failed because maxArgs maxLen <= 4 in the `LimitStringLen` in that case we always will return the income string but in the test we limit the maxLen by value 4 ``` f("foo: %s, %q, %s", []interface{}{"abcde", fmt.Errorf("foo bar baz"), "xx"}, 4, `foo: a..e, "f..z", xx`) --- lib/stringsutil/stringsutil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/stringsutil/stringsutil.go b/lib/stringsutil/stringsutil.go index cd5754cfd1..96afb208c5 100644 --- a/lib/stringsutil/stringsutil.go +++ b/lib/stringsutil/stringsutil.go @@ -5,7 +5,7 @@ package stringsutil // If len(s) > maxLen, then s is replaced with "s_prefix..s_suffix", // so the total length of the returned string doesn't exceed maxLen. func LimitStringLen(s string, maxLen int) string { - if len(s) <= maxLen || maxLen <= 4 { + if len(s) <= maxLen || maxLen < 4 { return s } n := (maxLen / 2) - 1 From 6340911d381e81522a3fc9b3e499aa86f121a0b5 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 10:32:26 +0100 Subject: [PATCH 32/48] lib/stringsutil: add tests for LimitStringLen() function --- lib/stringsutil/stringsutil.go | 8 ++++---- lib/stringsutil/stringsutil_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 lib/stringsutil/stringsutil_test.go diff --git a/lib/stringsutil/stringsutil.go b/lib/stringsutil/stringsutil.go index 96afb208c5..034612292a 100644 --- a/lib/stringsutil/stringsutil.go +++ b/lib/stringsutil/stringsutil.go @@ -5,12 +5,12 @@ package stringsutil // If len(s) > maxLen, then s is replaced with "s_prefix..s_suffix", // so the total length of the returned string doesn't exceed maxLen. func LimitStringLen(s string, maxLen int) string { - if len(s) <= maxLen || maxLen < 4 { + if maxLen < 4 { + maxLen = 4 + } + if len(s) <= maxLen { return s } n := (maxLen / 2) - 1 - if n < 0 { - n = 0 - } return s[:n] + ".." + s[len(s)-n:] } diff --git a/lib/stringsutil/stringsutil_test.go b/lib/stringsutil/stringsutil_test.go new file mode 100644 index 0000000000..bda93fe4f1 --- /dev/null +++ b/lib/stringsutil/stringsutil_test.go @@ -0,0 +1,24 @@ +package stringsutil + +import ( + "testing" +) + +func TestLimitStringLen(t *testing.T) { + f := func(s string, maxLen int, resultExpected string) { + t.Helper() + + result := LimitStringLen(s, maxLen) + if result != resultExpected { + t.Fatalf("unexpected result; got %q; want %q", result, resultExpected) + } + } + + f("", 1, "") + f("a", 10, "a") + f("abc", 2, "abc") + f("abcd", 3, "abcd") + f("abcde", 3, "a..e") + f("abcde", 4, "a..e") + f("abcde", 5, "abcde") +} From 66527c598110472964171a75a539d9ec6b2a883d Mon Sep 17 00:00:00 2001 From: Yury Molodov Date: Mon, 13 Nov 2023 10:36:52 +0100 Subject: [PATCH 33/48] vmui: ui logs enhancements (#5312) * vmui/logs: fix time sorting #5300 * vmui/logs: add base query validation * vmui/logs: add a message for empty results --- .../vmui/src/components/Table/helpers.ts | 11 +++++++-- .../src/pages/ExploreLogs/ExploreLogs.tsx | 23 +++++++++++++++++-- .../ExploreLogsBody/ExploreLogsBody.tsx | 10 ++++++-- .../ExploreLogs/ExploreLogsBody/style.scss | 9 ++++++++ .../ExploreLogsHeader/ExploreLogsHeader.tsx | 4 +++- 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/app/vmui/packages/vmui/src/components/Table/helpers.ts b/app/vmui/packages/vmui/src/components/Table/helpers.ts index dd371f961a..b0fa4426e8 100644 --- a/app/vmui/packages/vmui/src/components/Table/helpers.ts +++ b/app/vmui/packages/vmui/src/components/Table/helpers.ts @@ -1,10 +1,17 @@ import { Order } from "../../pages/CardinalityPanel/Table/types"; +import dayjs from "dayjs"; + +const dateColumns = ["date", "timestamp", "time"]; export function descendingComparator(a: T, b: T, orderBy: keyof T) { - if (b[orderBy] < a[orderBy]) { + const valueA = a[orderBy]; + const valueB = b[orderBy]; + const parsedValueA = dateColumns.includes(`${orderBy}`) ? dayjs(`${valueA}`).unix() : valueA; + const parsedValueB = dateColumns.includes(`${orderBy}`) ? dayjs(`${valueB}`).unix() : valueB; + if (parsedValueB < parsedValueA) { return -1; } - if (b[orderBy] > a[orderBy]) { + if (parsedValueB > parsedValueA) { return 1; } return 0; diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx index d371a0cab2..e177a12179 100644 --- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx +++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx @@ -9,6 +9,8 @@ import Alert from "../../components/Main/Alert/Alert"; import ExploreLogsHeader from "./ExploreLogsHeader/ExploreLogsHeader"; import "./style.scss"; import usePrevious from "../../hooks/usePrevious"; +import { ErrorTypes } from "../../types"; +import { useState } from "react"; const ExploreLogs: FC = () => { const { serverUrl } = useAppState(); @@ -17,9 +19,18 @@ const ExploreLogs: FC = () => { const [query, setQuery] = useStateSearchParams("", "query"); const prevQuery = usePrevious(query); const { logs, isLoading, error, fetchLogs } = useFetchLogs(serverUrl, query); + const [queryError, setQueryError] = useState(""); + const [loaded, isLoaded] = useState(false); const handleRunQuery = () => { - fetchLogs(); + if (!query) { + setQueryError(ErrorTypes.validQuery); + return; + } + + fetchLogs().then(() => { + isLoaded(true); + }); const changedQuery = prevQuery && query !== prevQuery; const params: Record = changedQuery ? { query, page: 1 } : { query }; setSearchParamsFromKeys(params); @@ -29,16 +40,24 @@ const ExploreLogs: FC = () => { if (query) handleRunQuery(); }, []); + useEffect(() => { + setQueryError(""); + }, [query]); + return (
{isLoading && } {error && {error}} - +
); }; diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx index ff33d65f76..929677c433 100644 --- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx +++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx @@ -18,7 +18,8 @@ import TableLogs from "./TableLogs"; import GroupLogs from "./GroupLogs"; export interface ExploreLogBodyProps { - data: Logs[] + data: Logs[]; + loaded?: boolean; } enum DisplayType { @@ -33,7 +34,7 @@ const tabs = [ { label: "JSON", value: DisplayType.json, icon: }, ]; -const ExploreLogsBody: FC = ({ data }) => { +const ExploreLogsBody: FC = ({ data, loaded }) => { const { isMobile } = useDeviceDetect(); const { timezone } = useTimeState(); const { setSearchParamsFromKeys } = useSearchParamsFromObject(); @@ -117,6 +118,11 @@ const ExploreLogsBody: FC = ({ data }) => { "vm-explore-logs-body__table_mobile": isMobile, })} > + {!data.length && ( +
+ {loaded ? "No logs found" : "Run query to see logs"} +
+ )} {!!data.length && ( <> {activeTab === DisplayType.table && ( diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/style.scss b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/style.scss index 9116c17234..2d27780ab3 100644 --- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/style.scss +++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/style.scss @@ -15,6 +15,15 @@ } } + &__empty { + display: flex; + align-items: center; + justify-content: center; + min-height: 120px; + color: $color-text-disabled; + text-align: center; + } + &__table { padding-top: $padding-medium; width: calc(100vw - ($padding-medium * 4) - var(--scrollbar-width)); diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx index 0d51f1224e..d46cf28189 100644 --- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx +++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx @@ -8,11 +8,12 @@ import QueryEditor from "../../../components/Configurators/QueryEditor/QueryEdit export interface ExploreLogHeaderProps { query: string; + error?: string; onChange: (val: string) => void; onRun: () => void; } -const ExploreLogsHeader: FC = ({ query, onChange, onRun }) => { +const ExploreLogsHeader: FC = ({ query, error, onChange, onRun }) => { const { isMobile } = useDeviceDetect(); return ( @@ -32,6 +33,7 @@ const ExploreLogsHeader: FC = ({ query, onChange, onRun } onEnter={onRun} onChange={onChange} label={"Log query"} + error={error} />
From c8d901424f882022597788cb4fd6aae9b3b9ee1d Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 10:39:18 +0100 Subject: [PATCH 34/48] docs/VictoriaLogs/CHANGELOG.md: follow-up for 66527c598110472964171a75a539d9ec6b2a883d Document the change Updates https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5312 Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5300 --- docs/VictoriaLogs/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/VictoriaLogs/CHANGELOG.md b/docs/VictoriaLogs/CHANGELOG.md index 99e15eaac0..54b233739f 100644 --- a/docs/VictoriaLogs/CHANGELOG.md +++ b/docs/VictoriaLogs/CHANGELOG.md @@ -18,6 +18,9 @@ according to [these docs](https://docs.victoriametrics.com/VictoriaLogs/QuickSta ## tip +* BUGFIX: [web UI](https://docs.victoriametrics.com/VictoriaLogs/querying/#web-ui): properly sort found logs by time. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5300). + + ## [v0.4.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v0.4.1-victorialogs) Released at 2023-10-04 From 3e93fa61adede4396400d763ae5c17be43232be6 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 18:23:36 +0100 Subject: [PATCH 35/48] lib/regexutil: properly handle alternate regexps surrounded by .+ or .* Previously the following regexps were improperly handled: .+foo|bar.+ .*foo|bar.* This could lead to unexpected regexp match results. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5297 Thanks to @Haleygo for the initial attempt to fix the issue at https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5308 --- docs/CHANGELOG.md | 1 + lib/regexutil/promregex.go | 16 ++++++++++++++++ lib/regexutil/promregex_test.go | 33 +++++++++++++++++++++++++++++++-- lib/regexutil/regexutil_test.go | 8 ++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ab5cebf337..f878ccfbf7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -97,6 +97,7 @@ The sandbox cluster installation is running under the constant load generated by * BUGFIX: dashboards/cluster: fix description about `max` threshold for `Concurrent selects` panel. Before, it was mistakenly implying that `max` is equal to the double of available CPUs. * BUGFIX: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): bump hard-coded limit for search query size at `vmstorage` from 1MB to 5MB. The change should be more suitable for real-world scenarios and protect vmstorage from excessive memory usage. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5154) for details * BUGFIX: [vmbackup](https://docs.victoriametrics.com/vmbackup.html): fix error when creating an incremental backup with the `-origin` command-line flag. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5144) for details. +* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly apply [relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling) with `regex`, which start and end with `.+` or `.*` and which contain alternate sub-regexps. For example, `.+;|;.+` or `.*foo|bar|baz.*`. Previously such regexps were improperly parsed, which could result in undexpected relabeling results. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5297). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly discover Kubernetes targets via [kubernetes_sd_configs](https://docs.victoriametrics.com/sd_configs.html#kubernetes_sd_configs). Previously some targets and some labels could be skipped during service discovery because of the bug introduced in [v1.93.5](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.5) when implementing [this feature](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4850). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5216) for more details. * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): fix vmagent ignoring configuration reload for streaming aggregation if it was started with empty streaming aggregation config. Thanks to @aluode99 for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5178). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): do not scrape targets if the corresponding [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs) refer to files with invalid auth configs. Previously the targets were scraped without properly set auth headers in this case. Now targets are scraped only after the files are updated with valid auth configs. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153). diff --git a/lib/regexutil/promregex.go b/lib/regexutil/promregex.go index eafc422fed..11313b6d50 100644 --- a/lib/regexutil/promregex.go +++ b/lib/regexutil/promregex.go @@ -2,6 +2,7 @@ package regexutil import ( "regexp" + "regexp/syntax" "strings" "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" @@ -105,7 +106,22 @@ func (pr *PromRegex) MatchString(s string) bool { return pr.reSuffixMatcher.Match(s) } +// getSubstringLiteral returns regex part from expr surrounded by prefixSuffix. +// +// For example, if expr=".+foo.+" and prefixSuffix=".+", then the function returns "foo". +// +// An empty string is returned if expr doesn't contain the given prefixSuffix prefix and suffix +// or if the regex part surrounded by prefixSuffix contains alternate regexps. func getSubstringLiteral(expr, prefixSuffix string) string { + // Verify that the expr doesn't contain alternate regexps. In this case it is unsafe removing prefix and suffix. + sre, err := syntax.Parse(expr, syntax.Perl) + if err != nil { + return "" + } + if sre.Op == syntax.OpAlternate { + return "" + } + if !strings.HasPrefix(expr, prefixSuffix) { return "" } diff --git a/lib/regexutil/promregex_test.go b/lib/regexutil/promregex_test.go index 20a04312ad..83cea682fa 100644 --- a/lib/regexutil/promregex_test.go +++ b/lib/regexutil/promregex_test.go @@ -29,7 +29,7 @@ func TestPromRegex(t *testing.T) { } result := pr.MatchString(s) if result != resultExpected { - t.Fatalf("unexpected result when matching %s against %s; got %v; want %v", expr, s, result, resultExpected) + t.Fatalf("unexpected result when matching %q against %q; got %v; want %v", expr, s, result, resultExpected) } // Make sure the result is the same for regular regexp @@ -37,7 +37,7 @@ func TestPromRegex(t *testing.T) { re := regexp.MustCompile(exprAnchored) result = re.MatchString(s) if result != resultExpected { - t.Fatalf("unexpected result when matching %s against %s during sanity check; got %v; want %v", exprAnchored, s, result, resultExpected) + t.Fatalf("unexpected result when matching %q against %q during sanity check; got %v; want %v", exprAnchored, s, result, resultExpected) } } f("", "", true) @@ -89,4 +89,33 @@ func TestPromRegex(t *testing.T) { f(".*(a|b).*", "xzy", false) f("^(?:true)$", "true", true) f("^(?:true)$", "false", false) + + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5297 + f(".+;|;.+", ";", false) + f(".+;|;.+", "foo", false) + f(".+;|;.+", "foo;bar", false) + f(".+;|;.+", "foo;", true) + f(".+;|;.+", ";foo", true) + f(".+foo|bar|baz.+", "foo", false) + f(".+foo|bar|baz.+", "afoo", true) + f(".+foo|bar|baz.+", "fooa", false) + f(".+foo|bar|baz.+", "afooa", false) + f(".+foo|bar|baz.+", "bar", true) + f(".+foo|bar|baz.+", "abar", false) + f(".+foo|bar|baz.+", "abara", false) + f(".+foo|bar|baz.+", "bara", false) + f(".+foo|bar|baz.+", "baz", false) + f(".+foo|bar|baz.+", "baza", true) + f(".+foo|bar|baz.+", "abaz", false) + f(".+foo|bar|baz.+", "abaza", false) + f(".+foo|bar|baz.+", "afoo|bar|baza", false) + f(".+(foo|bar|baz).+", "abara", true) + f(".+(foo|bar|baz).+", "afooa", true) + f(".+(foo|bar|baz).+", "abaza", true) + + f(".*;|;.*", ";", true) + f(".*;|;.*", "foo", false) + f(".*;|;.*", "foo;bar", false) + f(".*;|;.*", "foo;", true) + f(".*;|;.*", ";foo", true) } diff --git a/lib/regexutil/regexutil_test.go b/lib/regexutil/regexutil_test.go index e45781d25e..7357e115f4 100644 --- a/lib/regexutil/regexutil_test.go +++ b/lib/regexutil/regexutil_test.go @@ -109,6 +109,14 @@ func TestSimplify(t *testing.T) { // The transformed regexp mustn't match barx f("(foo|bar$)x*", "", "(?:foo|bar$)x*") + + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5297 + f(".+;|;.+", "", ".+;|;.+") + f("^(.+);|;(.+)$", "", ".+;|;.+") + f("^(.+);$|^;(.+)$", "", ".+;|;.+") + f(".*;|;.*", "", ".*;|;.*") + f("^(.*);|;(.*)$", "", ".*;|;.*") + f("^(.*);$|^;(.*)$", "", ".*;|;.*") } func TestRemoveStartEndAnchors(t *testing.T) { From b7fb7c5f775b844643f224734465579bd0b7c839 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 18:50:16 +0100 Subject: [PATCH 36/48] vendor: run `make vendor-update` --- go.mod | 76 +- go.sum | 150 +- vendor/cloud.google.com/go/storage/CHANGES.md | 14 + .../go/storage/grpc_client.go | 217 +-- .../go/storage/internal/apiv2/auxiliary.go | 210 +++ .../go/storage/internal/apiv2/doc.go | 29 +- .../storage/internal/apiv2/storage_client.go | 188 --- .../go/storage/internal/version.go | 2 +- .../azure-sdk-for-go/sdk/azcore/CHANGELOG.md | 82 +- .../Azure/azure-sdk-for-go/sdk/azcore/core.go | 42 +- .../Azure/azure-sdk-for-go/sdk/azcore/doc.go | 7 + .../sdk/azcore/internal/exported/exported.go | 34 + .../sdk/azcore/internal/exported/pipeline.go | 20 - .../sdk/azcore/internal/exported/request.go | 31 + .../internal/exported/response_error.go | 51 +- .../sdk/azcore/internal/pollers/fake/fake.go | 133 ++ .../sdk/azcore/internal/shared/constants.go | 12 +- .../sdk/azcore/internal/shared/shared.go | 71 +- .../sdk/azcore/policy/policy.go | 6 +- .../sdk/azcore/runtime/pager.go | 18 +- .../sdk/azcore/runtime/pipeline.go | 36 +- .../sdk/azcore/runtime/policy_bearer_token.go | 39 +- .../sdk/azcore/runtime/policy_http_trace.go | 143 ++ .../azcore/runtime/policy_key_credential.go | 16 +- .../sdk/azcore/runtime/policy_logging.go | 3 +- .../sdk/azcore/runtime/policy_retry.go | 10 +- .../azcore/runtime/policy_sas_credential.go | 10 +- .../sdk/azcore/runtime/policy_telemetry.go | 4 + .../sdk/azcore/runtime/poller.go | 103 +- .../sdk/azcore/runtime/request.go | 97 +- .../sdk/azcore/runtime/response.go | 30 +- .../runtime/transport_default_http_client.go | 10 + .../sdk/azcore/tracing/tracing.go | 61 +- .../github.com/aws/aws-sdk-go-v2/CHANGELOG.md | 105 ++ vendor/github.com/aws/aws-sdk-go-v2/Makefile | 8 +- .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws/signer/internal/v4/headers.go | 1 + .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 17 + .../aws/aws-sdk-go-v2/config/config.go | 2 +- .../config/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/credentials/CHANGELOG.md | 4 + .../credentials/go_module_metadata.go | 2 +- .../feature/ec2/imds/CHANGELOG.md | 4 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../feature/s3/manager/CHANGELOG.md | 16 + .../feature/s3/manager/go_module_metadata.go | 2 +- .../internal/configsources/CHANGELOG.md | 4 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/v2/CHANGELOG.md | 4 + .../endpoints/v2/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/internal/ini/CHANGELOG.md | 12 + .../internal/ini/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/internal/ini/ini_parser.go | 7 + .../internal/ini/literal_tokens.go | 19 +- .../aws-sdk-go-v2/internal/v4a/CHANGELOG.md | 4 + .../internal/v4a/go_module_metadata.go | 2 +- .../service/internal/checksum/CHANGELOG.md | 4 + .../internal/checksum/go_module_metadata.go | 2 +- .../internal/presigned-url/CHANGELOG.md | 4 + .../presigned-url/go_module_metadata.go | 2 +- .../service/internal/s3shared/CHANGELOG.md | 4 + .../internal/s3shared/go_module_metadata.go | 2 +- .../aws/aws-sdk-go-v2/service/s3/CHANGELOG.md | 4 + .../service/s3/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 4 + .../service/sso/go_module_metadata.go | 2 +- .../service/ssooidc/CHANGELOG.md | 4 + .../service/ssooidc/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 4 + .../service/sts/go_module_metadata.go | 2 +- .../aws/aws-sdk-go/aws/endpoints/defaults.go | 67 + .../aws/aws-sdk-go/aws/signer/v4/v4.go | 1 + .../github.com/aws/aws-sdk-go/aws/version.go | 2 +- vendor/github.com/fatih/color/color.go | 56 +- .../github.com/felixge/httpsnoop/.travis.yml | 6 - vendor/github.com/felixge/httpsnoop/Makefile | 2 +- vendor/github.com/felixge/httpsnoop/README.md | 4 +- .../felixge/httpsnoop/capture_metrics.go | 2 +- .../httpsnoop/wrap_generated_gteq_1.8.go | 2 +- .../httpsnoop/wrap_generated_lt_1.8.go | 2 +- .../github.com/golang-jwt/jwt/v5/ed25519.go | 3 +- .../golang-jwt/jwt/v5/errors_go_other.go | 2 +- vendor/github.com/golang-jwt/jwt/v5/none.go | 2 +- vendor/github.com/golang-jwt/jwt/v5/parser.go | 79 +- .../golang-jwt/jwt/v5/parser_option.go | 8 + vendor/github.com/golang-jwt/jwt/v5/token.go | 14 + vendor/github.com/golang-jwt/jwt/v5/types.go | 5 +- .../github.com/golang-jwt/jwt/v5/validator.go | 8 +- .../net/http/otelhttp/common.go | 4 +- .../net/http/otelhttp/config.go | 7 +- .../net/http/otelhttp/handler.go | 18 +- .../net/http/otelhttp/version.go | 2 +- vendor/go.opentelemetry.io/otel/.gitignore | 3 +- vendor/go.opentelemetry.io/otel/.golangci.yml | 17 +- vendor/go.opentelemetry.io/otel/CHANGELOG.md | 70 +- vendor/go.opentelemetry.io/otel/Makefile | 29 +- vendor/go.opentelemetry.io/otel/README.md | 15 +- .../otel/baggage/baggage.go | 4 +- .../otel/internal/global/instruments.go | 60 +- .../otel/internal/global/trace.go | 7 + vendor/go.opentelemetry.io/otel/metric/doc.go | 2 +- .../otel/metric/instrument.go | 23 + .../otel/metric/syncfloat64.go | 10 +- .../otel/metric/syncint64.go | 10 +- .../otel/propagation/trace_context.go | 6 +- .../go.opentelemetry.io/otel/requirements.txt | 2 +- .../go.opentelemetry.io/otel/trace/config.go | 1 + vendor/go.opentelemetry.io/otel/trace/doc.go | 64 + .../otel/trace/embedded/embedded.go | 56 + vendor/go.opentelemetry.io/otel/trace/noop.go | 10 +- .../go.opentelemetry.io/otel/trace/trace.go | 40 +- .../otel/trace/tracestate.go | 38 +- vendor/go.opentelemetry.io/otel/version.go | 2 +- vendor/go.opentelemetry.io/otel/versions.yaml | 4 +- .../x/crypto/chacha20/chacha_arm64.go | 1 - .../x/crypto/chacha20/chacha_arm64.s | 1 - .../x/crypto/chacha20/chacha_noasm.go | 1 - .../x/crypto/chacha20/chacha_ppc64le.go | 1 - .../x/crypto/chacha20/chacha_ppc64le.s | 1 - .../x/crypto/chacha20/chacha_s390x.go | 1 - .../x/crypto/chacha20/chacha_s390x.s | 1 - .../chacha20poly1305_amd64.go | 1 - .../chacha20poly1305/chacha20poly1305_amd64.s | 25 +- .../chacha20poly1305_noasm.go | 1 - vendor/golang.org/x/crypto/hkdf/hkdf.go | 4 +- .../x/crypto/internal/alias/alias.go | 1 - .../x/crypto/internal/alias/alias_purego.go | 1 - .../x/crypto/internal/poly1305/bits_compat.go | 1 - .../x/crypto/internal/poly1305/bits_go1.13.go | 1 - .../x/crypto/internal/poly1305/mac_noasm.go | 1 - .../x/crypto/internal/poly1305/sum_amd64.go | 1 - .../x/crypto/internal/poly1305/sum_amd64.s | 1 - .../x/crypto/internal/poly1305/sum_ppc64le.go | 1 - .../x/crypto/internal/poly1305/sum_ppc64le.s | 1 - .../x/crypto/internal/poly1305/sum_s390x.go | 1 - .../x/crypto/internal/poly1305/sum_s390x.s | 1 - vendor/golang.org/x/net/http2/databuffer.go | 59 +- vendor/golang.org/x/net/http2/go111.go | 30 - vendor/golang.org/x/net/http2/go115.go | 27 - vendor/golang.org/x/net/http2/go118.go | 17 - vendor/golang.org/x/net/http2/not_go111.go | 21 - vendor/golang.org/x/net/http2/not_go115.go | 31 - vendor/golang.org/x/net/http2/not_go118.go | 17 - vendor/golang.org/x/net/http2/server.go | 24 +- vendor/golang.org/x/net/http2/transport.go | 33 +- vendor/golang.org/x/net/idna/go118.go | 1 - vendor/golang.org/x/net/idna/idna10.0.0.go | 1 - vendor/golang.org/x/net/idna/idna9.0.0.go | 1 - vendor/golang.org/x/net/idna/pre_go118.go | 1 - vendor/golang.org/x/net/idna/tables10.0.0.go | 1 - vendor/golang.org/x/net/idna/tables11.0.0.go | 1 - vendor/golang.org/x/net/idna/tables12.0.0.go | 1 - vendor/golang.org/x/net/idna/tables13.0.0.go | 1 - vendor/golang.org/x/net/idna/tables15.0.0.go | 1 - vendor/golang.org/x/net/idna/tables9.0.0.go | 1 - vendor/golang.org/x/net/idna/trie12.0.0.go | 1 - vendor/golang.org/x/net/idna/trie13.0.0.go | 1 - vendor/golang.org/x/oauth2/google/doc.go | 2 + vendor/golang.org/x/sync/errgroup/go120.go | 1 - .../golang.org/x/sync/errgroup/pre_go120.go | 1 - vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 1 - vendor/golang.org/x/sys/cpu/cpu_aix.go | 1 - vendor/golang.org/x/sys/cpu/cpu_arm64.s | 1 - vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 1 - vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 1 - vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 2 - .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 1 - .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 1 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 2 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 2 - vendor/golang.org/x/sys/cpu/cpu_linux.go | 1 - .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 2 - .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 1 - .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 2 - vendor/golang.org/x/sys/cpu/cpu_loong64.go | 1 - vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 1 - vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 1 - vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 1 - .../golang.org/x/sys/cpu/cpu_other_arm64.go | 1 - .../golang.org/x/sys/cpu/cpu_other_mips64x.go | 2 - .../golang.org/x/sys/cpu/cpu_other_ppc64x.go | 3 - .../golang.org/x/sys/cpu/cpu_other_riscv64.go | 1 - vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 1 - vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 1 - vendor/golang.org/x/sys/cpu/cpu_s390x.s | 1 - vendor/golang.org/x/sys/cpu/cpu_wasm.go | 1 - vendor/golang.org/x/sys/cpu/cpu_x86.go | 1 - vendor/golang.org/x/sys/cpu/cpu_x86.s | 2 - vendor/golang.org/x/sys/cpu/endian_big.go | 1 - vendor/golang.org/x/sys/cpu/endian_little.go | 1 - .../x/sys/cpu/proc_cpuinfo_linux.go | 1 - .../x/sys/cpu/runtime_auxv_go121.go | 1 - .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 1 - .../x/sys/cpu/syscall_aix_ppc64_gc.go | 1 - vendor/golang.org/x/sys/unix/aliases.go | 2 - vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 1 - vendor/golang.org/x/sys/unix/asm_bsd_386.s | 2 - vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 2 - vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 2 - vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 2 - vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 2 - .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 2 - vendor/golang.org/x/sys/unix/asm_linux_386.s | 1 - .../golang.org/x/sys/unix/asm_linux_amd64.s | 1 - vendor/golang.org/x/sys/unix/asm_linux_arm.s | 1 - .../golang.org/x/sys/unix/asm_linux_arm64.s | 3 - .../golang.org/x/sys/unix/asm_linux_loong64.s | 3 - .../golang.org/x/sys/unix/asm_linux_mips64x.s | 3 - .../golang.org/x/sys/unix/asm_linux_mipsx.s | 3 - .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 3 - .../golang.org/x/sys/unix/asm_linux_riscv64.s | 2 - .../golang.org/x/sys/unix/asm_linux_s390x.s | 3 - .../x/sys/unix/asm_openbsd_mips64.s | 1 - .../golang.org/x/sys/unix/asm_solaris_amd64.s | 1 - vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 3 - vendor/golang.org/x/sys/unix/cap_freebsd.go | 1 - vendor/golang.org/x/sys/unix/constants.go | 1 - vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 1 - vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 1 - vendor/golang.org/x/sys/unix/dev_zos.go | 1 - vendor/golang.org/x/sys/unix/dirent.go | 1 - vendor/golang.org/x/sys/unix/endian_big.go | 1 - vendor/golang.org/x/sys/unix/endian_little.go | 1 - vendor/golang.org/x/sys/unix/env_unix.go | 1 - vendor/golang.org/x/sys/unix/epoll_zos.go | 1 - vendor/golang.org/x/sys/unix/fcntl.go | 1 - .../x/sys/unix/fcntl_linux_32bit.go | 1 - vendor/golang.org/x/sys/unix/fdset.go | 1 - vendor/golang.org/x/sys/unix/fstatfs_zos.go | 1 - vendor/golang.org/x/sys/unix/gccgo.go | 1 - vendor/golang.org/x/sys/unix/gccgo_c.c | 1 - .../x/sys/unix/gccgo_linux_amd64.go | 1 - vendor/golang.org/x/sys/unix/ifreq_linux.go | 1 - vendor/golang.org/x/sys/unix/ioctl_signed.go | 1 - .../golang.org/x/sys/unix/ioctl_unsigned.go | 1 - vendor/golang.org/x/sys/unix/ioctl_zos.go | 1 - vendor/golang.org/x/sys/unix/mkerrors.sh | 1 - vendor/golang.org/x/sys/unix/mmap_nomremap.go | 1 - vendor/golang.org/x/sys/unix/mremap.go | 1 - vendor/golang.org/x/sys/unix/pagesize_unix.go | 1 - .../golang.org/x/sys/unix/pledge_openbsd.go | 110 +- vendor/golang.org/x/sys/unix/ptrace_darwin.go | 1 - vendor/golang.org/x/sys/unix/ptrace_ios.go | 1 - vendor/golang.org/x/sys/unix/race.go | 1 - vendor/golang.org/x/sys/unix/race0.go | 1 - .../x/sys/unix/readdirent_getdents.go | 1 - .../x/sys/unix/readdirent_getdirentries.go | 1 - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 1 - .../x/sys/unix/sockcmsg_unix_other.go | 1 - vendor/golang.org/x/sys/unix/syscall.go | 1 - vendor/golang.org/x/sys/unix/syscall_aix.go | 4 +- .../golang.org/x/sys/unix/syscall_aix_ppc.go | 1 - .../x/sys/unix/syscall_aix_ppc64.go | 1 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 1 - .../x/sys/unix/syscall_darwin_amd64.go | 1 - .../x/sys/unix/syscall_darwin_arm64.go | 1 - .../x/sys/unix/syscall_darwin_libSystem.go | 1 - .../x/sys/unix/syscall_dragonfly_amd64.go | 1 - .../x/sys/unix/syscall_freebsd_386.go | 1 - .../x/sys/unix/syscall_freebsd_amd64.go | 1 - .../x/sys/unix/syscall_freebsd_arm.go | 1 - .../x/sys/unix/syscall_freebsd_arm64.go | 1 - .../x/sys/unix/syscall_freebsd_riscv64.go | 1 - vendor/golang.org/x/sys/unix/syscall_hurd.go | 1 - .../golang.org/x/sys/unix/syscall_hurd_386.go | 1 - .../golang.org/x/sys/unix/syscall_illumos.go | 1 - vendor/golang.org/x/sys/unix/syscall_linux.go | 5 +- .../x/sys/unix/syscall_linux_386.go | 1 - .../x/sys/unix/syscall_linux_alarm.go | 2 - .../x/sys/unix/syscall_linux_amd64.go | 1 - .../x/sys/unix/syscall_linux_amd64_gc.go | 1 - .../x/sys/unix/syscall_linux_arm.go | 1 - .../x/sys/unix/syscall_linux_arm64.go | 1 - .../golang.org/x/sys/unix/syscall_linux_gc.go | 1 - .../x/sys/unix/syscall_linux_gc_386.go | 1 - .../x/sys/unix/syscall_linux_gc_arm.go | 1 - .../x/sys/unix/syscall_linux_gccgo_386.go | 1 - .../x/sys/unix/syscall_linux_gccgo_arm.go | 1 - .../x/sys/unix/syscall_linux_loong64.go | 1 - .../x/sys/unix/syscall_linux_mips64x.go | 2 - .../x/sys/unix/syscall_linux_mipsx.go | 2 - .../x/sys/unix/syscall_linux_ppc.go | 1 - .../x/sys/unix/syscall_linux_ppc64x.go | 2 - .../x/sys/unix/syscall_linux_riscv64.go | 1 - .../x/sys/unix/syscall_linux_s390x.go | 1 - .../x/sys/unix/syscall_linux_sparc64.go | 1 - .../x/sys/unix/syscall_netbsd_386.go | 1 - .../x/sys/unix/syscall_netbsd_amd64.go | 1 - .../x/sys/unix/syscall_netbsd_arm.go | 1 - .../x/sys/unix/syscall_netbsd_arm64.go | 1 - .../golang.org/x/sys/unix/syscall_openbsd.go | 14 +- .../x/sys/unix/syscall_openbsd_386.go | 1 - .../x/sys/unix/syscall_openbsd_amd64.go | 1 - .../x/sys/unix/syscall_openbsd_arm.go | 1 - .../x/sys/unix/syscall_openbsd_arm64.go | 1 - .../x/sys/unix/syscall_openbsd_libc.go | 1 - .../x/sys/unix/syscall_openbsd_ppc64.go | 1 - .../x/sys/unix/syscall_openbsd_riscv64.go | 1 - .../golang.org/x/sys/unix/syscall_solaris.go | 3 +- .../x/sys/unix/syscall_solaris_amd64.go | 1 - vendor/golang.org/x/sys/unix/syscall_unix.go | 1 - .../golang.org/x/sys/unix/syscall_unix_gc.go | 2 - .../x/sys/unix/syscall_unix_gc_ppc64x.go | 3 - .../x/sys/unix/syscall_zos_s390x.go | 1 - vendor/golang.org/x/sys/unix/sysvshm_linux.go | 1 - vendor/golang.org/x/sys/unix/sysvshm_unix.go | 1 - .../x/sys/unix/sysvshm_unix_other.go | 1 - vendor/golang.org/x/sys/unix/timestruct.go | 1 - .../golang.org/x/sys/unix/unveil_openbsd.go | 41 +- vendor/golang.org/x/sys/unix/xattr_bsd.go | 1 - .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1 - .../x/sys/unix/zerrors_aix_ppc64.go | 1 - .../x/sys/unix/zerrors_darwin_amd64.go | 1 - .../x/sys/unix/zerrors_darwin_arm64.go | 1 - .../x/sys/unix/zerrors_dragonfly_amd64.go | 1 - .../x/sys/unix/zerrors_freebsd_386.go | 1 - .../x/sys/unix/zerrors_freebsd_amd64.go | 1 - .../x/sys/unix/zerrors_freebsd_arm.go | 1 - .../x/sys/unix/zerrors_freebsd_arm64.go | 1 - .../x/sys/unix/zerrors_freebsd_riscv64.go | 1 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 14 +- .../x/sys/unix/zerrors_linux_386.go | 1 - .../x/sys/unix/zerrors_linux_amd64.go | 1 - .../x/sys/unix/zerrors_linux_arm.go | 1 - .../x/sys/unix/zerrors_linux_arm64.go | 1 - .../x/sys/unix/zerrors_linux_loong64.go | 2 +- .../x/sys/unix/zerrors_linux_mips.go | 1 - .../x/sys/unix/zerrors_linux_mips64.go | 1 - .../x/sys/unix/zerrors_linux_mips64le.go | 1 - .../x/sys/unix/zerrors_linux_mipsle.go | 1 - .../x/sys/unix/zerrors_linux_ppc.go | 1 - .../x/sys/unix/zerrors_linux_ppc64.go | 1 - .../x/sys/unix/zerrors_linux_ppc64le.go | 1 - .../x/sys/unix/zerrors_linux_riscv64.go | 4 +- .../x/sys/unix/zerrors_linux_s390x.go | 1 - .../x/sys/unix/zerrors_linux_sparc64.go | 1 - .../x/sys/unix/zerrors_netbsd_386.go | 1 - .../x/sys/unix/zerrors_netbsd_amd64.go | 1 - .../x/sys/unix/zerrors_netbsd_arm.go | 1 - .../x/sys/unix/zerrors_netbsd_arm64.go | 1 - .../x/sys/unix/zerrors_openbsd_386.go | 1 - .../x/sys/unix/zerrors_openbsd_amd64.go | 1 - .../x/sys/unix/zerrors_openbsd_arm.go | 1 - .../x/sys/unix/zerrors_openbsd_arm64.go | 1 - .../x/sys/unix/zerrors_openbsd_mips64.go | 1 - .../x/sys/unix/zerrors_openbsd_ppc64.go | 1 - .../x/sys/unix/zerrors_openbsd_riscv64.go | 1 - .../x/sys/unix/zerrors_solaris_amd64.go | 1 - .../x/sys/unix/zerrors_zos_s390x.go | 1 - .../x/sys/unix/zptrace_armnn_linux.go | 2 - .../x/sys/unix/zptrace_mipsnn_linux.go | 2 - .../x/sys/unix/zptrace_mipsnnle_linux.go | 2 - .../x/sys/unix/zptrace_x86_linux.go | 2 - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1 - .../x/sys/unix/zsyscall_aix_ppc64.go | 1 - .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1 - .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1 - .../x/sys/unix/zsyscall_darwin_amd64.go | 1 - .../x/sys/unix/zsyscall_darwin_arm64.go | 1 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1 - .../x/sys/unix/zsyscall_freebsd_386.go | 1 - .../x/sys/unix/zsyscall_freebsd_amd64.go | 1 - .../x/sys/unix/zsyscall_freebsd_arm.go | 1 - .../x/sys/unix/zsyscall_freebsd_arm64.go | 1 - .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1 - .../x/sys/unix/zsyscall_illumos_amd64.go | 1 - .../golang.org/x/sys/unix/zsyscall_linux.go | 11 +- .../x/sys/unix/zsyscall_linux_386.go | 1 - .../x/sys/unix/zsyscall_linux_amd64.go | 1 - .../x/sys/unix/zsyscall_linux_arm.go | 1 - .../x/sys/unix/zsyscall_linux_arm64.go | 1 - .../x/sys/unix/zsyscall_linux_loong64.go | 1 - .../x/sys/unix/zsyscall_linux_mips.go | 1 - .../x/sys/unix/zsyscall_linux_mips64.go | 1 - .../x/sys/unix/zsyscall_linux_mips64le.go | 1 - .../x/sys/unix/zsyscall_linux_mipsle.go | 1 - .../x/sys/unix/zsyscall_linux_ppc.go | 1 - .../x/sys/unix/zsyscall_linux_ppc64.go | 1 - .../x/sys/unix/zsyscall_linux_ppc64le.go | 1 - .../x/sys/unix/zsyscall_linux_riscv64.go | 1 - .../x/sys/unix/zsyscall_linux_s390x.go | 1 - .../x/sys/unix/zsyscall_linux_sparc64.go | 1 - .../x/sys/unix/zsyscall_netbsd_386.go | 1 - .../x/sys/unix/zsyscall_netbsd_amd64.go | 1 - .../x/sys/unix/zsyscall_netbsd_arm.go | 1 - .../x/sys/unix/zsyscall_netbsd_arm64.go | 1 - .../x/sys/unix/zsyscall_openbsd_386.go | 46 +- .../x/sys/unix/zsyscall_openbsd_386.s | 15 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 46 +- .../x/sys/unix/zsyscall_openbsd_amd64.s | 15 + .../x/sys/unix/zsyscall_openbsd_arm.go | 46 +- .../x/sys/unix/zsyscall_openbsd_arm.s | 15 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 46 +- .../x/sys/unix/zsyscall_openbsd_arm64.s | 15 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 46 +- .../x/sys/unix/zsyscall_openbsd_mips64.s | 15 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 46 +- .../x/sys/unix/zsyscall_openbsd_ppc64.s | 18 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 46 +- .../x/sys/unix/zsyscall_openbsd_riscv64.s | 15 + .../x/sys/unix/zsyscall_solaris_amd64.go | 1 - .../x/sys/unix/zsyscall_zos_s390x.go | 1 - .../x/sys/unix/zsysctl_openbsd_386.go | 1 - .../x/sys/unix/zsysctl_openbsd_amd64.go | 1 - .../x/sys/unix/zsysctl_openbsd_arm.go | 1 - .../x/sys/unix/zsysctl_openbsd_arm64.go | 1 - .../x/sys/unix/zsysctl_openbsd_mips64.go | 1 - .../x/sys/unix/zsysctl_openbsd_ppc64.go | 1 - .../x/sys/unix/zsysctl_openbsd_riscv64.go | 1 - .../x/sys/unix/zsysnum_darwin_amd64.go | 1 - .../x/sys/unix/zsysnum_darwin_arm64.go | 1 - .../x/sys/unix/zsysnum_dragonfly_amd64.go | 1 - .../x/sys/unix/zsysnum_freebsd_386.go | 1 - .../x/sys/unix/zsysnum_freebsd_amd64.go | 1 - .../x/sys/unix/zsysnum_freebsd_arm.go | 1 - .../x/sys/unix/zsysnum_freebsd_arm64.go | 1 - .../x/sys/unix/zsysnum_freebsd_riscv64.go | 1 - .../x/sys/unix/zsysnum_linux_386.go | 2 +- .../x/sys/unix/zsysnum_linux_amd64.go | 3 +- .../x/sys/unix/zsysnum_linux_arm.go | 2 +- .../x/sys/unix/zsysnum_linux_arm64.go | 2 +- .../x/sys/unix/zsysnum_linux_loong64.go | 2 +- .../x/sys/unix/zsysnum_linux_mips.go | 2 +- .../x/sys/unix/zsysnum_linux_mips64.go | 2 +- .../x/sys/unix/zsysnum_linux_mips64le.go | 2 +- .../x/sys/unix/zsysnum_linux_mipsle.go | 2 +- .../x/sys/unix/zsysnum_linux_ppc.go | 2 +- .../x/sys/unix/zsysnum_linux_ppc64.go | 2 +- .../x/sys/unix/zsysnum_linux_ppc64le.go | 2 +- .../x/sys/unix/zsysnum_linux_riscv64.go | 2 +- .../x/sys/unix/zsysnum_linux_s390x.go | 2 +- .../x/sys/unix/zsysnum_linux_sparc64.go | 2 +- .../x/sys/unix/zsysnum_netbsd_386.go | 1 - .../x/sys/unix/zsysnum_netbsd_amd64.go | 1 - .../x/sys/unix/zsysnum_netbsd_arm.go | 1 - .../x/sys/unix/zsysnum_netbsd_arm64.go | 1 - .../x/sys/unix/zsysnum_openbsd_386.go | 1 - .../x/sys/unix/zsysnum_openbsd_amd64.go | 1 - .../x/sys/unix/zsysnum_openbsd_arm.go | 1 - .../x/sys/unix/zsysnum_openbsd_arm64.go | 1 - .../x/sys/unix/zsysnum_openbsd_mips64.go | 1 - .../x/sys/unix/zsysnum_openbsd_ppc64.go | 1 - .../x/sys/unix/zsysnum_openbsd_riscv64.go | 1 - .../x/sys/unix/zsysnum_zos_s390x.go | 1 - .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 1 - .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 1 - .../x/sys/unix/ztypes_darwin_amd64.go | 1 - .../x/sys/unix/ztypes_darwin_arm64.go | 1 - .../x/sys/unix/ztypes_dragonfly_amd64.go | 1 - .../x/sys/unix/ztypes_freebsd_386.go | 1 - .../x/sys/unix/ztypes_freebsd_amd64.go | 1 - .../x/sys/unix/ztypes_freebsd_arm.go | 1 - .../x/sys/unix/ztypes_freebsd_arm64.go | 1 - .../x/sys/unix/ztypes_freebsd_riscv64.go | 1 - vendor/golang.org/x/sys/unix/ztypes_linux.go | 13 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 1 - .../x/sys/unix/ztypes_linux_amd64.go | 1 - .../golang.org/x/sys/unix/ztypes_linux_arm.go | 1 - .../x/sys/unix/ztypes_linux_arm64.go | 1 - .../x/sys/unix/ztypes_linux_loong64.go | 1 - .../x/sys/unix/ztypes_linux_mips.go | 1 - .../x/sys/unix/ztypes_linux_mips64.go | 1 - .../x/sys/unix/ztypes_linux_mips64le.go | 1 - .../x/sys/unix/ztypes_linux_mipsle.go | 1 - .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 1 - .../x/sys/unix/ztypes_linux_ppc64.go | 1 - .../x/sys/unix/ztypes_linux_ppc64le.go | 1 - .../x/sys/unix/ztypes_linux_riscv64.go | 1 - .../x/sys/unix/ztypes_linux_s390x.go | 1 - .../x/sys/unix/ztypes_linux_sparc64.go | 1 - .../x/sys/unix/ztypes_netbsd_386.go | 1 - .../x/sys/unix/ztypes_netbsd_amd64.go | 1 - .../x/sys/unix/ztypes_netbsd_arm.go | 1 - .../x/sys/unix/ztypes_netbsd_arm64.go | 1 - .../x/sys/unix/ztypes_openbsd_386.go | 1 - .../x/sys/unix/ztypes_openbsd_amd64.go | 1 - .../x/sys/unix/ztypes_openbsd_arm.go | 1 - .../x/sys/unix/ztypes_openbsd_arm64.go | 1 - .../x/sys/unix/ztypes_openbsd_mips64.go | 1 - .../x/sys/unix/ztypes_openbsd_ppc64.go | 1 - .../x/sys/unix/ztypes_openbsd_riscv64.go | 1 - .../x/sys/unix/ztypes_solaris_amd64.go | 1 - .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 1 - vendor/golang.org/x/sys/windows/aliases.go | 1 - vendor/golang.org/x/sys/windows/empty.s | 1 - vendor/golang.org/x/sys/windows/eventlog.go | 1 - vendor/golang.org/x/sys/windows/mksyscall.go | 1 - vendor/golang.org/x/sys/windows/race.go | 1 - vendor/golang.org/x/sys/windows/race0.go | 1 - vendor/golang.org/x/sys/windows/service.go | 1 - vendor/golang.org/x/sys/windows/str.go | 1 - vendor/golang.org/x/sys/windows/syscall.go | 1 - .../x/sys/windows/syscall_windows.go | 4 +- .../golang.org/x/sys/windows/types_windows.go | 28 +- .../x/sys/windows/zsyscall_windows.go | 9 + .../x/text/secure/bidirule/bidirule10.0.0.go | 1 - .../x/text/secure/bidirule/bidirule9.0.0.go | 1 - .../x/text/unicode/bidi/tables10.0.0.go | 1 - .../x/text/unicode/bidi/tables11.0.0.go | 1 - .../x/text/unicode/bidi/tables12.0.0.go | 1 - .../x/text/unicode/bidi/tables13.0.0.go | 1 - .../x/text/unicode/bidi/tables15.0.0.go | 1 - .../x/text/unicode/bidi/tables9.0.0.go | 1 - .../x/text/unicode/norm/tables10.0.0.go | 1 - .../x/text/unicode/norm/tables11.0.0.go | 1 - .../x/text/unicode/norm/tables12.0.0.go | 1 - .../x/text/unicode/norm/tables13.0.0.go | 1 - .../x/text/unicode/norm/tables15.0.0.go | 1 - .../x/text/unicode/norm/tables9.0.0.go | 1 - .../google.golang.org/api/internal/version.go | 2 +- .../api/storage/v1/storage-api.json | 320 ++++- .../api/storage/v1/storage-gen.go | 1208 ++++++++++++++++- .../api/transport/grpc/dial.go | 26 + vendor/modules.txt | 92 +- 514 files changed, 4385 insertions(+), 1649 deletions(-) create mode 100644 vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go create mode 100644 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go create mode 100644 vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go delete mode 100644 vendor/github.com/felixge/httpsnoop/.travis.yml create mode 100644 vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go delete mode 100644 vendor/golang.org/x/net/http2/go111.go delete mode 100644 vendor/golang.org/x/net/http2/go115.go delete mode 100644 vendor/golang.org/x/net/http2/go118.go delete mode 100644 vendor/golang.org/x/net/http2/not_go111.go delete mode 100644 vendor/golang.org/x/net/http2/not_go115.go delete mode 100644 vendor/golang.org/x/net/http2/not_go118.go diff --git a/go.mod b/go.mod index a30d80d93a..761fcab996 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ go 1.20 replace golang.org/x/exp => golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 require ( - cloud.google.com/go/storage v1.34.1 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 + cloud.google.com/go/storage v1.35.1 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 github.com/VictoriaMetrics/fastcache v1.12.1 @@ -16,10 +16,10 @@ require ( github.com/VictoriaMetrics/fasthttp v1.2.0 github.com/VictoriaMetrics/metrics v1.24.0 github.com/VictoriaMetrics/metricsql v0.69.0 - github.com/aws/aws-sdk-go-v2 v1.22.1 - github.com/aws/aws-sdk-go-v2/config v1.22.0 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.1 - github.com/aws/aws-sdk-go-v2/service/s3 v1.42.0 + github.com/aws/aws-sdk-go-v2 v1.22.2 + github.com/aws/aws-sdk-go-v2/config v1.23.0 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5 + github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1 github.com/bmatcuk/doublestar/v4 v4.6.1 github.com/cespare/xxhash/v2 v2.2.0 github.com/cheggaaa/pb/v3 v3.1.4 @@ -36,10 +36,10 @@ require ( github.com/valyala/gozstd v1.20.1 github.com/valyala/histogram v1.2.0 github.com/valyala/quicktemplate v1.7.0 - golang.org/x/net v0.17.0 - golang.org/x/oauth2 v0.13.0 - golang.org/x/sys v0.13.0 - google.golang.org/api v0.149.0 + golang.org/x/net v0.18.0 + golang.org/x/oauth2 v0.14.0 + golang.org/x/sys v0.14.0 + google.golang.org/api v0.150.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -53,33 +53,33 @@ require ( github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/VividCortex/ewma v1.2.0 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/aws/aws-sdk-go v1.47.2 // indirect + github.com/aws/aws-sdk-go v1.47.9 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 // indirect github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang-jwt/jwt/v5 v5.0.0 // indirect + github.com/golang-jwt/jwt/v5 v5.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -114,23 +114,23 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0-rcv0017 // indirect go.opentelemetry.io/collector/semconv v0.88.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 // indirect + go.opentelemetry.io/otel v1.20.0 // indirect + go.opentelemetry.io/otel/metric v1.20.0 // indirect + go.opentelemetry.io/otel/trace v1.20.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index d50fc5b621..24896e7f16 100644 --- a/go.sum +++ b/go.sum @@ -38,11 +38,11 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.34.1 h1:H2Af2dU5J0PF7A5B+ECFIce+RqxVnrVilO+cu0TS3MI= -cloud.google.com/go/storage v1.34.1/go.mod h1:VN1ElqqvR9adg1k9xlkUJ55cMOP1/QjnNNuT5xQL6dY= +cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= @@ -85,44 +85,44 @@ github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.47.2 h1:KEdO2PbjfEBmHvnEwbYEpr65ZIkmwK5aB85Gj19ASuA= -github.com/aws/aws-sdk-go v1.47.2/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.22.1 h1:sjnni/AuoTXxHitsIdT0FwmqUuNUuHtufcVDErVFT9U= -github.com/aws/aws-sdk-go-v2 v1.22.1/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= +github.com/aws/aws-sdk-go v1.47.9 h1:rarTsos0mA16q+huicGx0e560aYRtOucV5z2Mw23JRY= +github.com/aws/aws-sdk-go v1.47.9/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 h1:hHgLiIrTRtddC0AKcJr5s7i/hLgcpTt+q/FKxf1Zayk= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0/go.mod h1:w4I/v3NOWgD+qvs1NPEwhd++1h3XPHFaVxasfY6HlYQ= -github.com/aws/aws-sdk-go-v2/config v1.22.0 h1:9Mm99OalzZRz0ab5fpodMoHBApHS6pqRNp3M9NmzvDg= -github.com/aws/aws-sdk-go-v2/config v1.22.0/go.mod h1:2eWgw5lps8fKI7LZVTrRTYP6HE6k/uEFUuTSHfXwqP0= -github.com/aws/aws-sdk-go-v2/credentials v1.15.1 h1:hmf6lAm9hk7uLCfapZn/jL05lm6Uwdbn1B0fgjyuf4M= -github.com/aws/aws-sdk-go-v2/credentials v1.15.1/go.mod h1:QTcHga3ZbQOneJuxmGBOCxiClxmp+TlvmjFexAnJ790= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 h1:gIeH4+o1MN/caGBWjoGQTUTIu94xD6fI5B2+TcwBf70= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2/go.mod h1:wLyMIo/zPOhQhPXTddpfdkSleyigtFi8iMnC+2m/SK4= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.1 h1:ULswbgGNVrW8zEhkCNwrwXrs1mUvy2JTqWaCRsD2ZZw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.1/go.mod h1:pAXgsDPk1rRwwfkz8/9ISO75vXEHqTGIgbLhGqqQ1GY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 h1:fi1ga6WysOyYb5PAf3Exd6B5GiSNpnZim4h1rhlBqx0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1/go.mod h1:V5CY8wNurvPUibTi9mwqUqpiFZ5LnioKWIFUDtIzdI8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 h1:ZpaV/j48RlPc4AmOZuPv22pJliXjXq8/reL63YzyFnw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1/go.mod h1:R8aXraabD2e3qv1csxM14/X9WF4wFMIY0kH4YEtYD5M= -github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 h1:DqOQvIfmGkXZUVJnl9VRk0AnxyS59tCtX9k1Pyss4Ak= -github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.1 h1:vzYLDkwTw4CY0vUk84MeSufRf8XIsC/GsoIFXD60sTg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.1/go.mod h1:ToBFBnjeGR2ruMx8IWp/y7vSK3Irj5/oPwifruiqoOM= +github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= +github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5 h1:P/xwilRdRLLg1PzfviDq0Zjb74weOoDCrh8J5lRCQAY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5/go.mod h1:9cLHf2IwX6Jyw0KjLVbXly/g6DmzExgUzB1w/AQPGQE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2 h1:pyVrNAf7Hwz0u39dLKN5t+n0+K/3rMYKuiOoIum3AsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2/go.mod h1:mydrfOb9uiOYCxuCPR8YHQNQyGQwUQ7gPMZGBKbH8NY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.1 h1:15FUCJzAP9Y25nioTqTrGlZmhOtthaXBWlt4pS+d3Xo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.1/go.mod h1:5655NW53Un6l7JzkI6AA3rZvf0m532cSnLThA1fVXcA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 h1:2OXw3ppu1XsB6rqKEMV4tnecTjIY3PRV2U6IP6KPJQo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1/go.mod h1:FZB4AdakIqW/yERVdGJA6Z9jraax1beXfhBBnK2wwR8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.1 h1:dnl0klXYX9EKpzZbWlH5LJL+YTcEZcJEMPFFr/rAHUQ= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.1/go.mod h1:Mfk/9Joso4tCQYzM4q4HRUIqwln8lnIIMB/OE8Zebdc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.42.0 h1:u0YoSrxjr3Lm+IqIlRAV+4YTFwkXjyB9db9CfUFge2w= -github.com/aws/aws-sdk-go-v2/service/s3 v1.42.0/go.mod h1:98EIdRu+BNsdqITsXfy+57TZfwlUQC9aDn9a9qoo90U= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 h1:I/Oh3IxGPfHXiGnwM54TD6hNr/8TlUrBXAtTyGhR+zw= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.0/go.mod h1:H6NCMvDBqA+CvIaXzaSqM6LWtzv9BzZrqBOqz+PzRF8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 h1:irbXQkfVYIRaewYSXcu4yVk0m2T+JzZd0dkop7FjmO0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0/go.mod h1:4wPNCkM22+oRe71oydP66K50ojDUC33XutSMi2pEF/M= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 h1:sYIFy8tm1xQwRvVQ4CRuBGXKIg9sHNuG6+3UAQuoujk= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.0/go.mod h1:S/LOQUeYDfJeJpFCIJDMjy7dwL4aA33HUdVi+i7uH8k= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2 h1:f2LhPofnjcdOQKRtumKjMvIHkfSQ8aH/rwKUDEQ/SB4= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2/go.mod h1:q+xX0H4OfuWDuBy7y/LDi4v8IBOWuF+vtp8Z6ex+lw4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2 h1:gbIaOzpXixUpoPK+js/bCBK1QBDXM22SigsnzGZio0U= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2/go.mod h1:p+S7RNbdGN8qgHDSg2SCQJ9FeMAmvcETQiVpeGhYnNM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1 h1:o6MCcX1rJW8Y3g+hvg2xpjF6JR6DftuYhfl3Nc1WV9Q= +github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1/go.mod h1:UDtxEWbREX6y4KREapT+jjtjoH0TiVSS6f5nfaY1UaM= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -165,10 +165,10 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -196,8 +196,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.1.0 h1:UGKbA/IPjtS6zLcdB7i5TyACMgSbOTiR8qzXgw8HWQU= +github.com/golang-jwt/jwt/v5 v5.1.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -461,14 +461,14 @@ go.opentelemetry.io/collector/pdata v1.0.0-rcv0017 h1:AgALhc2VenoA5l1DvTdg7mkzaB go.opentelemetry.io/collector/pdata v1.0.0-rcv0017/go.mod h1:Rv9fOclA5AtM/JGm0d4jBOIAo1+jBA13UT5Bx0ovXi4= go.opentelemetry.io/collector/semconv v0.88.0 h1:8TVP4hYaUC87S6CCLKNoSxsUE0ChldE4vqotvNHHUnE= go.opentelemetry.io/collector/semconv v0.88.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 h1:1eHu3/pUSWaOgltNK3WJFaywKsTIr/PwvHyDmi0lQA0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0/go.mod h1:HyABWq60Uy1kjJSa2BVOxUVao8Cdick5AWSKPutqy6U= +go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= +go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= +go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= +go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= +go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -484,8 +484,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -541,16 +541,16 @@ golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -562,8 +562,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -609,12 +609,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -624,13 +624,13 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -694,8 +694,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -733,12 +733,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/vendor/cloud.google.com/go/storage/CHANGES.md b/vendor/cloud.google.com/go/storage/CHANGES.md index f1d51afb71..30ee040f76 100644 --- a/vendor/cloud.google.com/go/storage/CHANGES.md +++ b/vendor/cloud.google.com/go/storage/CHANGES.md @@ -1,6 +1,20 @@ # Changes +## [1.35.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.35.0...storage/v1.35.1) (2023-11-09) + + +### Bug Fixes + +* **storage:** Rename aux.go to auxiliary.go fixing windows build ([ba23673](https://github.com/googleapis/google-cloud-go/commit/ba23673da7707c31292e4aa29d65b7ac1446d4a6)) + +## [1.35.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.1...storage/v1.35.0) (2023-11-09) + + +### Features + +* **storage:** Change gRPC writes to use bi-directional streams ([#8930](https://github.com/googleapis/google-cloud-go/issues/8930)) ([3e23a36](https://github.com/googleapis/google-cloud-go/commit/3e23a364b1a20c4fda7aef257e4136586ec769a4)) + ## [1.34.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.0...storage/v1.34.1) (2023-11-01) diff --git a/vendor/cloud.google.com/go/storage/grpc_client.go b/vendor/cloud.google.com/go/storage/grpc_client.go index 3a5cd40888..99dfba4677 100644 --- a/vendor/cloud.google.com/go/storage/grpc_client.go +++ b/vendor/cloud.google.com/go/storage/grpc_client.go @@ -1066,7 +1066,7 @@ func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storage } } - o, off, finalized, err := gw.uploadBuffer(recvd, offset, doneReading) + o, off, err := gw.uploadBuffer(recvd, offset, doneReading) if err != nil { err = checkCanceled(err) errorf(err) @@ -1085,9 +1085,9 @@ func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storage progress(offset) } - // When we are done reading data and the chunk has been finalized, - // we are done. - if doneReading && finalized { + // When we are done reading data without errors, set the object and + // finish. + if doneReading { // Build Object from server's response. setObj(newObjectFromProto(o)) return @@ -1537,7 +1537,7 @@ type gRPCWriter struct { chunkSize int // The gRPC client-stream used for sending buffers. - stream storagepb.Storage_WriteObjectClient + stream storagepb.Storage_BidiWriteObjectClient // The Resumable Upload ID started by a gRPC-based Writer. upid string @@ -1581,45 +1581,56 @@ func (w *gRPCWriter) queryProgress() (int64, error) { return persistedSize, err } -// uploadBuffer opens a Write stream and uploads the buffer at the given offset (if -// uploading a chunk for a resumable uploadBuffer), and will mark the write as -// finished if we are done receiving data from the user. The resulting write -// offset after uploading the buffer is returned, as well as a boolean -// indicating if the Object has been finalized. If it has been finalized, the -// final Object will be returned as well. Finalizing the upload is primarily -// important for Resumable Uploads. A simple or multi-part upload will always -// be finalized once the entire buffer has been written. -func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*storagepb.Object, int64, bool, error) { - var err error - var finishWrite bool - var sent, limit int = 0, maxPerMessageWriteSize +// uploadBuffer uploads the buffer at the given offset using a bi-directional +// Write stream. It will open a new stream if necessary (on the first call or +// after resuming from failure). The resulting write offset after uploading the +// buffer is returned, as well as well as the final Object if the upload is +// completed. +// +// Returns object, persisted size, and any error that is not retriable. +func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*storagepb.Object, int64, error) { var shouldRetry = ShouldRetry if w.settings.retry != nil && w.settings.retry.shouldRetry != nil { shouldRetry = w.settings.retry.shouldRetry } - offset := start + + var err error + var lastWriteOfEntireObject bool + + sent := 0 + writeOffset := start + toWrite := w.buf[:recvd] + + // Send a request with as many bytes as possible. + // Loop until all bytes are sent. for { - // This indicates that this is the last message and the remaining - // data fits in one message. - belowLimit := recvd-sent <= limit - if belowLimit { - limit = recvd - sent + bytesNotYetSent := recvd - sent + remainingDataFitsInSingleReq := bytesNotYetSent <= maxPerMessageWriteSize + + if remainingDataFitsInSingleReq && doneReading { + lastWriteOfEntireObject = true } - if belowLimit && doneReading { - finishWrite = true + + // Send the maximum amount of bytes we can, unless we don't have that many. + bytesToSendInCurrReq := maxPerMessageWriteSize + if remainingDataFitsInSingleReq { + bytesToSendInCurrReq = bytesNotYetSent } // Prepare chunk section for upload. - data := toWrite[sent : sent+limit] - req := &storagepb.WriteObjectRequest{ - Data: &storagepb.WriteObjectRequest_ChecksummedData{ + data := toWrite[sent : sent+bytesToSendInCurrReq] + + req := &storagepb.BidiWriteObjectRequest{ + Data: &storagepb.BidiWriteObjectRequest_ChecksummedData{ ChecksummedData: &storagepb.ChecksummedData{ Content: data, }, }, - WriteOffset: offset, - FinishWrite: finishWrite, + WriteOffset: writeOffset, + FinishWrite: lastWriteOfEntireObject, + Flush: remainingDataFitsInSingleReq, + StateLookup: remainingDataFitsInSingleReq, } // Open a new stream if necessary and set the first_message field on @@ -1628,19 +1639,20 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st if w.stream == nil { hds := []string{"x-goog-request-params", fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(w.bucket))} ctx := gax.InsertMetadataIntoOutgoingContext(w.ctx, hds...) - w.stream, err = w.c.raw.WriteObject(ctx) + + w.stream, err = w.c.raw.BidiWriteObject(ctx) if err != nil { - return nil, 0, false, err + return nil, 0, err } - if w.upid != "" { - req.FirstMessage = &storagepb.WriteObjectRequest_UploadId{UploadId: w.upid} - } else { + if w.upid != "" { // resumable upload + req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: w.upid} + } else { // non-resumable spec, err := w.writeObjectSpec() if err != nil { - return nil, 0, false, err + return nil, 0, err } - req.FirstMessage = &storagepb.WriteObjectRequest_WriteObjectSpec{ + req.FirstMessage = &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ WriteObjectSpec: spec, } req.CommonObjectRequestParams = toProtoCommonObjectRequestParams(w.encryptionKey) @@ -1650,15 +1662,24 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st // on the *last* message of the stream (instead of the first). req.ObjectChecksums = toProtoChecksums(w.sendCRC32C, w.attrs) } - } err = w.stream.Send(req) if err == io.EOF { // err was io.EOF. The client-side of a stream only gets an EOF on Send // when the backend closes the stream and wants to return an error - // status. Closing the stream receives the status as an error. - _, err = w.stream.CloseAndRecv() + // status. + + // Receive from the stream Recv() until it returns a non-nil error + // to receive the server's status as an error. We may get multiple + // messages before the error due to buffering. + err = nil + for err == nil { + _, err = w.stream.Recv() + } + // Drop the stream reference as a new one will need to be created if + // we retry. + w.stream = nil // Drop the stream reference as a new one will need to be created if // we can retry the upload @@ -1666,26 +1687,28 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st // Retriable errors mean we should start over and attempt to // resend the entire buffer via a new stream. - // If not retriable, falling through will return the error received - // from closing the stream. + // If not retriable, falling through will return the error received. if shouldRetry(err) { - sent = 0 - finishWrite = false // TODO: Add test case for failure modes of querying progress. - offset, err = w.determineOffset(start) - if err == nil { - continue + writeOffset, err = w.determineOffset(start) + if err != nil { + return nil, 0, err } + sent = int(writeOffset) - int(start) + + // Continue sending requests, opening a new stream and resending + // any bytes not yet persisted as per QueryWriteStatus + continue } } if err != nil { - return nil, 0, false, err + return nil, 0, err } // Update the immediate stream's sent total and the upload offset with // the data sent. sent += len(data) - offset += int64(len(data)) + writeOffset += int64(len(data)) // Not done sending data, do not attempt to commit it yet, loop around // and send more data. @@ -1694,31 +1717,81 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st } // The buffer has been uploaded and there is still more data to be - // uploaded, but this is not a resumable upload session. Therefore - // keep the stream open and don't commit yet. - if !finishWrite && w.chunkSize == 0 { - return nil, offset, false, nil + // uploaded, but this is not a resumable upload session. Therefore, + // don't check persisted data. + if !lastWriteOfEntireObject && w.chunkSize == 0 { + return nil, writeOffset, nil } - // Done sending data. Close the stream to "commit" the data sent. - resp, finalized, err := w.commit() + // Done sending data (remainingDataFitsInSingleReq should == true if we + // reach this code). Receive from the stream to confirm the persisted data. + resp, err := w.stream.Recv() + // Retriable errors mean we should start over and attempt to // resend the entire buffer via a new stream. // If not retriable, falling through will return the error received // from closing the stream. if shouldRetry(err) { - sent = 0 - finishWrite = false - offset, err = w.determineOffset(start) - if err == nil { - continue + writeOffset, err = w.determineOffset(start) + if err != nil { + return nil, 0, err } + sent = int(writeOffset) - int(start) + + // Drop the stream reference as a new one will need to be created. + w.stream = nil + + continue } if err != nil { - return nil, 0, false, err + return nil, 0, err } - return resp.GetResource(), offset, finalized, nil + // Confirm the persisted data if we have not finished uploading the object. + if !lastWriteOfEntireObject { + if resp.GetPersistedSize() != writeOffset { + // Retry if not all bytes were persisted. + writeOffset = resp.GetPersistedSize() + sent = int(writeOffset) - int(start) + continue + } + } else { + // If the object is done uploading, close the send stream to signal + // to the server that we are done sending so that we can receive + // from the stream without blocking. + err = w.stream.CloseSend() + if err != nil { + // CloseSend() retries the send internally. It never returns an + // error in the current implementation, but we check it anyway in + // case that it does in the future. + return nil, 0, err + } + + // Stream receives do not block once send is closed, but we may not + // receive the response with the object right away; loop until we + // receive the object or error out. + var obj *storagepb.Object + for obj == nil { + resp, err := w.stream.Recv() + if err != nil { + return nil, 0, err + } + + obj = resp.GetResource() + } + + // Even though we received the object response, continue reading + // until we receive a non-nil error, to ensure the stream does not + // leak even if the context isn't cancelled. See: + // https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream + for err == nil { + _, err = w.stream.Recv() + } + + return obj, writeOffset, nil + } + + return nil, writeOffset, nil } } @@ -1738,26 +1811,6 @@ func (w *gRPCWriter) determineOffset(offset int64) (int64, error) { return offset, nil } -// commit closes the stream to commit the data sent and potentially receive -// the finalized object if finished uploading. If the last request sent -// indicated that writing was finished, the Object will be finalized and -// returned. If not, then the Object will be nil, and the boolean returned will -// be false. -func (w *gRPCWriter) commit() (*storagepb.WriteObjectResponse, bool, error) { - finalized := true - resp, err := w.stream.CloseAndRecv() - if err == io.EOF { - // Closing a stream for a resumable upload finish_write = false results - // in an EOF which can be ignored, as we aren't done uploading yet. - finalized = false - err = nil - } - // Drop the stream reference as it has been closed. - w.stream = nil - - return resp, finalized, err -} - // writeObjectSpec constructs a WriteObjectSpec proto using the Writer's // ObjectAttrs and applies its Conditions. This is only used for gRPC. func (w *gRPCWriter) writeObjectSpec() (*storagepb.WriteObjectSpec, error) { diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go b/vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go new file mode 100644 index 0000000000..c6fd4b341f --- /dev/null +++ b/vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go @@ -0,0 +1,210 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go_gapic. DO NOT EDIT. + +package storage + +import ( + storagepb "cloud.google.com/go/storage/internal/apiv2/storagepb" + "google.golang.org/api/iterator" +) + +// BucketIterator manages a stream of *storagepb.Bucket. +type BucketIterator struct { + items []*storagepb.Bucket + pageInfo *iterator.PageInfo + nextFunc func() error + + // Response is the raw response for the current page. + // It must be cast to the RPC response type. + // Calling Next() or InternalFetch() updates this value. + Response interface{} + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Bucket, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *BucketIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *BucketIterator) Next() (*storagepb.Bucket, error) { + var item *storagepb.Bucket + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *BucketIterator) bufLen() int { + return len(it.items) +} + +func (it *BucketIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// HmacKeyMetadataIterator manages a stream of *storagepb.HmacKeyMetadata. +type HmacKeyMetadataIterator struct { + items []*storagepb.HmacKeyMetadata + pageInfo *iterator.PageInfo + nextFunc func() error + + // Response is the raw response for the current page. + // It must be cast to the RPC response type. + // Calling Next() or InternalFetch() updates this value. + Response interface{} + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*storagepb.HmacKeyMetadata, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *HmacKeyMetadataIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *HmacKeyMetadataIterator) Next() (*storagepb.HmacKeyMetadata, error) { + var item *storagepb.HmacKeyMetadata + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *HmacKeyMetadataIterator) bufLen() int { + return len(it.items) +} + +func (it *HmacKeyMetadataIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// NotificationConfigIterator manages a stream of *storagepb.NotificationConfig. +type NotificationConfigIterator struct { + items []*storagepb.NotificationConfig + pageInfo *iterator.PageInfo + nextFunc func() error + + // Response is the raw response for the current page. + // It must be cast to the RPC response type. + // Calling Next() or InternalFetch() updates this value. + Response interface{} + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*storagepb.NotificationConfig, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *NotificationConfigIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *NotificationConfigIterator) Next() (*storagepb.NotificationConfig, error) { + var item *storagepb.NotificationConfig + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *NotificationConfigIterator) bufLen() int { + return len(it.items) +} + +func (it *NotificationConfigIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// ObjectIterator manages a stream of *storagepb.Object. +type ObjectIterator struct { + items []*storagepb.Object + pageInfo *iterator.PageInfo + nextFunc func() error + + // Response is the raw response for the current page. + // It must be cast to the RPC response type. + // Calling Next() or InternalFetch() updates this value. + Response interface{} + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Object, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *ObjectIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *ObjectIterator) Next() (*storagepb.Object, error) { + var item *storagepb.Object + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *ObjectIterator) bufLen() int { + return len(it.items) +} + +func (it *ObjectIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/doc.go b/vendor/cloud.google.com/go/storage/internal/apiv2/doc.go index c50b0fb0e5..8159589ea9 100644 --- a/vendor/cloud.google.com/go/storage/internal/apiv2/doc.go +++ b/vendor/cloud.google.com/go/storage/internal/apiv2/doc.go @@ -76,15 +76,32 @@ // // TODO: Handle error. // } // defer c.Close() -// -// req := &storagepb.DeleteBucketRequest{ -// // TODO: Fill request struct fields. -// // See https://pkg.go.dev/cloud.google.com/go/storage/internal/apiv2/storagepb#DeleteBucketRequest. -// } -// err = c.DeleteBucket(ctx, req) +// stream, err := c.BidiWriteObject(ctx) // if err != nil { // // TODO: Handle error. // } +// go func() { +// reqs := []*storagepb.BidiWriteObjectRequest{ +// // TODO: Create requests. +// } +// for _, req := range reqs { +// if err := stream.Send(req); err != nil { +// // TODO: Handle error. +// } +// } +// stream.CloseSend() +// }() +// for { +// resp, err := stream.Recv() +// if err == io.EOF { +// break +// } +// if err != nil { +// // TODO: handle error. +// } +// // TODO: Use resp. +// _ = resp +// } // // # Use of Context // diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go b/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go index 0de7e3fb43..6481995060 100644 --- a/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go +++ b/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go @@ -1921,191 +1921,3 @@ func (c *gRPCClient) UpdateHmacKey(ctx context.Context, req *storagepb.UpdateHma } return resp, nil } - -// BucketIterator manages a stream of *storagepb.Bucket. -type BucketIterator struct { - items []*storagepb.Bucket - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Bucket, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *BucketIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *BucketIterator) Next() (*storagepb.Bucket, error) { - var item *storagepb.Bucket - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *BucketIterator) bufLen() int { - return len(it.items) -} - -func (it *BucketIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// HmacKeyMetadataIterator manages a stream of *storagepb.HmacKeyMetadata. -type HmacKeyMetadataIterator struct { - items []*storagepb.HmacKeyMetadata - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*storagepb.HmacKeyMetadata, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *HmacKeyMetadataIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *HmacKeyMetadataIterator) Next() (*storagepb.HmacKeyMetadata, error) { - var item *storagepb.HmacKeyMetadata - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *HmacKeyMetadataIterator) bufLen() int { - return len(it.items) -} - -func (it *HmacKeyMetadataIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// NotificationConfigIterator manages a stream of *storagepb.NotificationConfig. -type NotificationConfigIterator struct { - items []*storagepb.NotificationConfig - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*storagepb.NotificationConfig, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *NotificationConfigIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *NotificationConfigIterator) Next() (*storagepb.NotificationConfig, error) { - var item *storagepb.NotificationConfig - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *NotificationConfigIterator) bufLen() int { - return len(it.items) -} - -func (it *NotificationConfigIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// ObjectIterator manages a stream of *storagepb.Object. -type ObjectIterator struct { - items []*storagepb.Object - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Object, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *ObjectIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *ObjectIterator) Next() (*storagepb.Object, error) { - var item *storagepb.Object - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *ObjectIterator) bufLen() int { - return len(it.items) -} - -func (it *ObjectIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/storage/internal/version.go b/vendor/cloud.google.com/go/storage/internal/version.go index 4a81ada09d..eca9b294aa 100644 --- a/vendor/cloud.google.com/go/storage/internal/version.go +++ b/vendor/cloud.google.com/go/storage/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.34.1" +const Version = "1.35.1" diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md index b618676c59..aa30abf373 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md @@ -1,13 +1,43 @@ # Release History +## 1.9.0 (2023-11-06) + +### Breaking Changes +> These changes affect only code written against previous beta versions of `v1.7.0` and `v1.8.0` +* The function `NewTokenCredential` has been removed from the `fake` package. Use a literal `&fake.TokenCredential{}` instead. +* The field `TracingNamespace` in `runtime.PipelineOptions` has been replaced by `TracingOptions`. + +### Bugs Fixed + +* Fixed an issue that could cause some allowed HTTP header values to not show up in logs. +* Include error text instead of error type in traces when the transport returns an error. +* Fixed an issue that could cause an HTTP/2 request to hang when the TCP connection becomes unresponsive. +* Block key and SAS authentication for non TLS protected endpoints. +* Passing a `nil` credential value will no longer cause a panic. Instead, the authentication is skipped. +* Calling `Error` on a zero-value `azcore.ResponseError` will no longer panic. +* Fixed an issue in `fake.PagerResponder[T]` that would cause a trailing error to be omitted when iterating over pages. +* Context values created by `azcore` will no longer flow across disjoint HTTP requests. + +### Other Changes + +* Skip generating trace info for no-op tracers. +* The `clientName` paramater in client constructors has been renamed to `moduleName`. + +## 1.9.0-beta.1 (2023-10-05) + +### Other Changes + +* The beta features for tracing and fakes have been reinstated. + ## 1.8.0 (2023-10-05) ### Features Added -* Added `Claims` and `EnableCAE` fields to `policy.TokenRequestOptions`. -* ARM bearer token policy handles CAE challenges. -* `messaging/CloudEvent` allows you to serialize/deserialize CloudEvents, as described in the CloudEvents 1.0 specification: [link](https://github.com/cloudevents/spec) -* Added functions `FetcherForNextLink` and `EncodeQueryParams` along with `FetcherForNextLinkOptions` to the `runtime` package to centralize creation of `Pager[T].Fetcher` from a next link URL. +* This includes the following features from `v1.8.0-beta.N` releases. + * Claims and CAE for authentication. + * New `messaging` package. + * Various helpers in the `runtime` package. + * Deprecation of `runtime.With*` funcs and their replacements in the `policy` package. * Added types `KeyCredential` and `SASCredential` to the `azcore` package. * Includes their respective constructor functions. * Added types `KeyCredentialPolicy` and `SASCredentialPolicy` to the `azcore/runtime` package. @@ -24,11 +54,24 @@ ### Other Changes +* Updated dependencies. + +## 1.8.0-beta.3 (2023-09-07) + +### Features Added + +* Added function `FetcherForNextLink` and `FetcherForNextLinkOptions` to the `runtime` package to centralize creation of `Pager[T].Fetcher` from a next link URL. + +### Bugs Fixed + +* Suppress creating spans for nested SDK API calls. The HTTP span will be a child of the outer API span. + +### Other Changes + * The following functions in the `runtime` package are now exposed from the `policy` package, and the `runtime` versions have been deprecated. * `WithCaptureResponse` * `WithHTTPHeader` * `WithRetryOptions` -* Updated dependencies. ## 1.7.2 (2023-09-06) @@ -36,12 +79,41 @@ * Fix default HTTP transport to work in WASM modules. +## 1.8.0-beta.2 (2023-08-14) + +### Features Added + +* Added function `SanitizePagerPollerPath` to the `server` package to centralize sanitization and formalize the contract. +* Added `TokenRequestOptions.EnableCAE` to indicate whether to request a CAE token. + +### Breaking Changes + +> This change affects only code written against beta version `v1.8.0-beta.1`. +* `messaging.CloudEvent` deserializes JSON objects as `[]byte`, instead of `json.RawMessage`. See the documentation for CloudEvent.Data for more information. + +> This change affects only code written against beta versions `v1.7.0-beta.2` and `v1.8.0-beta.1`. +* Removed parameter from method `Span.End()` and its type `tracing.SpanEndOptions`. This API GA'ed in `v1.2.0` so we cannot change it. + +### Bugs Fixed + +* Propagate any query parameters when constructing a fake poller and/or injecting next links. + ## 1.7.1 (2023-08-14) ## Bugs Fixed * Enable TLS renegotiation in the default transport policy. +## 1.8.0-beta.1 (2023-07-12) + +### Features Added + +- `messaging/CloudEvent` allows you to serialize/deserialize CloudEvents, as described in the CloudEvents 1.0 specification: [link](https://github.com/cloudevents/spec) + +### Other Changes + +* The beta features for CAE, tracing, and fakes have been reinstated. + ## 1.7.0 (2023-07-12) ### Features Added diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go index 9f051ba4ae..8eef8633a7 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go @@ -84,7 +84,9 @@ func IsNullValue[T any](v T) bool { return false } -// ClientOptions contains configuration settings for a client's pipeline. +// ClientOptions contains optional settings for a client's pipeline. +// Instances can be shared across calls to SDK client constructors when uniform configuration is desired. +// Zero-value fields will have their specified default values applied during use. type ClientOptions = policy.ClientOptions // Client is a basic HTTP client. It consists of a pipeline and tracing provider. @@ -93,22 +95,17 @@ type Client struct { tr tracing.Tracer // cached on the client to support shallow copying with new values - tp tracing.Provider - modVer string + tp tracing.Provider + modVer string + namespace string } // NewClient creates a new Client instance with the provided values. -// - clientName - the fully qualified name of the client ("module/package.Client"); this is used by the telemetry policy and tracing provider. -// if module and package are the same value, the "module/" prefix can be omitted. -// - moduleVersion - the semantic version of the containing module; used by the telemetry policy +// - moduleName - the fully qualified name of the module where the client is defined; used by the telemetry policy and tracing provider. +// - moduleVersion - the semantic version of the module; used by the telemetry policy and tracing provider. // - plOpts - pipeline configuration options; can be the zero-value // - options - optional client configurations; pass nil to accept the default values -func NewClient(clientName, moduleVersion string, plOpts runtime.PipelineOptions, options *ClientOptions) (*Client, error) { - mod, client, err := shared.ExtractModuleName(clientName) - if err != nil { - return nil, err - } - +func NewClient(moduleName, moduleVersion string, plOpts runtime.PipelineOptions, options *ClientOptions) (*Client, error) { if options == nil { options = &ClientOptions{} } @@ -119,15 +116,19 @@ func NewClient(clientName, moduleVersion string, plOpts runtime.PipelineOptions, } } - pl := runtime.NewPipeline(mod, moduleVersion, plOpts, options) + pl := runtime.NewPipeline(moduleName, moduleVersion, plOpts, options) - tr := options.TracingProvider.NewTracer(client, moduleVersion) + tr := options.TracingProvider.NewTracer(moduleName, moduleVersion) + if tr.Enabled() && plOpts.Tracing.Namespace != "" { + tr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: plOpts.Tracing.Namespace}) + } return &Client{ - pl: pl, - tr: tr, - tp: options.TracingProvider, - modVer: moduleVersion, + pl: pl, + tr: tr, + tp: options.TracingProvider, + modVer: moduleVersion, + namespace: plOpts.Tracing.Namespace, }, nil } @@ -146,5 +147,8 @@ func (c *Client) Tracer() tracing.Tracer { // - clientName - the fully qualified name of the client ("package.Client"); this is used by the tracing provider when creating spans func (c *Client) WithClientName(clientName string) *Client { tr := c.tp.NewTracer(clientName, c.modVer) - return &Client{pl: c.pl, tr: tr, tp: c.tp, modVer: c.modVer} + if tr.Enabled() && c.namespace != "" { + tr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: c.namespace}) + } + return &Client{pl: c.pl, tr: tr, tp: c.tp, modVer: c.modVer, namespace: c.namespace} } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go index 28c64678c7..654a5f4043 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go @@ -253,5 +253,12 @@ When resuming a poller, no IO is performed, and zero-value arguments can be used Resume tokens are unique per service client and operation. Attempting to resume a poller for LRO BeginB() with a token from LRO BeginA() will result in an error. + +# Fakes + +The fake package contains types used for constructing in-memory fake servers used in unit tests. +This allows writing tests to cover various success/error conditions without the need for connecting to a live service. + +Please see https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/samples/fakes for details and examples on how to use fakes. */ package azcore diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go index e793b31db2..f2b296b6dc 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go @@ -8,6 +8,8 @@ package exported import ( "context" + "encoding/base64" + "fmt" "io" "net/http" "sync/atomic" @@ -78,6 +80,38 @@ type TokenCredential interface { GetToken(ctx context.Context, options TokenRequestOptions) (AccessToken, error) } +// DecodeByteArray will base-64 decode the provided string into v. +// Exported as runtime.DecodeByteArray() +func DecodeByteArray(s string, v *[]byte, format Base64Encoding) error { + if len(s) == 0 { + return nil + } + payload := string(s) + if payload[0] == '"' { + // remove surrounding quotes + payload = payload[1 : len(payload)-1] + } + switch format { + case Base64StdFormat: + decoded, err := base64.StdEncoding.DecodeString(payload) + if err == nil { + *v = decoded + return nil + } + return err + case Base64URLFormat: + // use raw encoding as URL format should not contain any '=' characters + decoded, err := base64.RawURLEncoding.DecodeString(payload) + if err == nil { + *v = decoded + return nil + } + return err + default: + return fmt.Errorf("unrecognized byte array format: %d", format) + } +} + // KeyCredential contains an authentication key used to authenticate to an Azure service. // Exported as azcore.KeyCredential. type KeyCredential struct { diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go index c44efd6eff..e45f831ed2 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go @@ -8,10 +8,7 @@ package exported import ( "errors" - "fmt" "net/http" - - "golang.org/x/net/http/httpguts" ) // Policy represents an extensibility point for the Pipeline that can mutate the specified @@ -75,23 +72,6 @@ func (p Pipeline) Do(req *Request) (*http.Response, error) { if req == nil { return nil, errors.New("request cannot be nil") } - // check copied from Transport.roundTrip() - for k, vv := range req.Raw().Header { - if !httpguts.ValidHeaderFieldName(k) { - if req.Raw().Body != nil { - req.Raw().Body.Close() - } - return nil, fmt.Errorf("invalid header field name %q", k) - } - for _, v := range vv { - if !httpguts.ValidHeaderFieldValue(v) { - if req.Raw().Body != nil { - req.Raw().Body.Close() - } - return nil, fmt.Errorf("invalid header field value %q for key %v", v, k) - } - } - } req.policies = p.policies return req.Next() } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go index fa99d1b7ed..659f2a7d2e 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go @@ -8,6 +8,7 @@ package exported import ( "context" + "encoding/base64" "errors" "fmt" "io" @@ -18,6 +19,28 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" ) +// Base64Encoding is usesd to specify which base-64 encoder/decoder to use when +// encoding/decoding a slice of bytes to/from a string. +// Exported as runtime.Base64Encoding +type Base64Encoding int + +const ( + // Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads. + Base64StdFormat Base64Encoding = 0 + + // Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads. + Base64URLFormat Base64Encoding = 1 +) + +// EncodeByteArray will base-64 encode the byte slice v. +// Exported as runtime.EncodeByteArray() +func EncodeByteArray(v []byte, format Base64Encoding) string { + if format == Base64URLFormat { + return base64.RawURLEncoding.EncodeToString(v) + } + return base64.StdEncoding.EncodeToString(v) +} + // Request is an abstraction over the creation of an HTTP request as it passes through the pipeline. // Don't use this type directly, use NewRequest() instead. // Exported as policy.Request. @@ -170,6 +193,14 @@ func (req *Request) Clone(ctx context.Context) *Request { return &r2 } +// WithContext returns a shallow copy of the request with its context changed to ctx. +func (req *Request) WithContext(ctx context.Context) *Request { + r2 := new(Request) + *r2 = *req + r2.req = r2.req.WithContext(ctx) + return r2 +} + // not exported but dependent on Request // PolicyFunc is a type that implements the Policy interface. diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go index 7df2f88c1c..f243552885 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go @@ -13,6 +13,7 @@ import ( "net/http" "regexp" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) @@ -25,7 +26,7 @@ func NewResponseError(resp *http.Response) error { } // prefer the error code in the response header - if ec := resp.Header.Get("x-ms-error-code"); ec != "" { + if ec := resp.Header.Get(shared.HeaderXMSErrorCode); ec != "" { respErr.ErrorCode = ec return respErr } @@ -112,33 +113,45 @@ type ResponseError struct { // Error implements the error interface for type ResponseError. // Note that the message contents are not contractual and can change over time. func (e *ResponseError) Error() string { + const separator = "--------------------------------------------------------------------------------" // write the request method and URL with response status code msg := &bytes.Buffer{} - fmt.Fprintf(msg, "%s %s://%s%s\n", e.RawResponse.Request.Method, e.RawResponse.Request.URL.Scheme, e.RawResponse.Request.URL.Host, e.RawResponse.Request.URL.Path) - fmt.Fprintln(msg, "--------------------------------------------------------------------------------") - fmt.Fprintf(msg, "RESPONSE %d: %s\n", e.RawResponse.StatusCode, e.RawResponse.Status) + if e.RawResponse != nil { + if e.RawResponse.Request != nil { + fmt.Fprintf(msg, "%s %s://%s%s\n", e.RawResponse.Request.Method, e.RawResponse.Request.URL.Scheme, e.RawResponse.Request.URL.Host, e.RawResponse.Request.URL.Path) + } else { + fmt.Fprintln(msg, "Request information not available") + } + fmt.Fprintln(msg, separator) + fmt.Fprintf(msg, "RESPONSE %d: %s\n", e.RawResponse.StatusCode, e.RawResponse.Status) + } else { + fmt.Fprintln(msg, "Missing RawResponse") + fmt.Fprintln(msg, separator) + } if e.ErrorCode != "" { fmt.Fprintf(msg, "ERROR CODE: %s\n", e.ErrorCode) } else { fmt.Fprintln(msg, "ERROR CODE UNAVAILABLE") } - fmt.Fprintln(msg, "--------------------------------------------------------------------------------") - body, err := exported.Payload(e.RawResponse, nil) - if err != nil { - // this really shouldn't fail at this point as the response - // body is already cached (it was read in NewResponseError) - fmt.Fprintf(msg, "Error reading response body: %v", err) - } else if len(body) > 0 { - if err := json.Indent(msg, body, "", " "); err != nil { - // failed to pretty-print so just dump it verbatim - fmt.Fprint(msg, string(body)) + if e.RawResponse != nil { + fmt.Fprintln(msg, separator) + body, err := exported.Payload(e.RawResponse, nil) + if err != nil { + // this really shouldn't fail at this point as the response + // body is already cached (it was read in NewResponseError) + fmt.Fprintf(msg, "Error reading response body: %v", err) + } else if len(body) > 0 { + if err := json.Indent(msg, body, "", " "); err != nil { + // failed to pretty-print so just dump it verbatim + fmt.Fprint(msg, string(body)) + } + // the standard library doesn't have a pretty-printer for XML + fmt.Fprintln(msg) + } else { + fmt.Fprintln(msg, "Response contained no body") } - // the standard library doesn't have a pretty-printer for XML - fmt.Fprintln(msg) - } else { - fmt.Fprintln(msg, "Response contained no body") } - fmt.Fprintln(msg, "--------------------------------------------------------------------------------") + fmt.Fprintln(msg, separator) return msg.String() } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go new file mode 100644 index 0000000000..2598347186 --- /dev/null +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go @@ -0,0 +1,133 @@ +//go:build go1.18 +// +build go1.18 + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package fake + +import ( + "context" + "errors" + "fmt" + "net/http" + "strings" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" + "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" +) + +// Applicable returns true if the LRO is a fake. +func Applicable(resp *http.Response) bool { + return resp.Header.Get(shared.HeaderFakePollerStatus) != "" +} + +// CanResume returns true if the token can rehydrate this poller type. +func CanResume(token map[string]interface{}) bool { + _, ok := token["fakeURL"] + return ok +} + +// Poller is an LRO poller that uses the Core-Fake-Poller pattern. +type Poller[T any] struct { + pl exported.Pipeline + + resp *http.Response + + // The API name from CtxAPINameKey + APIName string `json:"apiName"` + + // The URL from Core-Fake-Poller header. + FakeURL string `json:"fakeURL"` + + // The LRO's current state. + FakeStatus string `json:"status"` +} + +// lroStatusURLSuffix is the URL path suffix for a faked LRO. +const lroStatusURLSuffix = "/get/fake/status" + +// New creates a new Poller from the provided initial response. +// Pass nil for response to create an empty Poller for rehydration. +func New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) { + if resp == nil { + log.Write(log.EventLRO, "Resuming Core-Fake-Poller poller.") + return &Poller[T]{pl: pl}, nil + } + + log.Write(log.EventLRO, "Using Core-Fake-Poller poller.") + fakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus) + if fakeStatus == "" { + return nil, errors.New("response is missing Fake-Poller-Status header") + } + + ctxVal := resp.Request.Context().Value(shared.CtxAPINameKey{}) + if ctxVal == nil { + return nil, errors.New("missing value for CtxAPINameKey") + } + + apiName, ok := ctxVal.(string) + if !ok { + return nil, fmt.Errorf("expected string for CtxAPINameKey, the type was %T", ctxVal) + } + + qp := "" + if resp.Request.URL.RawQuery != "" { + qp = "?" + resp.Request.URL.RawQuery + } + + p := &Poller[T]{ + pl: pl, + resp: resp, + APIName: apiName, + // NOTE: any changes to this path format MUST be reflected in SanitizePollerPath() + FakeURL: fmt.Sprintf("%s://%s%s%s%s", resp.Request.URL.Scheme, resp.Request.URL.Host, resp.Request.URL.Path, lroStatusURLSuffix, qp), + FakeStatus: fakeStatus, + } + return p, nil +} + +// Done returns true if the LRO is in a terminal state. +func (p *Poller[T]) Done() bool { + return poller.IsTerminalState(p.FakeStatus) +} + +// Poll retrieves the current state of the LRO. +func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { + ctx = context.WithValue(ctx, shared.CtxAPINameKey{}, p.APIName) + err := pollers.PollHelper(ctx, p.FakeURL, p.pl, func(resp *http.Response) (string, error) { + if !poller.StatusCodeValid(resp) { + p.resp = resp + return "", exported.NewResponseError(resp) + } + fakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus) + if fakeStatus == "" { + return "", errors.New("response is missing Fake-Poller-Status header") + } + p.resp = resp + p.FakeStatus = fakeStatus + return p.FakeStatus, nil + }) + if err != nil { + return nil, err + } + return p.resp, nil +} + +func (p *Poller[T]) Result(ctx context.Context, out *T) error { + if p.resp.StatusCode == http.StatusNoContent { + return nil + } else if poller.Failed(p.FakeStatus) { + return exported.NewResponseError(p.resp) + } + + return pollers.ResultHelper(p.resp, poller.Failed(p.FakeStatus), out) +} + +// SanitizePollerPath removes any fake-appended suffix from a URL's path. +func SanitizePollerPath(path string) string { + return strings.TrimSuffix(path, lroStatusURLSuffix) +} diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go index 05e53aa76e..272f06155e 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go @@ -7,8 +7,9 @@ package shared const ( - ContentTypeAppJSON = "application/json" - ContentTypeAppXML = "application/xml" + ContentTypeAppJSON = "application/json" + ContentTypeAppXML = "application/xml" + ContentTypeTextPlain = "text/plain" ) const ( @@ -17,20 +18,25 @@ const ( HeaderAzureAsync = "Azure-AsyncOperation" HeaderContentLength = "Content-Length" HeaderContentType = "Content-Type" + HeaderFakePollerStatus = "Fake-Poller-Status" HeaderLocation = "Location" HeaderOperationLocation = "Operation-Location" HeaderRetryAfter = "Retry-After" HeaderUserAgent = "User-Agent" HeaderWWWAuthenticate = "WWW-Authenticate" HeaderXMSClientRequestID = "x-ms-client-request-id" + HeaderXMSRequestID = "x-ms-request-id" + HeaderXMSErrorCode = "x-ms-error-code" ) const BearerTokenPrefix = "Bearer " +const TracingNamespaceAttrName = "az.namespace" + const ( // Module is the name of the calling module used in telemetry data. Module = "azcore" // Version is the semantic version (see http://semver.org) of this module. - Version = "v1.8.0" + Version = "v1.9.0" ) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go index 1bf3aca918..16bc105f48 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go @@ -14,10 +14,11 @@ import ( "regexp" "strconv" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo" ) +// NOTE: when adding a new context key type, it likely needs to be +// added to the deny-list of key types in ContextWithDeniedValues + // CtxWithHTTPHeaderKey is used as a context key for adding/retrieving http.Header. type CtxWithHTTPHeaderKey struct{} @@ -27,6 +28,12 @@ type CtxWithRetryOptionsKey struct{} // CtxWithCaptureResponse is used as a context key for retrieving the raw response. type CtxWithCaptureResponse struct{} +// CtxWithTracingTracer is used as a context key for adding/retrieving tracing.Tracer. +type CtxWithTracingTracer struct{} + +// CtxAPINameKey is used as a context key for adding/retrieving the API name. +type CtxAPINameKey struct{} + // Delay waits for the duration to elapse or the context to be cancelled. func Delay(ctx context.Context, delay time.Duration) error { select { @@ -80,49 +87,21 @@ func ValidateModVer(moduleVersion string) error { return nil } -// ExtractModuleName returns "module", "package.Client" from "module/package.Client" or -// "package", "package.Client" from "package.Client" when there's no "module/" prefix. -// If clientName is malformed, an error is returned. -func ExtractModuleName(clientName string) (string, string, error) { - // uses unnamed capturing for "module", "package.Client", and "package" - regex, err := regexp.Compile(`^(?:([a-z0-9]+)/)?(([a-z0-9]+)\.(?:[A-Za-z0-9]+))$`) - if err != nil { - return "", "", err +// ContextWithDeniedValues wraps an existing [context.Context], denying access to certain context values. +// Pipeline policies that create new requests to be sent down their own pipeline MUST wrap the caller's +// context with an instance of this type. This is to prevent context values from flowing across disjoint +// requests which can have unintended side-effects. +type ContextWithDeniedValues struct { + context.Context +} + +// Value implements part of the [context.Context] interface. +// It acts as a deny-list for certain context keys. +func (c *ContextWithDeniedValues) Value(key any) any { + switch key.(type) { + case CtxAPINameKey, CtxWithCaptureResponse, CtxWithHTTPHeaderKey, CtxWithRetryOptionsKey, CtxWithTracingTracer: + return nil + default: + return c.Context.Value(key) } - - matches := regex.FindStringSubmatch(clientName) - if len(matches) < 4 { - return "", "", fmt.Errorf("malformed clientName %s", clientName) - } - - // the first match is the entire string, the second is "module", the third is - // "package.Client" and the fourth is "package". - // if there was no "module/" prefix, the second match will be the empty string - if matches[1] != "" { - return matches[1], matches[2], nil - } - return matches[3], matches[2], nil } - -// NonRetriableError marks the specified error as non-retriable. -func NonRetriableError(err error) error { - return &nonRetriableError{err} -} - -type nonRetriableError struct { - error -} - -func (p *nonRetriableError) Error() string { - return p.error.Error() -} - -func (*nonRetriableError) NonRetriable() { - // marker method -} - -func (p *nonRetriableError) Unwrap() error { - return p.error -} - -var _ errorinfo.NonRetriable = (*nonRetriableError)(nil) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go index f73704cf01..d934f1dc5f 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go @@ -29,9 +29,11 @@ type Transporter = exported.Transporter type Request = exported.Request // ClientOptions contains optional settings for a client's pipeline. -// All zero-value fields will be initialized with default values. +// Instances can be shared across calls to SDK client constructors when uniform configuration is desired. +// Zero-value fields will have their specified default values applied during use. type ClientOptions struct { - // APIVersion overrides the default version requested of the service. Set with caution as this package version has not been tested with arbitrary service versions. + // APIVersion overrides the default version requested of the service. + // Set with caution as this package version has not been tested with arbitrary service versions. APIVersion string // Cloud specifies a cloud for the client. The default is Azure Public Cloud. diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go index 8a2e6c61ed..cffe692d7e 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go @@ -10,9 +10,12 @@ import ( "context" "encoding/json" "errors" + "fmt" "net/http" + "reflect" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" ) // PagingHandler contains the required data for constructing a Pager. @@ -23,12 +26,16 @@ type PagingHandler[T any] struct { // Fetcher fetches the first and subsequent pages. Fetcher func(context.Context, *T) (T, error) + + // Tracer contains the Tracer from the client that's creating the Pager. + Tracer tracing.Tracer } // Pager provides operations for iterating over paged responses. type Pager[T any] struct { current *T handler PagingHandler[T] + tracer tracing.Tracer firstPage bool } @@ -37,6 +44,7 @@ type Pager[T any] struct { func NewPager[T any](handler PagingHandler[T]) *Pager[T] { return &Pager[T]{ handler: handler, + tracer: handler.Tracer, firstPage: true, } } @@ -51,8 +59,6 @@ func (p *Pager[T]) More() bool { // NextPage advances the pager to the next page. func (p *Pager[T]) NextPage(ctx context.Context) (T, error) { - var resp T - var err error if p.current != nil { if p.firstPage { // we get here if it's an LRO-pager, we already have the first page @@ -61,12 +67,16 @@ func (p *Pager[T]) NextPage(ctx context.Context) (T, error) { } else if !p.handler.More(*p.current) { return *new(T), errors.New("no more pages") } - resp, err = p.handler.Fetcher(ctx, p.current) } else { // non-LRO case, first page p.firstPage = false - resp, err = p.handler.Fetcher(ctx, nil) } + + var err error + ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.NextPage", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) + defer func() { endSpan(err) }() + + resp, err := p.handler.Fetcher(ctx, p.current) if err != nil { return *new(T), err } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go index 9d9288f53d..6b1f5c083e 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go @@ -13,9 +13,35 @@ import ( // PipelineOptions contains Pipeline options for SDK developers type PipelineOptions struct { - AllowedHeaders, AllowedQueryParameters []string - APIVersion APIVersionOptions - PerCall, PerRetry []policy.Policy + // AllowedHeaders is the slice of headers to log with their values intact. + // All headers not in the slice will have their values REDACTED. + // Applies to request and response headers. + AllowedHeaders []string + + // AllowedQueryParameters is the slice of query parameters to log with their values intact. + // All query parameters not in the slice will have their values REDACTED. + AllowedQueryParameters []string + + // APIVersion overrides the default version requested of the service. + // Set with caution as this package version has not been tested with arbitrary service versions. + APIVersion APIVersionOptions + + // PerCall contains custom policies to inject into the pipeline. + // Each policy is executed once per request. + PerCall []policy.Policy + + // PerRetry contains custom policies to inject into the pipeline. + // Each policy is executed once per request, and for each retry of that request. + PerRetry []policy.Policy + + // Tracing contains options used to configure distributed tracing. + Tracing TracingOptions +} + +// TracingOptions contains tracing options for SDK developers. +type TracingOptions struct { + // Namespace contains the value to use for the az.namespace span attribute. + Namespace string } // Pipeline represents a primitive for sending HTTP requests and receiving responses. @@ -56,8 +82,10 @@ func NewPipeline(module, version string, plOpts PipelineOptions, options *policy policies = append(policies, NewRetryPolicy(&cp.Retry)) policies = append(policies, plOpts.PerRetry...) policies = append(policies, cp.PerRetryPolicies...) + policies = append(policies, exported.PolicyFunc(httpHeaderPolicy)) + policies = append(policies, newHTTPTracePolicy(cp.Logging.AllowedQueryParams)) policies = append(policies, NewLogPolicy(&cp.Logging)) - policies = append(policies, exported.PolicyFunc(httpHeaderPolicy), exported.PolicyFunc(bodyDownloadPolicy)) + policies = append(policies, exported.PolicyFunc(bodyDownloadPolicy)) transport := cp.Transport if transport == nil { transport = defaultHTTPClient diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go index ff4931cd24..f0f2803559 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go @@ -35,7 +35,7 @@ type acquiringResourceState struct { // acquire acquires or updates the resource; only one // thread/goroutine at a time ever calls this function func acquire(state acquiringResourceState) (newResource exported.AccessToken, newExpiration time.Time, err error) { - tk, err := state.p.cred.GetToken(state.req.Raw().Context(), state.tro) + tk, err := state.p.cred.GetToken(&shared.ContextWithDeniedValues{Context: state.req.Raw().Context()}, state.tro) if err != nil { return exported.AccessToken{}, time.Time{}, err } @@ -73,9 +73,17 @@ func (b *BearerTokenPolicy) authenticateAndAuthorize(req *policy.Request) func(p // Do authorizes a request with a bearer token func (b *BearerTokenPolicy) Do(req *policy.Request) (*http.Response, error) { - if strings.ToLower(req.Raw().URL.Scheme) != "https" { - return nil, shared.NonRetriableError(errors.New("bearer token authentication is not permitted for non TLS protected (https) endpoints")) + // skip adding the authorization header if no TokenCredential was provided. + // this prevents a panic that might be hard to diagnose and allows testing + // against http endpoints that don't require authentication. + if b.cred == nil { + return req.Next() } + + if err := checkHTTPSForAuth(req); err != nil { + return nil, err + } + var err error if b.authzHandler.OnRequest != nil { err = b.authzHandler.OnRequest(req, b.authenticateAndAuthorize(req)) @@ -83,7 +91,7 @@ func (b *BearerTokenPolicy) Do(req *policy.Request) (*http.Response, error) { err = b.authenticateAndAuthorize(req)(policy.TokenRequestOptions{Scopes: b.scopes}) } if err != nil { - return nil, ensureNonRetriable(err) + return nil, errorinfo.NonRetriableError(err) } res, err := req.Next() @@ -99,22 +107,15 @@ func (b *BearerTokenPolicy) Do(req *policy.Request) (*http.Response, error) { } } } - return res, ensureNonRetriable(err) -} - -func ensureNonRetriable(err error) error { - var nre errorinfo.NonRetriable - if err != nil && !errors.As(err, &nre) { - err = btpError{err} + if err != nil { + err = errorinfo.NonRetriableError(err) } - return err + return res, err } -// btpError is a wrapper that ensures RetryPolicy doesn't retry requests BearerTokenPolicy couldn't authorize -type btpError struct { - error +func checkHTTPSForAuth(req *policy.Request) error { + if strings.ToLower(req.Raw().URL.Scheme) != "https" { + return errorinfo.NonRetriableError(errors.New("authenticated requests are not permitted for non TLS protected (https) endpoints")) + } + return nil } - -func (btpError) NonRetriable() {} - -var _ errorinfo.NonRetriable = (*btpError)(nil) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go new file mode 100644 index 0000000000..3df1c12189 --- /dev/null +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go @@ -0,0 +1,143 @@ +//go:build go1.18 +// +build go1.18 + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package runtime + +import ( + "context" + "errors" + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" +) + +const ( + attrHTTPMethod = "http.method" + attrHTTPURL = "http.url" + attrHTTPUserAgent = "http.user_agent" + attrHTTPStatusCode = "http.status_code" + + attrAZClientReqID = "az.client_request_id" + attrAZServiceReqID = "az.service_request_id" + + attrNetPeerName = "net.peer.name" +) + +// newHTTPTracePolicy creates a new instance of the httpTracePolicy. +// - allowedQueryParams contains the user-specified query parameters that don't need to be redacted from the trace +func newHTTPTracePolicy(allowedQueryParams []string) exported.Policy { + return &httpTracePolicy{allowedQP: getAllowedQueryParams(allowedQueryParams)} +} + +// httpTracePolicy is a policy that creates a trace for the HTTP request and its response +type httpTracePolicy struct { + allowedQP map[string]struct{} +} + +// Do implements the pipeline.Policy interfaces for the httpTracePolicy type. +func (h *httpTracePolicy) Do(req *policy.Request) (resp *http.Response, err error) { + rawTracer := req.Raw().Context().Value(shared.CtxWithTracingTracer{}) + if tracer, ok := rawTracer.(tracing.Tracer); ok && tracer.Enabled() { + attributes := []tracing.Attribute{ + {Key: attrHTTPMethod, Value: req.Raw().Method}, + {Key: attrHTTPURL, Value: getSanitizedURL(*req.Raw().URL, h.allowedQP)}, + {Key: attrNetPeerName, Value: req.Raw().URL.Host}, + } + + if ua := req.Raw().Header.Get(shared.HeaderUserAgent); ua != "" { + attributes = append(attributes, tracing.Attribute{Key: attrHTTPUserAgent, Value: ua}) + } + if reqID := req.Raw().Header.Get(shared.HeaderXMSClientRequestID); reqID != "" { + attributes = append(attributes, tracing.Attribute{Key: attrAZClientReqID, Value: reqID}) + } + + ctx := req.Raw().Context() + ctx, span := tracer.Start(ctx, "HTTP "+req.Raw().Method, &tracing.SpanOptions{ + Kind: tracing.SpanKindClient, + Attributes: attributes, + }) + + defer func() { + if resp != nil { + span.SetAttributes(tracing.Attribute{Key: attrHTTPStatusCode, Value: resp.StatusCode}) + if resp.StatusCode > 399 { + span.SetStatus(tracing.SpanStatusError, resp.Status) + } + if reqID := resp.Header.Get(shared.HeaderXMSRequestID); reqID != "" { + span.SetAttributes(tracing.Attribute{Key: attrAZServiceReqID, Value: reqID}) + } + } else if err != nil { + var urlErr *url.Error + if errors.As(err, &urlErr) { + // calling *url.Error.Error() will include the unsanitized URL + // which we don't want. in addition, we already have the HTTP verb + // and sanitized URL in the trace so we aren't losing any info + err = urlErr.Err + } + span.SetStatus(tracing.SpanStatusError, err.Error()) + } + span.End() + }() + + req = req.WithContext(ctx) + } + resp, err = req.Next() + return +} + +// StartSpanOptions contains the optional values for StartSpan. +type StartSpanOptions struct { + // for future expansion +} + +// StartSpan starts a new tracing span. +// You must call the returned func to terminate the span. Pass the applicable error +// if the span will exit with an error condition. +// - ctx is the parent context of the newly created context +// - name is the name of the span. this is typically the fully qualified name of an API ("Client.Method") +// - tracer is the client's Tracer for creating spans +// - options contains optional values. pass nil to accept any default values +func StartSpan(ctx context.Context, name string, tracer tracing.Tracer, options *StartSpanOptions) (context.Context, func(error)) { + if !tracer.Enabled() { + return ctx, func(err error) {} + } + + // we MUST propagate the active tracer before returning so that the trace policy can access it + ctx = context.WithValue(ctx, shared.CtxWithTracingTracer{}, tracer) + + const newSpanKind = tracing.SpanKindInternal + if activeSpan := ctx.Value(ctxActiveSpan{}); activeSpan != nil { + // per the design guidelines, if a SDK method Foo() calls SDK method Bar(), + // then the span for Bar() must be suppressed. however, if Bar() makes a REST + // call, then Bar's HTTP span must be a child of Foo's span. + // however, there is an exception to this rule. if the SDK method Foo() is a + // messaging producer/consumer, and it takes a callback that's a SDK method + // Bar(), then the span for Bar() must _not_ be suppressed. + if kind := activeSpan.(tracing.SpanKind); kind == tracing.SpanKindClient || kind == tracing.SpanKindInternal { + return ctx, func(err error) {} + } + } + ctx, span := tracer.Start(ctx, name, &tracing.SpanOptions{ + Kind: newSpanKind, + }) + ctx = context.WithValue(ctx, ctxActiveSpan{}, newSpanKind) + return ctx, func(err error) { + if err != nil { + errType := strings.Replace(fmt.Sprintf("%T", err), "*exported.", "*azcore.", 1) + span.SetStatus(tracing.SpanStatusError, fmt.Sprintf("%s:\n%s", errType, err.Error())) + } + span.End() + } +} + +// ctxActiveSpan is used as a context key for indicating a SDK client span is in progress. +type ctxActiveSpan struct{} diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go index 2e47a5bad0..6f577fa7a9 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go @@ -40,10 +40,18 @@ func NewKeyCredentialPolicy(cred *exported.KeyCredential, header string, options // Do implementes the Do method on the [policy.Polilcy] interface. func (k *KeyCredentialPolicy) Do(req *policy.Request) (*http.Response, error) { - val := exported.KeyCredentialGet(k.cred) - if k.prefix != "" { - val = k.prefix + val + // skip adding the authorization header if no KeyCredential was provided. + // this prevents a panic that might be hard to diagnose and allows testing + // against http endpoints that don't require authentication. + if k.cred != nil { + if err := checkHTTPSForAuth(req); err != nil { + return nil, err + } + val := exported.KeyCredentialGet(k.cred) + if k.prefix != "" { + val = k.prefix + val + } + req.Raw().Header.Add(k.header, val) } - req.Raw().Header.Add(k.header, val) return req.Next() } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go index 8514f57d5c..f048d7fb53 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go @@ -191,7 +191,8 @@ func (p *logPolicy) writeHeader(b *bytes.Buffer, header http.Header) { } sort.Strings(keys) for _, k := range keys { - value := header.Get(k) + // don't use Get() as it will canonicalize k which might cause a mismatch + value := header[k][0] // redact all header values not in the allow-list if _, ok := p.allowedHeaders[strings.ToLower(k)]; !ok { value = redactedValue diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go index 21fcb39682..04d7bb4ecb 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go @@ -59,15 +59,7 @@ func setDefaults(o *policy.RetryOptions) { } func calcDelay(o policy.RetryOptions, try int32) time.Duration { // try is >=1; never 0 - pow := func(number int64, exponent int32) int64 { // pow is nested helper function - var result int64 = 1 - for n := int32(0); n < exponent; n++ { - result *= number - } - return result - } - - delay := time.Duration(pow(2, try)-1) * o.RetryDelay + delay := time.Duration((1< -1 { + mod = mod[i+1:] + } b.WriteString(formatTelemetry(mod, ver)) b.WriteRune(' ') b.WriteString(platformInfo) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go index 3d029a3d15..c373f68962 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go @@ -13,6 +13,8 @@ import ( "flag" "fmt" "net/http" + "reflect" + "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" @@ -20,9 +22,11 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) @@ -54,6 +58,9 @@ type NewPollerOptions[T any] struct { // Handler[T] contains a custom polling implementation. Handler PollingHandler[T] + + // Tracer contains the Tracer from the client that's creating the Poller. + Tracer tracing.Tracer } // NewPoller creates a Poller based on the provided initial response. @@ -70,6 +77,7 @@ func NewPoller[T any](resp *http.Response, pl exported.Pipeline, options *NewPol op: options.Handler, resp: resp, result: result, + tracer: options.Tracer, }, nil } @@ -83,7 +91,9 @@ func NewPoller[T any](resp *http.Response, pl exported.Pipeline, options *NewPol // determine the polling method var opr PollingHandler[T] var err error - if async.Applicable(resp) { + if fake.Applicable(resp) { + opr, err = fake.New[T](pl, resp) + } else if async.Applicable(resp) { // async poller must be checked first as it can also have a location header opr, err = async.New[T](pl, resp, options.FinalStateVia) } else if op.Applicable(resp) { @@ -110,6 +120,7 @@ func NewPoller[T any](resp *http.Response, pl exported.Pipeline, options *NewPol op: opr, resp: resp, result: result, + tracer: options.Tracer, }, nil } @@ -121,6 +132,9 @@ type NewPollerFromResumeTokenOptions[T any] struct { // Handler[T] contains a custom polling implementation. Handler PollingHandler[T] + + // Tracer contains the Tracer from the client that's creating the Poller. + Tracer tracing.Tracer } // NewPollerFromResumeToken creates a Poller from a resume token string. @@ -147,7 +161,9 @@ func NewPollerFromResumeToken[T any](token string, pl exported.Pipeline, options opr := options.Handler // now rehydrate the poller based on the encoded poller type - if opr != nil { + if fake.CanResume(asJSON) { + opr, _ = fake.New[T](pl, nil) + } else if opr != nil { log.Writef(log.EventLRO, "Resuming custom poller %T.", opr) } else if async.CanResume(asJSON) { opr, _ = async.New[T](pl, nil, "") @@ -166,6 +182,7 @@ func NewPollerFromResumeToken[T any](token string, pl exported.Pipeline, options return &Poller[T]{ op: opr, result: result, + tracer: options.Tracer, }, nil } @@ -188,6 +205,7 @@ type Poller[T any] struct { resp *http.Response err error result *T + tracer tracing.Tracer done bool } @@ -203,7 +221,7 @@ type PollUntilDoneOptions struct { // options: pass nil to accept the default values. // NOTE: the default polling frequency is 30 seconds which works well for most operations. However, some operations might // benefit from a shorter or longer duration. -func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOptions) (T, error) { +func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOptions) (res T, err error) { if options == nil { options = &PollUntilDoneOptions{} } @@ -212,9 +230,13 @@ func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOpt cp.Frequency = 30 * time.Second } + ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.PollUntilDone", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) + defer func() { endSpan(err) }() + // skip the floor check when executing tests so they don't take so long if isTest := flag.Lookup("test.v"); isTest == nil && cp.Frequency < time.Second { - return *new(T), errors.New("polling frequency minimum is one second") + err = errors.New("polling frequency minimum is one second") + return } start := time.Now() @@ -226,22 +248,24 @@ func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOpt // initial check for a retry-after header existing on the initial response if retryAfter := shared.RetryAfter(p.resp); retryAfter > 0 { log.Writef(log.EventLRO, "initial Retry-After delay for %s", retryAfter.String()) - if err := shared.Delay(ctx, retryAfter); err != nil { + if err = shared.Delay(ctx, retryAfter); err != nil { logPollUntilDoneExit(err) - return *new(T), err + return } } } // begin polling the endpoint until a terminal state is reached for { - resp, err := p.Poll(ctx) + var resp *http.Response + resp, err = p.Poll(ctx) if err != nil { logPollUntilDoneExit(err) - return *new(T), err + return } if p.Done() { logPollUntilDoneExit("succeeded") - return p.Result(ctx) + res, err = p.Result(ctx) + return } d := cp.Frequency if retryAfter := shared.RetryAfter(resp); retryAfter > 0 { @@ -252,7 +276,7 @@ func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOpt } if err = shared.Delay(ctx, d); err != nil { logPollUntilDoneExit(err) - return *new(T), err + return } } } @@ -261,17 +285,22 @@ func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOpt // If Poll succeeds, the poller's state is updated and the HTTP response is returned. // If Poll fails, the poller's state is unmodified and the error is returned. // Calling Poll on an LRO that has reached a terminal state will return the last HTTP response. -func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { +func (p *Poller[T]) Poll(ctx context.Context) (resp *http.Response, err error) { if p.Done() { // the LRO has reached a terminal state, don't poll again - return p.resp, nil + resp = p.resp + return } - resp, err := p.op.Poll(ctx) + + ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.Poll", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) + defer func() { endSpan(err) }() + + resp, err = p.op.Poll(ctx) if err != nil { - return nil, err + return } p.resp = resp - return p.resp, nil + return } // Done returns true if the LRO has reached a terminal state. @@ -284,31 +313,40 @@ func (p *Poller[T]) Done() bool { // If the LRO completed successfully, a populated instance of T is returned. // If the LRO failed or was canceled, an *azcore.ResponseError error is returned. // Calling this on an LRO in a non-terminal state will return an error. -func (p *Poller[T]) Result(ctx context.Context) (T, error) { +func (p *Poller[T]) Result(ctx context.Context) (res T, err error) { if !p.Done() { - return *new(T), errors.New("poller is in a non-terminal state") + err = errors.New("poller is in a non-terminal state") + return } if p.done { // the result has already been retrieved, return the cached value if p.err != nil { - return *new(T), p.err + err = p.err + return } - return *p.result, nil + res = *p.result + return } - err := p.op.Result(ctx, p.result) + + ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.Result", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) + defer func() { endSpan(err) }() + + err = p.op.Result(ctx, p.result) var respErr *exported.ResponseError if errors.As(err, &respErr) { // the LRO failed. record the error p.err = err } else if err != nil { // the call to Result failed, don't cache anything in this case - return *new(T), err + return } p.done = true if p.err != nil { - return *new(T), p.err + err = p.err + return } - return *p.result, nil + res = *p.result + return } // ResumeToken returns a value representing the poller that can be used to resume @@ -325,3 +363,22 @@ func (p *Poller[T]) ResumeToken() (string, error) { } return tk, err } + +// extracts the type name from the string returned from reflect.Value.Name() +func shortenTypeName(s string) string { + // the value is formatted as follows + // Poller[module/Package.Type].Method + // we want to shorten the generic type parameter string to Type + // anything we don't recognize will be left as-is + begin := strings.Index(s, "[") + end := strings.Index(s, "]") + if begin == -1 || end == -1 { + return s + } + + typeName := s[begin+1 : end] + if i := strings.LastIndex(typeName, "."); i > -1 { + typeName = typeName[i+1:] + } + return s[:begin+1] + typeName + s[end:] +} diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go index b7e6fb26f9..e97223da29 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go @@ -9,18 +9,14 @@ package runtime import ( "bytes" "context" - "encoding/base64" "encoding/json" "encoding/xml" "fmt" "io" "mime/multipart" "net/url" - "os" "path" - "reflect" "strings" - "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" @@ -29,14 +25,14 @@ import ( // Base64Encoding is usesd to specify which base-64 encoder/decoder to use when // encoding/decoding a slice of bytes to/from a string. -type Base64Encoding int +type Base64Encoding = exported.Base64Encoding const ( // Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads. - Base64StdFormat Base64Encoding = 0 + Base64StdFormat Base64Encoding = exported.Base64StdFormat // Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads. - Base64URLFormat Base64Encoding = 1 + Base64URLFormat Base64Encoding = exported.Base64URLFormat ) // NewRequest creates a new policy.Request with the specified input. @@ -93,10 +89,7 @@ func JoinPaths(root string, paths ...string) string { // EncodeByteArray will base-64 encode the byte slice v. func EncodeByteArray(v []byte, format Base64Encoding) string { - if format == Base64URLFormat { - return base64.RawURLEncoding.EncodeToString(v) - } - return base64.StdEncoding.EncodeToString(v) + return exported.EncodeByteArray(v, format) } // MarshalAsByteArray will base-64 encode the byte slice v, then calls SetBody. @@ -109,9 +102,6 @@ func MarshalAsByteArray(req *policy.Request, v []byte, format Base64Encoding) er // MarshalAsJSON calls json.Marshal() to get the JSON encoding of v then calls SetBody. func MarshalAsJSON(req *policy.Request, v interface{}) error { - if omit := os.Getenv("AZURE_SDK_GO_OMIT_READONLY"); omit == "true" { - v = cloneWithoutReadOnlyFields(v) - } b, err := json.Marshal(v) if err != nil { return fmt.Errorf("error marshalling type %T: %s", v, err) @@ -183,80 +173,5 @@ func SkipBodyDownload(req *policy.Request) { req.SetOperationValue(bodyDownloadPolicyOpValues{Skip: true}) } -// returns a clone of the object graph pointed to by v, omitting values of all read-only -// fields. if there are no read-only fields in the object graph, no clone is created. -func cloneWithoutReadOnlyFields(v interface{}) interface{} { - val := reflect.Indirect(reflect.ValueOf(v)) - if val.Kind() != reflect.Struct { - // not a struct, skip - return v - } - // first walk the graph to find any R/O fields. - // if there aren't any, skip cloning the graph. - if !recursiveFindReadOnlyField(val) { - return v - } - return recursiveCloneWithoutReadOnlyFields(val) -} - -// returns true if any field in the object graph of val contains the `azure:"ro"` tag value -func recursiveFindReadOnlyField(val reflect.Value) bool { - t := val.Type() - // iterate over the fields, looking for the "azure" tag. - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - aztag := field.Tag.Get("azure") - if azureTagIsReadOnly(aztag) { - return true - } else if reflect.Indirect(val.Field(i)).Kind() == reflect.Struct && recursiveFindReadOnlyField(reflect.Indirect(val.Field(i))) { - return true - } - } - return false -} - -// clones the object graph of val. all non-R/O properties are copied to the clone -func recursiveCloneWithoutReadOnlyFields(val reflect.Value) interface{} { - t := val.Type() - clone := reflect.New(t) - // iterate over the fields, looking for the "azure" tag. - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - aztag := field.Tag.Get("azure") - if azureTagIsReadOnly(aztag) { - // omit from payload - continue - } - // clone field will receive the same value as the source field... - value := val.Field(i) - v := reflect.Indirect(value) - if v.IsValid() && v.Type() != reflect.TypeOf(time.Time{}) && v.Kind() == reflect.Struct { - // ...unless the source value is a struct, in which case we recurse to clone that struct. - // (We can't recursively clone time.Time because it contains unexported fields.) - c := recursiveCloneWithoutReadOnlyFields(v) - if field.Anonymous { - // NOTE: this does not handle the case of embedded fields of unexported struct types. - // this should be ok as we don't generate any code like this at present - value = reflect.Indirect(reflect.ValueOf(c)) - } else { - value = reflect.ValueOf(c) - } - } - reflect.Indirect(clone).Field(i).Set(value) - } - return clone.Interface() -} - -// returns true if the "azure" tag contains the option "ro" -func azureTagIsReadOnly(tag string) bool { - if tag == "" { - return false - } - parts := strings.Split(tag, ",") - for _, part := range parts { - if part == "ro" { - return true - } - } - return false -} +// CtxAPINameKey is used as a context key for adding/retrieving the API name. +type CtxAPINameKey = shared.CtxAPINameKey diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go index d1f58e9e29..003c875b1f 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go @@ -8,13 +8,13 @@ package runtime import ( "bytes" - "encoding/base64" "encoding/json" "encoding/xml" "fmt" "io" "net/http" + azexported "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) @@ -105,31 +105,5 @@ func removeBOM(resp *http.Response) error { // DecodeByteArray will base-64 decode the provided string into v. func DecodeByteArray(s string, v *[]byte, format Base64Encoding) error { - if len(s) == 0 { - return nil - } - payload := string(s) - if payload[0] == '"' { - // remove surrounding quotes - payload = payload[1 : len(payload)-1] - } - switch format { - case Base64StdFormat: - decoded, err := base64.StdEncoding.DecodeString(payload) - if err == nil { - *v = decoded - return nil - } - return err - case Base64URLFormat: - // use raw encoding as URL format should not contain any '=' characters - decoded, err := base64.RawURLEncoding.DecodeString(payload) - if err == nil { - *v = decoded - return nil - } - return err - default: - return fmt.Errorf("unrecognized byte array format: %d", format) - } + return azexported.DecodeByteArray(s, v, format) } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go index 589d09f2c0..2124c1d48b 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go @@ -11,6 +11,8 @@ import ( "net" "net/http" "time" + + "golang.org/x/net/http2" ) var defaultHTTPClient *http.Client @@ -24,6 +26,7 @@ func init() { }), ForceAttemptHTTP2: true, MaxIdleConns: 100, + MaxIdleConnsPerHost: 10, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, @@ -32,6 +35,13 @@ func init() { Renegotiation: tls.RenegotiateFreelyAsClient, }, } + // TODO: evaluate removing this once https://github.com/golang/go/issues/59690 has been fixed + if http2Transport, err := http2.ConfigureTransports(defaultTransport); err == nil { + // if the connection has been idle for 10 seconds, send a ping frame for a health check + http2Transport.ReadIdleTimeout = 10 * time.Second + // if there's no response to the ping within the timeout, the connection will be closed + http2Transport.PingTimeout = 5 * time.Second + } defaultHTTPClient = &http.Client{ Transport: defaultTransport, } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go index 75f757cedd..1ade7c560f 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go @@ -31,12 +31,12 @@ type Provider struct { newTracerFn func(name, version string) Tracer } -// NewTracer creates a new Tracer for the specified name and version. -// - name - the name of the tracer object, typically the fully qualified name of the service client -// - version - the version of the module in which the service client resides -func (p Provider) NewTracer(name, version string) (tracer Tracer) { +// NewTracer creates a new Tracer for the specified module name and version. +// - module - the fully qualified name of the module +// - version - the version of the module +func (p Provider) NewTracer(module, version string) (tracer Tracer) { if p.newTracerFn != nil { - tracer = p.newTracerFn(name, version) + tracer = p.newTracerFn(module, version) } return } @@ -45,21 +45,28 @@ func (p Provider) NewTracer(name, version string) (tracer Tracer) { // TracerOptions contains the optional values when creating a Tracer. type TracerOptions struct { - // for future expansion + // SpanFromContext contains the implementation for the Tracer.SpanFromContext method. + SpanFromContext func(context.Context) Span } // NewTracer creates a Tracer with the specified values. // - newSpanFn is the underlying implementation for creating Span instances // - options contains optional values; pass nil to accept the default value func NewTracer(newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span), options *TracerOptions) Tracer { + if options == nil { + options = &TracerOptions{} + } return Tracer{ - newSpanFn: newSpanFn, + newSpanFn: newSpanFn, + spanFromContextFn: options.SpanFromContext, } } // Tracer is the factory that creates Span instances. type Tracer struct { - newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) + attrs []Attribute + newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) + spanFromContextFn func(ctx context.Context) Span } // Start creates a new span and a context.Context that contains it. @@ -68,11 +75,37 @@ type Tracer struct { // - options contains optional values for the span, pass nil to accept any defaults func (t Tracer) Start(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) { if t.newSpanFn != nil { - return t.newSpanFn(ctx, spanName, options) + opts := SpanOptions{} + if options != nil { + opts = *options + } + opts.Attributes = append(opts.Attributes, t.attrs...) + return t.newSpanFn(ctx, spanName, &opts) } return ctx, Span{} } +// SetAttributes sets attrs to be applied to each Span. If a key from attrs +// already exists for an attribute of the Span it will be overwritten with +// the value contained in attrs. +func (t *Tracer) SetAttributes(attrs ...Attribute) { + t.attrs = append(t.attrs, attrs...) +} + +// Enabled returns true if this Tracer is capable of creating Spans. +func (t Tracer) Enabled() bool { + return t.newSpanFn != nil +} + +// SpanFromContext returns the Span associated with the current context. +// If the provided context has no Span, false is returned. +func (t Tracer) SpanFromContext(ctx context.Context) Span { + if t.spanFromContextFn != nil { + return t.spanFromContextFn(ctx) + } + return Span{} +} + // SpanOptions contains optional settings for creating a span. type SpanOptions struct { // Kind indicates the kind of Span. @@ -97,9 +130,6 @@ type SpanImpl struct { // AddEvent contains the implementation for the Span.AddEvent method. AddEvent func(string, ...Attribute) - // AddError contains the implementation for the Span.AddError method. - AddError func(err error) - // SetStatus contains the implementation for the Span.SetStatus method. SetStatus func(SpanStatus, string) } @@ -140,13 +170,6 @@ func (s Span) AddEvent(name string, attrs ...Attribute) { } } -// AddError adds the specified error event to the span. -func (s Span) AddError(err error) { - if s.impl.AddError != nil { - s.impl.AddError(err) - } -} - // SetStatus sets the status on the span along with a description. func (s Span) SetStatus(code SpanStatus, desc string) { if s.impl.SetStatus != nil { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md index 48105a44bb..6e5bc34a4a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md @@ -1,3 +1,108 @@ +# Release (2023-11-09) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2`: v1.22.2 + * **Bug Fix**: added x-amz-expected-bucket-owner to the list of headers we should sign +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.28.0](service/sqs/CHANGELOG.md#v1280-2023-11-09) + * **Feature**: This release enables customers to call SQS using AWS JSON-1.0 protocol and bug fix. + +# Release (2023-11-08) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.78.0](service/connect/CHANGELOG.md#v1780-2023-11-08) + * **Feature**: This release clarifies in our public documentation that InstanceId is a requirement for SearchUsers API requests. +* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.11.0](service/connectcases/CHANGELOG.md#v1110-2023-11-08) + * **Feature**: This release adds the ability to add/view comment authors through CreateRelatedItem and SearchRelatedItems API. For more information see https://docs.aws.amazon.com/cases/latest/APIReference/Welcome.html +* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.33.0](service/guardduty/CHANGELOG.md#v1330-2023-11-08) + * **Feature**: Added API support for new GuardDuty EKS Audit Log finding types. +* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.44.0](service/lambda/CHANGELOG.md#v1440-2023-11-08) + * **Feature**: Add Node 20 (nodejs20.x) support to AWS Lambda. +* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.36.0](service/lexmodelsv2/CHANGELOG.md#v1360-2023-11-08) + * **Feature**: AWS Lex now supports selective log capture in conversation logs. When you enable this option within the conversation log settings, only the utterances that trigger intents and slots specified in session attributes will be logged. +* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.14.0](service/omics/CHANGELOG.md#v1140-2023-11-08) + * **Feature**: Adding Run UUID and Run Output URI: GetRun and StartRun API response has two new fields "uuid" and "runOutputUri". +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.62.1](service/rds/CHANGELOG.md#v1621-2023-11-08) + * **Documentation**: This Amazon RDS release adds support for patching the OS of an RDS Custom for Oracle DB instance. You can now upgrade the database or operating system using the modify-db-instance command. +* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.12.0](service/redshiftserverless/CHANGELOG.md#v1120-2023-11-08) + * **Feature**: Added a new parameter in the workgroup that helps you control your cost for compute resources. This feature provides a ceiling for RPUs that Amazon Redshift Serverless can scale up to. When automatic compute scaling is required, having a higher value for MaxRPU can enhance query throughput. +* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.17.0](service/resiliencehub/CHANGELOG.md#v1170-2023-11-08) + * **Feature**: AWS Resilience Hub enhances Resiliency Score, providing actionable recommendations to improve application resilience. Amazon Elastic Kubernetes Service (EKS) operational recommendations have been added to help improve the resilience posture of your applications. +* `github.com/aws/aws-sdk-go-v2/service/sqs`: [v1.27.0](service/sqs/CHANGELOG.md#v1270-2023-11-08) + * **Feature**: This release enables customers to call SQS using AWS JSON-1.0 protocol. + +# Release (2023-11-07) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/internal/ini`: [v1.5.1](internal/ini/CHANGELOG.md#v151-2023-11-07) + * **Bug Fix**: Fix subproperty performance regression +* `github.com/aws/aws-sdk-go-v2/service/dlm`: [v1.20.0](service/dlm/CHANGELOG.md#v1200-2023-11-07) + * **Feature**: Added support for pre and post scripts in Amazon Data Lifecycle Manager EBS snapshot lifecycle policies. +* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.62.0](service/rds/CHANGELOG.md#v1620-2023-11-07) + * **Feature**: This Amazon RDS release adds support for the multi-tenant configuration. In this configuration, an RDS DB instance can contain multiple tenant databases. In RDS for Oracle, a tenant database is a pluggable database (PDB). + +# Release (2023-11-06) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/codebuild`: [v1.25.0](service/codebuild/CHANGELOG.md#v1250-2023-11-06) + * **Feature**: AWS CodeBuild now supports AWS Lambda compute. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.77.0](service/connect/CHANGELOG.md#v1770-2023-11-06) + * **Feature**: Added new API that allows Amazon Connect Outbound Campaigns to create contacts in Amazon Connect when ingesting your dial requests. +* `github.com/aws/aws-sdk-go-v2/service/costexplorer`: [v1.32.0](service/costexplorer/CHANGELOG.md#v1320-2023-11-06) + * **Feature**: This release extends the GetReservationPurchaseRecommendation API to support recommendations for Amazon MemoryDB reservations. +* `github.com/aws/aws-sdk-go-v2/service/docdb`: [v1.27.0](service/docdb/CHANGELOG.md#v1270-2023-11-06) + * **Feature**: Update the input of CreateDBInstance and ModifyDBInstance to support setting CA Certificates. Update the output of DescribeDBInstance and DescribeDBEngineVersions to show current and supported CA certificates. +* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.27.0](service/iam/CHANGELOG.md#v1270-2023-11-06) + * **Feature**: Add partitional endpoint for iso-e. +* `github.com/aws/aws-sdk-go-v2/service/mwaa`: [v1.20.0](service/mwaa/CHANGELOG.md#v1200-2023-11-06) + * **Feature**: This release adds support for Apache Airflow version 2.7.2. This version release includes support for deferrable operators and triggers. +* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.34.0](service/polly/CHANGELOG.md#v1340-2023-11-06) + * **Feature**: Amazon Polly adds new US English voices - Danielle and Gregory. Danielle and Gregory are available as Neural voices only. +* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.34.0](service/route53/CHANGELOG.md#v1340-2023-11-06) + * **Feature**: Add partitional endpoints for iso-e and iso-f. + +# Release (2023-11-03) + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.41.0](service/configservice/CHANGELOG.md#v1410-2023-11-03) + * **Feature**: Updated ResourceType enum with new resource types onboarded by AWS Config in October 2023. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.76.0](service/connect/CHANGELOG.md#v1760-2023-11-03) + * **Feature**: Amazon Connect Chat introduces Create Persistent Contact Association API, allowing customers to choose when to resume previous conversations from previous chats, eliminating the need to repeat themselves and allowing agents to provide personalized service with access to entire conversation history. +* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.33.0](service/iotwireless/CHANGELOG.md#v1330-2023-11-03) + * **Feature**: Added LoRaWAN version 1.0.4 support +* `github.com/aws/aws-sdk-go-v2/service/launchwizard`: [v1.0.0](service/launchwizard/CHANGELOG.md#v100-2023-11-03) + * **Release**: New AWS service client module + * **Feature**: AWS Launch Wizard is a service that helps reduce the time it takes to deploy applications to the cloud while providing a guided deployment experience. + +# Release (2023-11-02) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/aws-sdk-go-v2/config`: [v1.22.0](config/CHANGELOG.md#v1220-2023-11-02) + * **Feature**: Add env and shared config settings for disabling IMDSv1 fallback. +* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.24.0](service/apprunner/CHANGELOG.md#v1240-2023-11-02) + * **Feature**: AWS App Runner now supports using dual-stack address type for the public endpoint of your incoming traffic. +* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.75.0](service/connect/CHANGELOG.md#v1750-2023-11-02) + * **Feature**: GetMetricDataV2 API: Update to include new metrics PERCENT_NON_TALK_TIME, PERCENT_TALK_TIME, PERCENT_TALK_TIME_AGENT, PERCENT_TALK_TIME_CUSTOMER +* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.26.0](service/gamelift/CHANGELOG.md#v1260-2023-11-02) + * **Feature**: Amazon GameLift adds support for shared credentials, which allows applications that are deployed on managed EC2 fleets to interact with other AWS resources. +* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.67.0](service/glue/CHANGELOG.md#v1670-2023-11-02) + * **Feature**: This release introduces Google BigQuery Source and Target in AWS Glue CodeGenConfigurationNode. +* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.35.0](service/networkfirewall/CHANGELOG.md#v1350-2023-11-02) + * **Feature**: This release introduces the stateless rule analyzer, which enables you to analyze your stateless rules for asymmetric routing. +* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.50.0](service/quicksight/CHANGELOG.md#v1500-2023-11-02) + * **Feature**: This release introduces Float Decimal Type as SubType in QuickSight SPICE datasets and Custom week start and Custom timezone options in Analysis and Dashboard + # Release (2023-11-01) ## General Highlights diff --git a/vendor/github.com/aws/aws-sdk-go-v2/Makefile b/vendor/github.com/aws/aws-sdk-go-v2/Makefile index e089ad351e..ed45b15d33 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/Makefile +++ b/vendor/github.com/aws/aws-sdk-go-v2/Makefile @@ -254,7 +254,7 @@ unit-race-modules-%: && go run . -p $(subst _,/,$(subst unit-race-modules-,,$@)) ${EACHMODULE_FLAGS} \ "go vet ${BUILD_TAGS} --all ./..." \ "go test ${BUILD_TAGS} ${RUN_NONE} ./..." \ - "go test -timeout=1m ${UNIT_TEST_TAGS} -race -cpu=4 ./..." + "go test -timeout=2m ${UNIT_TEST_TAGS} -race -cpu=4 ./..." unit-modules-%: @# unit command that uses the pattern to define the root path that the @@ -266,7 +266,7 @@ unit-modules-%: && go run . -p $(subst _,/,$(subst unit-modules-,,$@)) ${EACHMODULE_FLAGS} \ "go vet ${BUILD_TAGS} --all ./..." \ "go test ${BUILD_TAGS} ${RUN_NONE} ./..." \ - "go test -timeout=1m ${UNIT_TEST_TAGS} ./..." + "go test -timeout=2m ${UNIT_TEST_TAGS} ./..." build: build-modules-. @@ -302,7 +302,7 @@ test-race-modules-%: @# e.g. test-race-modules-internal_protocoltest cd ./internal/repotools/cmd/eachmodule \ && go run . -p $(subst _,/,$(subst test-race-modules-,,$@)) ${EACHMODULE_FLAGS} \ - "go test -timeout=1m ${UNIT_TEST_TAGS} -race -cpu=4 ./..." + "go test -timeout=2m ${UNIT_TEST_TAGS} -race -cpu=4 ./..." test-modules-%: @# Test command that uses the pattern to define the root path that the @@ -312,7 +312,7 @@ test-modules-%: @# e.g. test-modules-internal_protocoltest cd ./internal/repotools/cmd/eachmodule \ && go run . -p $(subst _,/,$(subst test-modules-,,$@)) ${EACHMODULE_FLAGS} \ - "go test -timeout=1m ${UNIT_TEST_TAGS} ./..." + "go test -timeout=2m ${UNIT_TEST_TAGS} ./..." cachedep: cachedep-modules-. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 84b19df691..a88bb2f758 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.22.1" +const goModuleVersion = "1.22.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go index 71b1a35217..ca738f234b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go @@ -38,6 +38,7 @@ var RequiredSignedHeaders = Rules{ "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, + "X-Amz-Expected-Bucket-Owner": struct{}{}, "X-Amz-Grant-Full-control": struct{}{}, "X-Amz-Grant-Read": struct{}{}, "X-Amz-Grant-Read-Acp": struct{}{}, diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index 88593b55ef..cb9e921868 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,20 @@ +# v1.23.0 (2023-11-09.2) + +* **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.22.3 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.22.2 (2023-11-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.22.1 (2023-11-06) + +* No change notes available for this release. + # v1.22.0 (2023-11-02) * **Feature**: Add env and shared config settings for disabling IMDSv1 fallback. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/config.go b/vendor/github.com/aws/aws-sdk-go-v2/config/config.go index ef9f753d40..dfe6297322 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/config.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/config.go @@ -165,7 +165,7 @@ func (cs configs) ResolveConfig(f func(configs []interface{}) error) error { // or the custom data will be ignored by the resolvers and config loaders. // // cfg, err := config.LoadDefaultConfig( context.TODO(), -// WithSharedConfigProfile("test-profile"), +// config.WithSharedConfigProfile("test-profile"), // ) // if err != nil { // panic(fmt.Sprintf("failed loading config, %v", err)) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index 1450b496b4..93e6f6343f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.22.0" +const goModuleVersion = "1.23.0" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index 6c3ca4670b..65c8de8538 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.15.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.15.1 (2023-11-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index e6cba9dc3d..365a855452 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.15.1" +const goModuleVersion = "1.15.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index ba06fb1991..c566941f9e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.14.3 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.14.2 (2023-11-02) * No change notes available for this release. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index 36432a4ff1..eea163103e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.14.2" +const goModuleVersion = "1.14.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md index 81390290f1..1cd5aea9d3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md @@ -1,3 +1,19 @@ +# v1.13.5 (2023-11-09.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.4 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.3 (2023-11-07) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.2 (2023-11-06) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.13.1 (2023-11-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go index 8a7aaa2d03..13b5e5eeff 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go @@ -3,4 +3,4 @@ package manager // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.1" +const goModuleVersion = "1.13.5" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index e26f211e8f..d260b444dc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.2.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index 7766ee9186..991b7b84ab 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.2.1" +const goModuleVersion = "1.2.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index e19cd66308..1a188a5715 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,7 @@ +# v2.5.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v2.5.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index 7128c248cc..adb6f69921 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.5.1" +const goModuleVersion = "2.5.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md index 558a781de5..7ac3ab5756 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.6.0 (2023-11-09.2) + +* **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored + +# v1.5.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.5.1 (2023-11-07) + +* **Bug Fix**: Fix subproperty performance regression + # v1.5.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go index cd6cdb2d8f..8ceb1de67c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go @@ -3,4 +3,4 @@ package ini // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.5.0" +const goModuleVersion = "1.6.0" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini_parser.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini_parser.go index 12fc7d5aa4..e7f8edab3a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini_parser.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini_parser.go @@ -187,6 +187,13 @@ loop: stack.Push(k) case StatementState: if k.Kind != ASTKindStart { + if tok.Type() == TokenLit && isSubProperty(tok.raw) { + return nil, NewParseError( + fmt.Sprintf( + "Invalid token, remove leading whitespace %s", + string(tok.raw)), + ) + } stack.MarkComplete(k) } expr := newExpression(tok) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/literal_tokens.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/literal_tokens.go index a24903202a..f5a5c9e2e7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/literal_tokens.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/literal_tokens.go @@ -133,6 +133,17 @@ func newLitToken(b []rune) (Token, int, error) { return token, n, err } +// replace with slices.Contains when Go 1.21 +// is min supported Go version in the SDK +func containsRune(runes []rune, val rune) bool { + for i := range runes { + if val == runes[i] { + return true + } + } + return false +} + func isSubProperty(runes []rune) bool { // needs at least // (1) newline (2) whitespace (3) literal @@ -141,10 +152,7 @@ func isSubProperty(runes []rune) bool { } // must have an equal expression - split := strings.FieldsFunc(string(runes), func(r rune) bool { - return isOp([]rune{r}) - }) - if len(split) < 2 { + if !containsRune(runes, '=') && !containsRune(runes, ':') { return false } @@ -156,7 +164,6 @@ func isSubProperty(runes []rune) bool { if err != nil { return false } - // whitespace must follow newline return isWhitespace(runes[n]) } @@ -171,7 +178,7 @@ func getSubProperty(runes []rune, offset int) (int, error) { return offset + idx, nil } } - return 0, fmt.Errorf("no sub property") + return offset + len(runes), nil } // MapValue returns a map value for sub properties diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md index bd0c9511ca..bd6df25e5d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.2.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go index ecaa3aa94f..c3f3ccd2d7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go @@ -3,4 +3,4 @@ package v4a // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.2.1" +const goModuleVersion = "1.2.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md index 260701f196..755c724576 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.2.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go index c3acd0aeb3..6c1014007e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go @@ -3,4 +3,4 @@ package checksum // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.2.1" +const goModuleVersion = "1.2.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index b8338d32bd..99a54769af 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.10.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.10.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index d4d780e218..66b8acd87c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.10.1" +const goModuleVersion = "1.10.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md index 6ac972d6e1..2d3ad6a940 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.16.2 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.16.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go index 4f9ef63254..5c003a13f4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go @@ -3,4 +3,4 @@ package s3shared // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.16.1" +const goModuleVersion = "1.16.2" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md index 9f3eec7458..576ddff796 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.42.1 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.42.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go index c8f7012a01..9ef7a1d2b4 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go @@ -3,4 +3,4 @@ package s3 // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.42.0" +const goModuleVersion = "1.42.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index 04222cda22..a4c1d64596 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.17.1 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.17.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index d5611c5cd8..cd496510f1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.17.0" +const goModuleVersion = "1.17.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index 057f9a25e1..b47827d724 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.19.1 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.19.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index 856141700d..bcd16fdeac 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.19.0" +const goModuleVersion = "1.19.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index 2e5ca8f87f..eefcd87306 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.25.1 (2023-11-09) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.25.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index dac009e1cc..f934c18f6a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.25.0" +const goModuleVersion = "1.25.1" diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go index 5d211f32cc..1b6d24216c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -1818,6 +1818,12 @@ var awsPartition = partition{ endpointKey{ Region: "ap-northeast-1", }: endpoint{}, + endpointKey{ + Region: "ap-northeast-2", + }: endpoint{}, + endpointKey{ + Region: "ap-northeast-3", + }: endpoint{}, endpointKey{ Region: "ap-south-1", }: endpoint{}, @@ -1827,12 +1833,27 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-4", + }: endpoint{}, + endpointKey{ + Region: "ca-central-1", + }: endpoint{}, endpointKey{ Region: "eu-central-1", }: endpoint{}, + endpointKey{ + Region: "eu-north-1", + }: endpoint{}, endpointKey{ Region: "eu-west-1", }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, + endpointKey{ + Region: "sa-east-1", + }: endpoint{}, endpointKey{ Region: "us-east-1", }: endpoint{}, @@ -3145,6 +3166,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-northeast-1", }: endpoint{}, + endpointKey{ + Region: "ap-south-1", + }: endpoint{}, endpointKey{ Region: "ap-southeast-1", }: endpoint{}, @@ -3157,6 +3181,12 @@ var awsPartition = partition{ endpointKey{ Region: "eu-west-1", }: endpoint{}, + endpointKey{ + Region: "eu-west-2", + }: endpoint{}, + endpointKey{ + Region: "eu-west-3", + }: endpoint{}, endpointKey{ Region: "fips-us-east-1", }: endpoint{ @@ -7415,6 +7445,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-3", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-4", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, @@ -23707,6 +23740,16 @@ var awsPartition = partition{ }, }, Endpoints: serviceEndpoints{ + endpointKey{ + Region: "af-south-1", + }: endpoint{ + Hostname: "resource-explorer-2.af-south-1.api.aws", + }, + endpointKey{ + Region: "ap-east-1", + }: endpoint{ + Hostname: "resource-explorer-2.ap-east-1.api.aws", + }, endpointKey{ Region: "ap-northeast-1", }: endpoint{ @@ -23772,6 +23815,11 @@ var awsPartition = partition{ }: endpoint{ Hostname: "resource-explorer-2.eu-north-1.api.aws", }, + endpointKey{ + Region: "eu-south-1", + }: endpoint{ + Hostname: "resource-explorer-2.eu-south-1.api.aws", + }, endpointKey{ Region: "eu-west-1", }: endpoint{ @@ -23792,6 +23840,11 @@ var awsPartition = partition{ }: endpoint{ Hostname: "resource-explorer-2.il-central-1.api.aws", }, + endpointKey{ + Region: "me-central-1", + }: endpoint{ + Hostname: "resource-explorer-2.me-central-1.api.aws", + }, endpointKey{ Region: "me-south-1", }: endpoint{ @@ -42079,6 +42132,13 @@ var awsisobPartition = partition{ }: endpoint{}, }, }, + "cloudcontrolapi": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-isob-east-1", + }: endpoint{}, + }, + }, "cloudformation": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -42502,6 +42562,13 @@ var awsisobPartition = partition{ }: endpoint{}, }, }, + "runtime.sagemaker": service{ + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "us-isob-east-1", + }: endpoint{}, + }, + }, "s3": service{ Defaults: endpointDefaults{ defaultKey{}: endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go index b209793744..b542df9315 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go @@ -125,6 +125,7 @@ var requiredSignedHeaders = rules{ "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, + "X-Amz-Expected-Bucket-Owner": struct{}{}, "X-Amz-Grant-Full-control": struct{}{}, "X-Amz-Grant-Read": struct{}{}, "X-Amz-Grant-Read-Acp": struct{}{}, diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go index 6c3447fa89..761ea40bf2 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -5,4 +5,4 @@ package aws const SDKName = "aws-sdk-go" // SDKVersion is the version of this SDK -const SDKVersion = "1.47.2" +const SDKVersion = "1.47.9" diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go index 889f9e77bd..c4234287dc 100644 --- a/vendor/github.com/fatih/color/color.go +++ b/vendor/github.com/fatih/color/color.go @@ -65,6 +65,29 @@ const ( CrossedOut ) +const ( + ResetBold Attribute = iota + 22 + ResetItalic + ResetUnderline + ResetBlinking + _ + ResetReversed + ResetConcealed + ResetCrossedOut +) + +var mapResetAttributes map[Attribute]Attribute = map[Attribute]Attribute{ + Bold: ResetBold, + Faint: ResetBold, + Italic: ResetItalic, + Underline: ResetUnderline, + BlinkSlow: ResetBlinking, + BlinkRapid: ResetBlinking, + ReverseVideo: ResetReversed, + Concealed: ResetConcealed, + CrossedOut: ResetCrossedOut, +} + // Foreground text colors const ( FgBlack Attribute = iota + 30 @@ -246,10 +269,7 @@ func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.SetWriter(w) - defer c.UnsetWriter(w) - - return fmt.Fprintln(w, a...) + return fmt.Fprintln(w, c.wrap(fmt.Sprint(a...))) } // Println formats using the default formats for its operands and writes to @@ -258,10 +278,7 @@ func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { // encountered. This is the standard fmt.Print() method wrapped with the given // color. func (c *Color) Println(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintln(Output, a...) + return fmt.Fprintln(Output, c.wrap(fmt.Sprint(a...))) } // Sprint is just like Print, but returns a string instead of printing it. @@ -271,7 +288,7 @@ func (c *Color) Sprint(a ...interface{}) string { // Sprintln is just like Println, but returns a string instead of printing it. func (c *Color) Sprintln(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) + return fmt.Sprintln(c.Sprint(a...)) } // Sprintf is just like Printf, but returns a string instead of printing it. @@ -353,7 +370,7 @@ func (c *Color) SprintfFunc() func(format string, a ...interface{}) string { // string. Windows users should use this in conjunction with color.Output. func (c *Color) SprintlnFunc() func(a ...interface{}) string { return func(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) + return fmt.Sprintln(c.Sprint(a...)) } } @@ -383,7 +400,18 @@ func (c *Color) format() string { } func (c *Color) unformat() string { - return fmt.Sprintf("%s[%dm", escape, Reset) + //return fmt.Sprintf("%s[%dm", escape, Reset) + //for each element in sequence let's use the speficic reset escape, ou the generic one if not found + format := make([]string, len(c.params)) + for i, v := range c.params { + format[i] = strconv.Itoa(int(Reset)) + ra, ok := mapResetAttributes[v] + if ok { + format[i] = strconv.Itoa(int(ra)) + } + } + + return fmt.Sprintf("%s[%sm", escape, strings.Join(format, ";")) } // DisableColor disables the color output. Useful to not change any existing @@ -411,6 +439,12 @@ func (c *Color) isNoColorSet() bool { // Equals returns a boolean value indicating whether two colors are equal. func (c *Color) Equals(c2 *Color) bool { + if c == nil && c2 == nil { + return true + } + if c == nil || c2 == nil { + return false + } if len(c.params) != len(c2.params) { return false } diff --git a/vendor/github.com/felixge/httpsnoop/.travis.yml b/vendor/github.com/felixge/httpsnoop/.travis.yml deleted file mode 100644 index bfc421200d..0000000000 --- a/vendor/github.com/felixge/httpsnoop/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: go - -go: - - 1.6 - - 1.7 - - 1.8 diff --git a/vendor/github.com/felixge/httpsnoop/Makefile b/vendor/github.com/felixge/httpsnoop/Makefile index 2d84889aed..4e12afdd90 100644 --- a/vendor/github.com/felixge/httpsnoop/Makefile +++ b/vendor/github.com/felixge/httpsnoop/Makefile @@ -1,7 +1,7 @@ .PHONY: ci generate clean ci: clean generate - go test -v ./... + go test -race -v ./... generate: go generate . diff --git a/vendor/github.com/felixge/httpsnoop/README.md b/vendor/github.com/felixge/httpsnoop/README.md index ddcecd13e7..cf6b42f3d7 100644 --- a/vendor/github.com/felixge/httpsnoop/README.md +++ b/vendor/github.com/felixge/httpsnoop/README.md @@ -7,8 +7,8 @@ http.Handlers. Doing this requires non-trivial wrapping of the http.ResponseWriter interface, which is also exposed for users interested in a more low-level API. -[![GoDoc](https://godoc.org/github.com/felixge/httpsnoop?status.svg)](https://godoc.org/github.com/felixge/httpsnoop) -[![Build Status](https://travis-ci.org/felixge/httpsnoop.svg?branch=master)](https://travis-ci.org/felixge/httpsnoop) +[![Go Reference](https://pkg.go.dev/badge/github.com/felixge/httpsnoop.svg)](https://pkg.go.dev/github.com/felixge/httpsnoop) +[![Build Status](https://github.com/felixge/httpsnoop/actions/workflows/main.yaml/badge.svg)](https://github.com/felixge/httpsnoop/actions/workflows/main.yaml) ## Usage Example diff --git a/vendor/github.com/felixge/httpsnoop/capture_metrics.go b/vendor/github.com/felixge/httpsnoop/capture_metrics.go index b77cc7c009..bec7b71b39 100644 --- a/vendor/github.com/felixge/httpsnoop/capture_metrics.go +++ b/vendor/github.com/felixge/httpsnoop/capture_metrics.go @@ -52,7 +52,7 @@ func (m *Metrics) CaptureMetrics(w http.ResponseWriter, fn func(http.ResponseWri return func(code int) { next(code) - if !headerWritten { + if !(code >= 100 && code <= 199) && !headerWritten { m.Code = code headerWritten = true } diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go index 31cbdfb8ef..101cedde67 100644 --- a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go @@ -1,5 +1,5 @@ // +build go1.8 -// Code generated by "httpsnoop/codegen"; DO NOT EDIT +// Code generated by "httpsnoop/codegen"; DO NOT EDIT. package httpsnoop diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go index ab99c07c7a..e0951df152 100644 --- a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go @@ -1,5 +1,5 @@ // +build !go1.8 -// Code generated by "httpsnoop/codegen"; DO NOT EDIT +// Code generated by "httpsnoop/codegen"; DO NOT EDIT. package httpsnoop diff --git a/vendor/github.com/golang-jwt/jwt/v5/ed25519.go b/vendor/github.com/golang-jwt/jwt/v5/ed25519.go index 3db00e4a23..eb6bdf01df 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/ed25519.go +++ b/vendor/github.com/golang-jwt/jwt/v5/ed25519.go @@ -1,11 +1,10 @@ package jwt import ( - "errors" - "crypto" "crypto/ed25519" "crypto/rand" + "errors" ) var ( diff --git a/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go b/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go index 3afb04e648..2ad542f00c 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go +++ b/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go @@ -22,7 +22,7 @@ func (je joinedError) Is(err error) bool { // wrappedErrors is a workaround for wrapping multiple errors in environments // where Go 1.20 is not available. It basically uses the already implemented -// functionatlity of joinedError to handle multiple errors with supplies a +// functionality of joinedError to handle multiple errors with supplies a // custom error message that is identical to the one we produce in Go 1.20 using // multiple %w directives. type wrappedErrors struct { diff --git a/vendor/github.com/golang-jwt/jwt/v5/none.go b/vendor/github.com/golang-jwt/jwt/v5/none.go index c93daa5849..685c2ea306 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/none.go +++ b/vendor/github.com/golang-jwt/jwt/v5/none.go @@ -32,7 +32,7 @@ func (m *signingMethodNone) Verify(signingString string, sig []byte, key interfa return NoneSignatureTypeDisallowedError } // If signing method is none, signature must be an empty string - if string(sig) != "" { + if len(sig) != 0 { return newError("'none' signing method with non-empty signature", ErrTokenUnverifiable) } diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser.go b/vendor/github.com/golang-jwt/jwt/v5/parser.go index f4386fbaac..1ed2e4e4d3 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/parser.go +++ b/vendor/github.com/golang-jwt/jwt/v5/parser.go @@ -74,24 +74,40 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf } } - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, newError("no keyfunc was provided", ErrTokenUnverifiable) - } - if key, err = keyFunc(token); err != nil { - return token, newError("error while executing keyfunc", ErrTokenUnverifiable, err) - } - // Decode signature token.Signature, err = p.DecodeSegment(parts[2]) if err != nil { return token, newError("could not base64 decode signature", ErrTokenMalformed, err) } + text := strings.Join(parts[0:2], ".") - // Perform signature validation - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { + // Lookup key(s) + if keyFunc == nil { + // keyFunc was not provided. short circuiting validation + return token, newError("no keyfunc was provided", ErrTokenUnverifiable) + } + + got, err := keyFunc(token) + if err != nil { + return token, newError("error while executing keyfunc", ErrTokenUnverifiable, err) + } + + switch have := got.(type) { + case VerificationKeySet: + if len(have.Keys) == 0 { + return token, newError("keyfunc returned empty verification key set", ErrTokenUnverifiable) + } + // Iterate through keys and verify signature, skipping the rest when a match is found. + // Return the last error if no match is found. + for _, key := range have.Keys { + if err = token.Method.Verify(text, token.Signature, key); err == nil { + break + } + } + default: + err = token.Method.Verify(text, token.Signature, have) + } + if err != nil { return token, newError("", ErrTokenSignatureInvalid, err) } @@ -117,8 +133,8 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf // // WARNING: Don't use this method unless you know what you're doing. // -// It's only ever useful in cases where you know the signature is valid (because it has -// been checked previously in the stack) and you want to extract values from it. +// It's only ever useful in cases where you know the signature is valid (since it has already +// been or will be checked elsewhere in the stack) and you want to extract values from it. func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { parts = strings.Split(tokenString, ".") if len(parts) != 3 { @@ -130,9 +146,6 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke // parse Header var headerBytes []byte if headerBytes, err = p.DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, parts, newError("tokenstring should not contain 'bearer '", ErrTokenMalformed) - } return token, parts, newError("could not base64 decode header", ErrTokenMalformed, err) } if err = json.Unmarshal(headerBytes, &token.Header); err != nil { @@ -140,23 +153,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke } // parse Claims - var claimBytes []byte token.Claims = claims - if claimBytes, err = p.DecodeSegment(parts[1]); err != nil { + claimBytes, err := p.DecodeSegment(parts[1]) + if err != nil { return token, parts, newError("could not base64 decode claim", ErrTokenMalformed, err) } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.useJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) + + // If `useJSONNumber` is enabled then we must use *json.Decoder to decode + // the claims. However, this comes with a performance penalty so only use + // it if we must and, otherwise, simple use json.Unmarshal. + if !p.useJSONNumber { + // JSON Unmarshal. Special case for map type to avoid weird pointer behavior. + if c, ok := token.Claims.(MapClaims); ok { + err = json.Unmarshal(claimBytes, &c) + } else { + err = json.Unmarshal(claimBytes, &claims) + } } else { - err = dec.Decode(&claims) + dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) + dec.UseNumber() + // JSON Decode. Special case for map type to avoid weird pointer behavior. + if c, ok := token.Claims.(MapClaims); ok { + err = dec.Decode(&c) + } else { + err = dec.Decode(&claims) + } } - // Handle decode error if err != nil { return token, parts, newError("could not JSON decode claim", ErrTokenMalformed, err) } diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser_option.go b/vendor/github.com/golang-jwt/jwt/v5/parser_option.go index 1b5af970f6..88a780fbd4 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/parser_option.go +++ b/vendor/github.com/golang-jwt/jwt/v5/parser_option.go @@ -58,6 +58,14 @@ func WithIssuedAt() ParserOption { } } +// WithExpirationRequired returns the ParserOption to make exp claim required. +// By default exp claim is optional. +func WithExpirationRequired() ParserOption { + return func(p *Parser) { + p.validator.requireExp = true + } +} + // WithAudience configures the validator to require the specified audience in // the `aud` claim. Validation will fail if the audience is not listed in the // token or the `aud` claim is missing. diff --git a/vendor/github.com/golang-jwt/jwt/v5/token.go b/vendor/github.com/golang-jwt/jwt/v5/token.go index c8ad7c7834..352873a2d9 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/token.go +++ b/vendor/github.com/golang-jwt/jwt/v5/token.go @@ -1,6 +1,7 @@ package jwt import ( + "crypto" "encoding/base64" "encoding/json" ) @@ -9,8 +10,21 @@ import ( // the key for verification. The function receives the parsed, but unverified // Token. This allows you to use properties in the Header of the token (such as // `kid`) to identify which key to use. +// +// The returned interface{} may be a single key or a VerificationKeySet containing +// multiple keys. type Keyfunc func(*Token) (interface{}, error) +// VerificationKey represents a public or secret key for verifying a token's signature. +type VerificationKey interface { + crypto.PublicKey | []uint8 +} + +// VerificationKeySet is a set of public or secret keys. It is used by the parser to verify a token. +type VerificationKeySet struct { + Keys []VerificationKey +} + // Token represents a JWT Token. Different fields will be used depending on // whether you're creating or parsing/verifying a token. type Token struct { diff --git a/vendor/github.com/golang-jwt/jwt/v5/types.go b/vendor/github.com/golang-jwt/jwt/v5/types.go index b82b38867d..b2655a9e6d 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/types.go +++ b/vendor/github.com/golang-jwt/jwt/v5/types.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "math" - "reflect" "strconv" "time" ) @@ -121,14 +120,14 @@ func (s *ClaimStrings) UnmarshalJSON(data []byte) (err error) { for _, vv := range v { vs, ok := vv.(string) if !ok { - return &json.UnsupportedTypeError{Type: reflect.TypeOf(vv)} + return ErrInvalidType } aud = append(aud, vs) } case nil: return nil default: - return &json.UnsupportedTypeError{Type: reflect.TypeOf(v)} + return ErrInvalidType } *s = aud diff --git a/vendor/github.com/golang-jwt/jwt/v5/validator.go b/vendor/github.com/golang-jwt/jwt/v5/validator.go index 3850438939..3082c8c7e6 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/validator.go +++ b/vendor/github.com/golang-jwt/jwt/v5/validator.go @@ -42,6 +42,9 @@ type validator struct { // validation. If unspecified, this defaults to time.Now. timeFunc func() time.Time + // requireExp specifies whether the exp claim is required + requireExp bool + // verifyIat specifies whether the iat (Issued At) claim will be verified. // According to https://www.rfc-editor.org/rfc/rfc7519#section-4.1.6 this // only specifies the age of the token, but no validation check is @@ -86,8 +89,9 @@ func (v *validator) Validate(claims Claims) error { } // We always need to check the expiration time, but usage of the claim - // itself is OPTIONAL. - if err = v.verifyExpiresAt(claims, now, false); err != nil { + // itself is OPTIONAL by default. requireExp overrides this behavior + // and makes the exp claim mandatory. + if err = v.verifyExpiresAt(claims, now, v.requireExp); err != nil { errs = append(errs, err) } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go index 303e5505e4..9509014e87 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go @@ -34,7 +34,7 @@ const ( RequestCount = "http.server.request_count" // Incoming request count total RequestContentLength = "http.server.request_content_length" // Incoming request bytes total ResponseContentLength = "http.server.response_content_length" // Incoming response bytes total - ServerLatency = "http.server.duration" // Incoming end to end duration, microseconds + ServerLatency = "http.server.duration" // Incoming end to end duration, milliseconds ) // Filter is a predicate used to determine whether a given http.request should @@ -42,5 +42,5 @@ const ( type Filter func(*http.Request) bool func newTracer(tp trace.TracerProvider) trace.Tracer { - return tp.Tracer(instrumentationName, trace.WithInstrumentationVersion(Version())) + return tp.Tracer(ScopeName, trace.WithInstrumentationVersion(Version())) } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go index e4fa1b8d9d..a1b5b5e5aa 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go @@ -25,9 +25,8 @@ import ( "go.opentelemetry.io/otel/trace" ) -const ( - instrumentationName = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" -) +// ScopeName is the instrumentation scope name. +const ScopeName = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" // config represents the configuration options available for the http.Handler // and http.Transport types. @@ -76,7 +75,7 @@ func newConfig(opts ...Option) *config { } c.Meter = c.MeterProvider.Meter( - instrumentationName, + ScopeName, metric.WithInstrumentationVersion(Version()), ) diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go index b2fbe07841..9a8260059d 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go @@ -107,13 +107,25 @@ func (h *middleware) createMeasures() { h.counters = make(map[string]metric.Int64Counter) h.valueRecorders = make(map[string]metric.Float64Histogram) - requestBytesCounter, err := h.meter.Int64Counter(RequestContentLength) + requestBytesCounter, err := h.meter.Int64Counter( + RequestContentLength, + metric.WithUnit("By"), + metric.WithDescription("Measures the size of HTTP request content length (uncompressed)"), + ) handleErr(err) - responseBytesCounter, err := h.meter.Int64Counter(ResponseContentLength) + responseBytesCounter, err := h.meter.Int64Counter( + ResponseContentLength, + metric.WithUnit("By"), + metric.WithDescription("Measures the size of HTTP response content length (uncompressed)"), + ) handleErr(err) - serverLatencyMeasure, err := h.meter.Float64Histogram(ServerLatency) + serverLatencyMeasure, err := h.meter.Float64Histogram( + ServerLatency, + metric.WithUnit("ms"), + metric.WithDescription("Measures the duration of HTTP request handling"), + ) handleErr(err) h.counters[RequestContentLength] = requestBytesCounter diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go index 6eace875cf..8a5cf07bd2 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go @@ -16,7 +16,7 @@ package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http // Version is the current release version of the otelhttp instrumentation. func Version() string { - return "0.45.0" + return "0.46.0" // This string is updated by the pre_release.sh script during release } diff --git a/vendor/go.opentelemetry.io/otel/.gitignore b/vendor/go.opentelemetry.io/otel/.gitignore index f3355c852b..9248055655 100644 --- a/vendor/go.opentelemetry.io/otel/.gitignore +++ b/vendor/go.opentelemetry.io/otel/.gitignore @@ -18,8 +18,9 @@ gen/ /example/fib/traces.txt /example/jaeger/jaeger /example/namedtracer/namedtracer +/example/otel-collector/otel-collector /example/opencensus/opencensus /example/passthrough/passthrough /example/prometheus/prometheus +/example/view/view /example/zipkin/zipkin -/example/otel-collector/otel-collector diff --git a/vendor/go.opentelemetry.io/otel/.golangci.yml b/vendor/go.opentelemetry.io/otel/.golangci.yml index 6e8eeec00f..a62511f382 100644 --- a/vendor/go.opentelemetry.io/otel/.golangci.yml +++ b/vendor/go.opentelemetry.io/otel/.golangci.yml @@ -12,8 +12,9 @@ linters: - depguard - errcheck - godot - - gofmt + - gofumpt - goimports + - gosec - gosimple - govet - ineffassign @@ -53,6 +54,20 @@ issues: text: "calls to (.+) only in main[(][)] or init[(][)] functions" linters: - revive + # It's okay to not run gosec in a test. + - path: _test\.go + linters: + - gosec + # Igonoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand) + # as we commonly use it in tests and examples. + - text: "G404:" + linters: + - gosec + # Igonoring gosec G402: TLS MinVersion too low + # as the https://pkg.go.dev/crypto/tls#Config handles MinVersion default well. + - text: "G402: TLS MinVersion too low." + linters: + - gosec include: # revive exported should have comment or be unexported. - EXC0012 diff --git a/vendor/go.opentelemetry.io/otel/CHANGELOG.md b/vendor/go.opentelemetry.io/otel/CHANGELOG.md index 3e5c35b5dc..c4e7ad475f 100644 --- a/vendor/go.opentelemetry.io/otel/CHANGELOG.md +++ b/vendor/go.opentelemetry.io/otel/CHANGELOG.md @@ -8,6 +8,71 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [1.20.0/0.43.0] 2023-11-10 + +This release brings a breaking change for custom trace API implementations. Some interfaces (`TracerProvider`, `Tracer`, `Span`) now embed the `go.opentelemetry.io/otel/trace/embedded` types. Implementors need to update their implementations based on what they want the default behavior to be. See the "API Implementations" section of the [trace API] package documentation for more information about how to accomplish this. + +### Added + +- Add `go.opentelemetry.io/otel/bridge/opencensus.InstallTraceBridge`, which installs the OpenCensus trace bridge, and replaces `opencensus.NewTracer`. (#4567) +- Add scope version to trace and metric bridges in `go.opentelemetry.io/otel/bridge/opencensus`. (#4584) +- Add the `go.opentelemetry.io/otel/trace/embedded` package to be embedded in the exported trace API interfaces. (#4620) +- Add the `go.opentelemetry.io/otel/trace/noop` package as a default no-op implementation of the trace API. (#4620) +- Add context propagation in `go.opentelemetry.io/otel/example/dice`. (#4644) +- Add view configuration to `go.opentelemetry.io/otel/example/prometheus`. (#4649) +- Add `go.opentelemetry.io/otel/metric.WithExplicitBucketBoundaries`, which allows defining default explicit bucket boundaries when creating histogram instruments. (#4603) +- Add `Version` function in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4660) +- Add `Version` function in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4660) +- Add Summary, SummaryDataPoint, and QuantileValue to `go.opentelemetry.io/sdk/metric/metricdata`. (#4622) +- `go.opentelemetry.io/otel/bridge/opencensus.NewMetricProducer` now supports exemplars from OpenCensus. (#4585) +- Add support for `WithExplicitBucketBoundaries` in `go.opentelemetry.io/otel/sdk/metric`. (#4605) +- Add support for Summary metrics in `go.opentelemetry.io/otel/bridge/opencensus`. (#4668) + +### Deprecated + +- Deprecate `go.opentelemetry.io/otel/bridge/opencensus.NewTracer` in favor of `opencensus.InstallTraceBridge`. (#4567) +- Deprecate `go.opentelemetry.io/otel/example/fib` package is in favor of `go.opentelemetry.io/otel/example/dice`. (#4618) +- Deprecate `go.opentelemetry.io/otel/trace.NewNoopTracerProvider`. + Use the added `NewTracerProvider` function in `go.opentelemetry.io/otel/trace/noop` instead. (#4620) +- Deprecate `go.opentelemetry.io/otel/example/view` package in favor of `go.opentelemetry.io/otel/example/prometheus`. (#4649) +- Deprecate `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4693) + +### Changed + +- `go.opentelemetry.io/otel/bridge/opencensus.NewMetricProducer` returns a `*MetricProducer` struct instead of the metric.Producer interface. (#4583) +- The `TracerProvider` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.TracerProvider` type. + This extends the `TracerProvider` interface and is is a breaking change for any existing implementation. + Implementors need to update their implementations based on what they want the default behavior of the interface to be. + See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620) +- The `Tracer` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.Tracer` type. + This extends the `Tracer` interface and is is a breaking change for any existing implementation. + Implementors need to update their implementations based on what they want the default behavior of the interface to be. + See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620) +- The `Span` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.Span` type. + This extends the `Span` interface and is is a breaking change for any existing implementation. + Implementors need to update their implementations based on what they want the default behavior of the interface to be. + See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620) +- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` does no longer depend on `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4660) +- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` does no longer depend on `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4660) +- Retry for `502 Bad Gateway` and `504 Gateway Timeout` HTTP statuses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4670) +- Retry for `502 Bad Gateway` and `504 Gateway Timeout` HTTP statuses in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4670) +- Retry for `RESOURCE_EXHAUSTED` only if RetryInfo is returned in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4669) +- Retry for `RESOURCE_EXHAUSTED` only if RetryInfo is returned in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#4669) +- Retry temporary HTTP request failures in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4679) +- Retry temporary HTTP request failures in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4679) + +### Fixed + +- Fix improper parsing of characters such us `+`, `/` by `Parse` in `go.opentelemetry.io/otel/baggage` as they were rendered as a whitespace. (#4667) +- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_RESOURCE_ATTRIBUTES` in `go.opentelemetry.io/otel/sdk/resource` as they were rendered as a whitespace. (#4699) +- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` as they were rendered as a whitespace. (#4699) +- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` as they were rendered as a whitespace. (#4699) +- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_TRACES_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlptracegrpc` as they were rendered as a whitespace. (#4699) +- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_TRACES_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlptracehttp` as they were rendered as a whitespace. (#4699) +- In `go.opentelemetry.op/otel/exporters/prometheus`, the exporter no longer `Collect`s metrics after `Shutdown` is invoked. (#4648) +- Fix documentation for `WithCompressor` in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#4695) +- Fix documentation for `WithCompressor` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4695) + ## [1.19.0/0.42.0/0.0.7] 2023-09-28 This release contains the first stable release of the OpenTelemetry Go [metric SDK]. @@ -2656,7 +2721,8 @@ It contains api and sdk for trace and meter. - CircleCI build CI manifest files. - CODEOWNERS file to track owners of this project. -[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.19.0...HEAD +[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.20.0...HEAD +[1.20.0/0.43.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.20.0 [1.19.0/0.42.0/0.0.7]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0 [1.19.0-rc.1/0.42.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0-rc.1 [1.18.0/0.41.0/0.0.6]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.18.0 @@ -2731,7 +2797,7 @@ It contains api and sdk for trace and meter. [Go 1.20]: https://go.dev/doc/go1.20 [Go 1.19]: https://go.dev/doc/go1.19 [Go 1.18]: https://go.dev/doc/go1.18 -[Go 1.19]: https://go.dev/doc/go1.19 [metric API]:https://pkg.go.dev/go.opentelemetry.io/otel/metric [metric SDK]:https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric +[trace API]:https://pkg.go.dev/go.opentelemetry.io/otel/trace diff --git a/vendor/go.opentelemetry.io/otel/Makefile b/vendor/go.opentelemetry.io/otel/Makefile index 5c311706b0..35fc189961 100644 --- a/vendor/go.opentelemetry.io/otel/Makefile +++ b/vendor/go.opentelemetry.io/otel/Makefile @@ -77,6 +77,9 @@ $(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl GORELEASE = $(TOOLS)/gorelease $(GORELEASE): PACKAGE=golang.org/x/exp/cmd/gorelease +GOVULNCHECK = $(TOOLS)/govulncheck +$(TOOLS)/govulncheck: PACKAGE=golang.org/x/vuln/cmd/govulncheck + .PHONY: tools tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE) @@ -189,6 +192,18 @@ test-coverage: | $(GOCOVMERGE) done; \ $(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt +# Adding a directory will include all benchmarks in that direcotry if a filter is not specified. +BENCHMARK_TARGETS := sdk/trace +.PHONY: benchmark +benchmark: $(BENCHMARK_TARGETS:%=benchmark/%) +BENCHMARK_FILTER = . +# You can override the filter for a particular directory by adding a rule here. +benchmark/sdk/trace: BENCHMARK_FILTER = SpanWithAttributes_8/AlwaysSample +benchmark/%: + @echo "$(GO) test -timeout $(TIMEOUT)s -run=xxxxxMatchNothingxxxxx -bench=$(BENCHMARK_FILTER) $*..." \ + && cd $* \ + $(foreach filter, $(BENCHMARK_FILTER), && $(GO) test -timeout $(TIMEOUT)s -run=xxxxxMatchNothingxxxxx -bench=$(filter)) + .PHONY: golangci-lint golangci-lint-fix golangci-lint-fix: ARGS=--fix golangci-lint-fix: golangci-lint @@ -216,7 +231,7 @@ go-mod-tidy/%: | crosslink lint-modules: go-mod-tidy .PHONY: lint -lint: misspell lint-modules golangci-lint +lint: misspell lint-modules golangci-lint govulncheck .PHONY: vanity-import-check vanity-import-check: | $(PORTO) @@ -226,6 +241,14 @@ vanity-import-check: | $(PORTO) misspell: | $(MISSPELL) @$(MISSPELL) -w $(ALL_DOCS) +.PHONY: govulncheck +govulncheck: $(OTEL_GO_MOD_DIRS:%=govulncheck/%) +govulncheck/%: DIR=$* +govulncheck/%: | $(GOVULNCHECK) + @echo "govulncheck ./... in $(DIR)" \ + && cd $(DIR) \ + && $(GOVULNCHECK) ./... + .PHONY: codespell codespell: | $(CODESPELL) @$(DOCKERPY) $(CODESPELL) @@ -289,3 +312,7 @@ COMMIT ?= "HEAD" add-tags: | $(MULTIMOD) @[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 ) $(MULTIMOD) verify && $(MULTIMOD) tag -m ${MODSET} -c ${COMMIT} + +.PHONY: lint-markdown +lint-markdown: + docker run -v "$(CURDIR):$(WORKDIR)" docker://avtodev/markdown-lint:v1 -c $(WORKDIR)/.markdownlint.yaml $(WORKDIR)/**/*.md diff --git a/vendor/go.opentelemetry.io/otel/README.md b/vendor/go.opentelemetry.io/otel/README.md index 634326ef83..2c5b0cc28a 100644 --- a/vendor/go.opentelemetry.io/otel/README.md +++ b/vendor/go.opentelemetry.io/otel/README.md @@ -11,16 +11,13 @@ It provides a set of APIs to directly measure performance and behavior of your s ## Project Status -| Signal | Status | Project | -|---------|------------|-----------------------| -| Traces | Stable | N/A | -| Metrics | Mixed [1] | [Go: Metric SDK (GA)] | -| Logs | Frozen [2] | N/A | +| Signal | Status | +|---------|------------| +| Traces | Stable | +| Metrics | Stable | +| Logs | Design [1] | -[Go: Metric SDK (GA)]: https://github.com/orgs/open-telemetry/projects/34 - -- [1]: [Metrics API](https://pkg.go.dev/go.opentelemetry.io/otel/metric) is Stable. [Metrics SDK](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric) is Beta. -- [2]: The Logs signal development is halted for this project while we stabilize the Metrics SDK. +- [1]: Currently the logs signal development is in a design phase ([#4696](https://github.com/open-telemetry/opentelemetry-go/issues/4696)). No Logs Pull Requests are currently being accepted. Progress and status specific to this repository is tracked in our diff --git a/vendor/go.opentelemetry.io/otel/baggage/baggage.go b/vendor/go.opentelemetry.io/otel/baggage/baggage.go index 9e6b3b7b52..84532cb1da 100644 --- a/vendor/go.opentelemetry.io/otel/baggage/baggage.go +++ b/vendor/go.opentelemetry.io/otel/baggage/baggage.go @@ -254,7 +254,7 @@ func NewMember(key, value string, props ...Property) (Member, error) { if err := m.validate(); err != nil { return newInvalidMember(), err } - decodedValue, err := url.QueryUnescape(value) + decodedValue, err := url.PathUnescape(value) if err != nil { return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value) } @@ -301,7 +301,7 @@ func parseMember(member string) (Member, error) { // when converting the header into a data structure." key = strings.TrimSpace(k) var err error - value, err = url.QueryUnescape(strings.TrimSpace(v)) + value, err = url.PathUnescape(strings.TrimSpace(v)) if err != nil { return newInvalidMember(), fmt.Errorf("%w: %q", err, value) } diff --git a/vendor/go.opentelemetry.io/otel/internal/global/instruments.go b/vendor/go.opentelemetry.io/otel/internal/global/instruments.go index a33eded872..ebb13c2067 100644 --- a/vendor/go.opentelemetry.io/otel/internal/global/instruments.go +++ b/vendor/go.opentelemetry.io/otel/internal/global/instruments.go @@ -34,11 +34,13 @@ type afCounter struct { name string opts []metric.Float64ObservableCounterOption - delegate atomic.Value //metric.Float64ObservableCounter + delegate atomic.Value // metric.Float64ObservableCounter } -var _ unwrapper = (*afCounter)(nil) -var _ metric.Float64ObservableCounter = (*afCounter)(nil) +var ( + _ unwrapper = (*afCounter)(nil) + _ metric.Float64ObservableCounter = (*afCounter)(nil) +) func (i *afCounter) setDelegate(m metric.Meter) { ctr, err := m.Float64ObservableCounter(i.name, i.opts...) @@ -63,11 +65,13 @@ type afUpDownCounter struct { name string opts []metric.Float64ObservableUpDownCounterOption - delegate atomic.Value //metric.Float64ObservableUpDownCounter + delegate atomic.Value // metric.Float64ObservableUpDownCounter } -var _ unwrapper = (*afUpDownCounter)(nil) -var _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil) +var ( + _ unwrapper = (*afUpDownCounter)(nil) + _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil) +) func (i *afUpDownCounter) setDelegate(m metric.Meter) { ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...) @@ -92,11 +96,13 @@ type afGauge struct { name string opts []metric.Float64ObservableGaugeOption - delegate atomic.Value //metric.Float64ObservableGauge + delegate atomic.Value // metric.Float64ObservableGauge } -var _ unwrapper = (*afGauge)(nil) -var _ metric.Float64ObservableGauge = (*afGauge)(nil) +var ( + _ unwrapper = (*afGauge)(nil) + _ metric.Float64ObservableGauge = (*afGauge)(nil) +) func (i *afGauge) setDelegate(m metric.Meter) { ctr, err := m.Float64ObservableGauge(i.name, i.opts...) @@ -121,11 +127,13 @@ type aiCounter struct { name string opts []metric.Int64ObservableCounterOption - delegate atomic.Value //metric.Int64ObservableCounter + delegate atomic.Value // metric.Int64ObservableCounter } -var _ unwrapper = (*aiCounter)(nil) -var _ metric.Int64ObservableCounter = (*aiCounter)(nil) +var ( + _ unwrapper = (*aiCounter)(nil) + _ metric.Int64ObservableCounter = (*aiCounter)(nil) +) func (i *aiCounter) setDelegate(m metric.Meter) { ctr, err := m.Int64ObservableCounter(i.name, i.opts...) @@ -150,11 +158,13 @@ type aiUpDownCounter struct { name string opts []metric.Int64ObservableUpDownCounterOption - delegate atomic.Value //metric.Int64ObservableUpDownCounter + delegate atomic.Value // metric.Int64ObservableUpDownCounter } -var _ unwrapper = (*aiUpDownCounter)(nil) -var _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil) +var ( + _ unwrapper = (*aiUpDownCounter)(nil) + _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil) +) func (i *aiUpDownCounter) setDelegate(m metric.Meter) { ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...) @@ -179,11 +189,13 @@ type aiGauge struct { name string opts []metric.Int64ObservableGaugeOption - delegate atomic.Value //metric.Int64ObservableGauge + delegate atomic.Value // metric.Int64ObservableGauge } -var _ unwrapper = (*aiGauge)(nil) -var _ metric.Int64ObservableGauge = (*aiGauge)(nil) +var ( + _ unwrapper = (*aiGauge)(nil) + _ metric.Int64ObservableGauge = (*aiGauge)(nil) +) func (i *aiGauge) setDelegate(m metric.Meter) { ctr, err := m.Int64ObservableGauge(i.name, i.opts...) @@ -208,7 +220,7 @@ type sfCounter struct { name string opts []metric.Float64CounterOption - delegate atomic.Value //metric.Float64Counter + delegate atomic.Value // metric.Float64Counter } var _ metric.Float64Counter = (*sfCounter)(nil) @@ -234,7 +246,7 @@ type sfUpDownCounter struct { name string opts []metric.Float64UpDownCounterOption - delegate atomic.Value //metric.Float64UpDownCounter + delegate atomic.Value // metric.Float64UpDownCounter } var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil) @@ -260,7 +272,7 @@ type sfHistogram struct { name string opts []metric.Float64HistogramOption - delegate atomic.Value //metric.Float64Histogram + delegate atomic.Value // metric.Float64Histogram } var _ metric.Float64Histogram = (*sfHistogram)(nil) @@ -286,7 +298,7 @@ type siCounter struct { name string opts []metric.Int64CounterOption - delegate atomic.Value //metric.Int64Counter + delegate atomic.Value // metric.Int64Counter } var _ metric.Int64Counter = (*siCounter)(nil) @@ -312,7 +324,7 @@ type siUpDownCounter struct { name string opts []metric.Int64UpDownCounterOption - delegate atomic.Value //metric.Int64UpDownCounter + delegate atomic.Value // metric.Int64UpDownCounter } var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil) @@ -338,7 +350,7 @@ type siHistogram struct { name string opts []metric.Int64HistogramOption - delegate atomic.Value //metric.Int64Histogram + delegate atomic.Value // metric.Int64Histogram } var _ metric.Int64Histogram = (*siHistogram)(nil) diff --git a/vendor/go.opentelemetry.io/otel/internal/global/trace.go b/vendor/go.opentelemetry.io/otel/internal/global/trace.go index 5f008d0982..3f61ec12a3 100644 --- a/vendor/go.opentelemetry.io/otel/internal/global/trace.go +++ b/vendor/go.opentelemetry.io/otel/internal/global/trace.go @@ -39,6 +39,7 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/embedded" ) // tracerProvider is a placeholder for a configured SDK TracerProvider. @@ -46,6 +47,8 @@ import ( // All TracerProvider functionality is forwarded to a delegate once // configured. type tracerProvider struct { + embedded.TracerProvider + mtx sync.Mutex tracers map[il]*tracer delegate trace.TracerProvider @@ -119,6 +122,8 @@ type il struct { // All Tracer functionality is forwarded to a delegate once configured. // Otherwise, all functionality is forwarded to a NoopTracer. type tracer struct { + embedded.Tracer + name string opts []trace.TracerOption provider *tracerProvider @@ -156,6 +161,8 @@ func (t *tracer) Start(ctx context.Context, name string, opts ...trace.SpanStart // SpanContext. It performs no operations other than to return the wrapped // SpanContext. type nonRecordingSpan struct { + embedded.Span + sc trace.SpanContext tracer *tracer } diff --git a/vendor/go.opentelemetry.io/otel/metric/doc.go b/vendor/go.opentelemetry.io/otel/metric/doc.go index ae24e448d9..54716e13b3 100644 --- a/vendor/go.opentelemetry.io/otel/metric/doc.go +++ b/vendor/go.opentelemetry.io/otel/metric/doc.go @@ -149,7 +149,7 @@ of [go.opentelemetry.io/otel/metric]. Finally, an author can embed another implementation in theirs. The embedded implementation will be used for methods not defined by the author. For example, -an author who want to default to silently dropping the call can use +an author who wants to default to silently dropping the call can use [go.opentelemetry.io/otel/metric/noop]: import "go.opentelemetry.io/otel/metric/noop" diff --git a/vendor/go.opentelemetry.io/otel/metric/instrument.go b/vendor/go.opentelemetry.io/otel/metric/instrument.go index cdca00058c..be89cd5334 100644 --- a/vendor/go.opentelemetry.io/otel/metric/instrument.go +++ b/vendor/go.opentelemetry.io/otel/metric/instrument.go @@ -39,6 +39,12 @@ type InstrumentOption interface { Float64ObservableGaugeOption } +// HistogramOption applies options to histogram instruments. +type HistogramOption interface { + Int64HistogramOption + Float64HistogramOption +} + type descOpt string func (o descOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig { @@ -171,6 +177,23 @@ func (o unitOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64Ob // The unit u should be defined using the appropriate [UCUM](https://ucum.org) case-sensitive code. func WithUnit(u string) InstrumentOption { return unitOpt(u) } +// WithExplicitBucketBoundaries sets the instrument explicit bucket boundaries. +// +// This option is considered "advisory", and may be ignored by API implementations. +func WithExplicitBucketBoundaries(bounds ...float64) HistogramOption { return bucketOpt(bounds) } + +type bucketOpt []float64 + +func (o bucketOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig { + c.explicitBucketBoundaries = o + return c +} + +func (o bucketOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig { + c.explicitBucketBoundaries = o + return c +} + // AddOption applies options to an addition measurement. See // [MeasurementOption] for other options that can be used as an AddOption. type AddOption interface { diff --git a/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go b/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go index f0b063721d..0a4825ae6a 100644 --- a/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go +++ b/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go @@ -147,8 +147,9 @@ type Float64Histogram interface { // Float64HistogramConfig contains options for synchronous counter instruments // that record int64 values. type Float64HistogramConfig struct { - description string - unit string + description string + unit string + explicitBucketBoundaries []float64 } // NewFloat64HistogramConfig returns a new [Float64HistogramConfig] with all @@ -171,6 +172,11 @@ func (c Float64HistogramConfig) Unit() string { return c.unit } +// ExplicitBucketBoundaries returns the configured explicit bucket boundaries. +func (c Float64HistogramConfig) ExplicitBucketBoundaries() []float64 { + return c.explicitBucketBoundaries +} + // Float64HistogramOption applies options to a [Float64HistogramConfig]. See // [InstrumentOption] for other options that can be used as a // Float64HistogramOption. diff --git a/vendor/go.opentelemetry.io/otel/metric/syncint64.go b/vendor/go.opentelemetry.io/otel/metric/syncint64.go index 6f508eb66d..56667d32fc 100644 --- a/vendor/go.opentelemetry.io/otel/metric/syncint64.go +++ b/vendor/go.opentelemetry.io/otel/metric/syncint64.go @@ -147,8 +147,9 @@ type Int64Histogram interface { // Int64HistogramConfig contains options for synchronous counter instruments // that record int64 values. type Int64HistogramConfig struct { - description string - unit string + description string + unit string + explicitBucketBoundaries []float64 } // NewInt64HistogramConfig returns a new [Int64HistogramConfig] with all opts @@ -171,6 +172,11 @@ func (c Int64HistogramConfig) Unit() string { return c.unit } +// ExplicitBucketBoundaries returns the configured explicit bucket boundaries. +func (c Int64HistogramConfig) ExplicitBucketBoundaries() []float64 { + return c.explicitBucketBoundaries +} + // Int64HistogramOption applies options to a [Int64HistogramConfig]. See // [InstrumentOption] for other options that can be used as an // Int64HistogramOption. diff --git a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go index 902692da08..75a8f3435a 100644 --- a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go +++ b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go @@ -40,8 +40,10 @@ const ( // their proprietary information. type TraceContext struct{} -var _ TextMapPropagator = TraceContext{} -var traceCtxRegExp = regexp.MustCompile("^(?P[0-9a-f]{2})-(?P[a-f0-9]{32})-(?P[a-f0-9]{16})-(?P[a-f0-9]{2})(?:-.*)?$") +var ( + _ TextMapPropagator = TraceContext{} + traceCtxRegExp = regexp.MustCompile("^(?P[0-9a-f]{2})-(?P[a-f0-9]{32})-(?P[a-f0-9]{16})-(?P[a-f0-9]{2})(?:-.*)?$") +) // Inject set tracecontext from the Context into the carrier. func (tc TraceContext) Inject(ctx context.Context, carrier TextMapCarrier) { diff --git a/vendor/go.opentelemetry.io/otel/requirements.txt b/vendor/go.opentelemetry.io/otel/requirements.txt index ddff454685..e0a43e1384 100644 --- a/vendor/go.opentelemetry.io/otel/requirements.txt +++ b/vendor/go.opentelemetry.io/otel/requirements.txt @@ -1 +1 @@ -codespell==2.2.5 +codespell==2.2.6 diff --git a/vendor/go.opentelemetry.io/otel/trace/config.go b/vendor/go.opentelemetry.io/otel/trace/config.go index cb3efbb9ad..3aadc66cf7 100644 --- a/vendor/go.opentelemetry.io/otel/trace/config.go +++ b/vendor/go.opentelemetry.io/otel/trace/config.go @@ -268,6 +268,7 @@ func (o stackTraceOption) applyEvent(c EventConfig) EventConfig { c.stackTrace = bool(o) return c } + func (o stackTraceOption) applySpan(c SpanConfig) SpanConfig { c.stackTrace = bool(o) return c diff --git a/vendor/go.opentelemetry.io/otel/trace/doc.go b/vendor/go.opentelemetry.io/otel/trace/doc.go index ab0346f966..440f3d7565 100644 --- a/vendor/go.opentelemetry.io/otel/trace/doc.go +++ b/vendor/go.opentelemetry.io/otel/trace/doc.go @@ -62,5 +62,69 @@ a default. defer span.End() // ... } + +# API Implementations + +This package does not conform to the standard Go versioning policy; all of its +interfaces may have methods added to them without a package major version bump. +This non-standard API evolution could surprise an uninformed implementation +author. They could unknowingly build their implementation in a way that would +result in a runtime panic for their users that update to the new API. + +The API is designed to help inform an instrumentation author about this +non-standard API evolution. It requires them to choose a default behavior for +unimplemented interface methods. There are three behavior choices they can +make: + + - Compilation failure + - Panic + - Default to another implementation + +All interfaces in this API embed a corresponding interface from +[go.opentelemetry.io/otel/trace/embedded]. If an author wants the default +behavior of their implementations to be a compilation failure, signaling to +their users they need to update to the latest version of that implementation, +they need to embed the corresponding interface from +[go.opentelemetry.io/otel/trace/embedded] in their implementation. For +example, + + import "go.opentelemetry.io/otel/trace/embedded" + + type TracerProvider struct { + embedded.TracerProvider + // ... + } + +If an author wants the default behavior of their implementations to panic, they +can embed the API interface directly. + + import "go.opentelemetry.io/otel/trace" + + type TracerProvider struct { + trace.TracerProvider + // ... + } + +This option is not recommended. It will lead to publishing packages that +contain runtime panics when users update to newer versions of +[go.opentelemetry.io/otel/trace], which may be done with a trasitive +dependency. + +Finally, an author can embed another implementation in theirs. The embedded +implementation will be used for methods not defined by the author. For example, +an author who wants to default to silently dropping the call can use +[go.opentelemetry.io/otel/trace/noop]: + + import "go.opentelemetry.io/otel/trace/noop" + + type TracerProvider struct { + noop.TracerProvider + // ... + } + +It is strongly recommended that authors only embed +[go.opentelemetry.io/otel/trace/noop] if they choose this default behavior. +That implementation is the only one OpenTelemetry authors can guarantee will +fully implement all the API interfaces when a user updates their API. */ package trace // import "go.opentelemetry.io/otel/trace" diff --git a/vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go b/vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go new file mode 100644 index 0000000000..898db5a754 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go @@ -0,0 +1,56 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package embedded provides interfaces embedded within the [OpenTelemetry +// trace API]. +// +// Implementers of the [OpenTelemetry trace API] can embed the relevant type +// from this package into their implementation directly. Doing so will result +// in a compilation error for users when the [OpenTelemetry trace API] is +// extended (which is something that can happen without a major version bump of +// the API package). +// +// [OpenTelemetry trace API]: https://pkg.go.dev/go.opentelemetry.io/otel/trace +package embedded // import "go.opentelemetry.io/otel/trace/embedded" + +// TracerProvider is embedded in +// [go.opentelemetry.io/otel/trace.TracerProvider]. +// +// Embed this interface in your implementation of the +// [go.opentelemetry.io/otel/trace.TracerProvider] if you want users to +// experience a compilation error, signaling they need to update to your latest +// implementation, when the [go.opentelemetry.io/otel/trace.TracerProvider] +// interface is extended (which is something that can happen without a major +// version bump of the API package). +type TracerProvider interface{ tracerProvider() } + +// Tracer is embedded in [go.opentelemetry.io/otel/trace.Tracer]. +// +// Embed this interface in your implementation of the +// [go.opentelemetry.io/otel/trace.Tracer] if you want users to experience a +// compilation error, signaling they need to update to your latest +// implementation, when the [go.opentelemetry.io/otel/trace.Tracer] interface +// is extended (which is something that can happen without a major version bump +// of the API package). +type Tracer interface{ tracer() } + +// Span is embedded in [go.opentelemetry.io/otel/trace.Span]. +// +// Embed this interface in your implementation of the +// [go.opentelemetry.io/otel/trace.Span] if you want users to experience a +// compilation error, signaling they need to update to your latest +// implementation, when the [go.opentelemetry.io/otel/trace.Span] interface is +// extended (which is something that can happen without a major version bump of +// the API package). +type Span interface{ span() } diff --git a/vendor/go.opentelemetry.io/otel/trace/noop.go b/vendor/go.opentelemetry.io/otel/trace/noop.go index 7cf6c7f3ef..c125491cae 100644 --- a/vendor/go.opentelemetry.io/otel/trace/noop.go +++ b/vendor/go.opentelemetry.io/otel/trace/noop.go @@ -19,16 +19,20 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace/embedded" ) // NewNoopTracerProvider returns an implementation of TracerProvider that // performs no operations. The Tracer and Spans created from the returned // TracerProvider also perform no operations. +// +// Deprecated: Use [go.opentelemetry.io/otel/trace/noop.NewTracerProvider] +// instead. func NewNoopTracerProvider() TracerProvider { return noopTracerProvider{} } -type noopTracerProvider struct{} +type noopTracerProvider struct{ embedded.TracerProvider } var _ TracerProvider = noopTracerProvider{} @@ -38,7 +42,7 @@ func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer { } // noopTracer is an implementation of Tracer that performs no operations. -type noopTracer struct{} +type noopTracer struct{ embedded.Tracer } var _ Tracer = noopTracer{} @@ -54,7 +58,7 @@ func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption } // noopSpan is an implementation of Span that performs no operations. -type noopSpan struct{} +type noopSpan struct{ embedded.Span } var _ Span = noopSpan{} diff --git a/vendor/go.opentelemetry.io/otel/trace/trace.go b/vendor/go.opentelemetry.io/otel/trace/trace.go index 4aa94f79f4..26a4b2260e 100644 --- a/vendor/go.opentelemetry.io/otel/trace/trace.go +++ b/vendor/go.opentelemetry.io/otel/trace/trace.go @@ -22,6 +22,7 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace/embedded" ) const ( @@ -48,8 +49,10 @@ func (e errorConst) Error() string { // nolint:revive // revive complains about stutter of `trace.TraceID`. type TraceID [16]byte -var nilTraceID TraceID -var _ json.Marshaler = nilTraceID +var ( + nilTraceID TraceID + _ json.Marshaler = nilTraceID +) // IsValid checks whether the trace TraceID is valid. A valid trace ID does // not consist of zeros only. @@ -71,8 +74,10 @@ func (t TraceID) String() string { // SpanID is a unique identity of a span in a trace. type SpanID [8]byte -var nilSpanID SpanID -var _ json.Marshaler = nilSpanID +var ( + nilSpanID SpanID + _ json.Marshaler = nilSpanID +) // IsValid checks whether the SpanID is valid. A valid SpanID does not consist // of zeros only. @@ -338,8 +343,15 @@ func (sc SpanContext) MarshalJSON() ([]byte, error) { // create a Span and it is then up to the operation the Span represents to // properly end the Span when the operation itself ends. // -// Warning: methods may be added to this interface in minor releases. +// Warning: Methods may be added to this interface in minor releases. See +// package documentation on API implementation for information on how to set +// default behavior for unimplemented methods. type Span interface { + // Users of the interface can ignore this. This embedded type is only used + // by implementations of this interface. See the "API Implementations" + // section of the package documentation for more information. + embedded.Span + // End completes the Span. The Span is considered complete and ready to be // delivered through the rest of the telemetry pipeline after this method // is called. Therefore, updates to the Span are not allowed after this @@ -486,8 +498,15 @@ func (sk SpanKind) String() string { // Tracer is the creator of Spans. // -// Warning: methods may be added to this interface in minor releases. +// Warning: Methods may be added to this interface in minor releases. See +// package documentation on API implementation for information on how to set +// default behavior for unimplemented methods. type Tracer interface { + // Users of the interface can ignore this. This embedded type is only used + // by implementations of this interface. See the "API Implementations" + // section of the package documentation for more information. + embedded.Tracer + // Start creates a span and a context.Context containing the newly-created span. // // If the context.Context provided in `ctx` contains a Span then the newly-created @@ -518,8 +537,15 @@ type Tracer interface { // at runtime from its users or it can simply use the globally registered one // (see https://pkg.go.dev/go.opentelemetry.io/otel#GetTracerProvider). // -// Warning: methods may be added to this interface in minor releases. +// Warning: Methods may be added to this interface in minor releases. See +// package documentation on API implementation for information on how to set +// default behavior for unimplemented methods. type TracerProvider interface { + // Users of the interface can ignore this. This embedded type is only used + // by implementations of this interface. See the "API Implementations" + // section of the package documentation for more information. + embedded.TracerProvider + // Tracer returns a unique Tracer scoped to be used by instrumentation code // to trace computational workflows. The scope and identity of that // instrumentation code is uniquely defined by the name and options passed. diff --git a/vendor/go.opentelemetry.io/otel/trace/tracestate.go b/vendor/go.opentelemetry.io/otel/trace/tracestate.go index ca68a82e5f..d1e47ca2fa 100644 --- a/vendor/go.opentelemetry.io/otel/trace/tracestate.go +++ b/vendor/go.opentelemetry.io/otel/trace/tracestate.go @@ -28,9 +28,9 @@ const ( // based on the W3C Trace Context specification, see // https://www.w3.org/TR/trace-context-1/#tracestate-header - noTenantKeyFormat = `[a-z][_0-9a-z\-\*\/]{0,255}` - withTenantKeyFormat = `[a-z0-9][_0-9a-z\-\*\/]{0,240}@[a-z][_0-9a-z\-\*\/]{0,13}` - valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]` + noTenantKeyFormat = `[a-z][_0-9a-z\-\*\/]*` + withTenantKeyFormat = `[a-z0-9][_0-9a-z\-\*\/]*@[a-z][_0-9a-z\-\*\/]*` + valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]*[\x21-\x2b\x2d-\x3c\x3e-\x7e]` errInvalidKey errorConst = "invalid tracestate key" errInvalidValue errorConst = "invalid tracestate value" @@ -40,9 +40,10 @@ const ( ) var ( - keyRe = regexp.MustCompile(`^((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))$`) - valueRe = regexp.MustCompile(`^(` + valueFormat + `)$`) - memberRe = regexp.MustCompile(`^\s*((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))=(` + valueFormat + `)\s*$`) + noTenantKeyRe = regexp.MustCompile(`^` + noTenantKeyFormat + `$`) + withTenantKeyRe = regexp.MustCompile(`^` + withTenantKeyFormat + `$`) + valueRe = regexp.MustCompile(`^` + valueFormat + `$`) + memberRe = regexp.MustCompile(`^\s*((?:` + noTenantKeyFormat + `)|(?:` + withTenantKeyFormat + `))=(` + valueFormat + `)\s*$`) ) type member struct { @@ -51,10 +52,19 @@ type member struct { } func newMember(key, value string) (member, error) { - if !keyRe.MatchString(key) { + if len(key) > 256 { return member{}, fmt.Errorf("%w: %s", errInvalidKey, key) } - if !valueRe.MatchString(value) { + if !noTenantKeyRe.MatchString(key) { + if !withTenantKeyRe.MatchString(key) { + return member{}, fmt.Errorf("%w: %s", errInvalidKey, key) + } + atIndex := strings.LastIndex(key, "@") + if atIndex > 241 || len(key)-1-atIndex > 14 { + return member{}, fmt.Errorf("%w: %s", errInvalidKey, key) + } + } + if len(value) > 256 || !valueRe.MatchString(value) { return member{}, fmt.Errorf("%w: %s", errInvalidValue, value) } return member{Key: key, Value: value}, nil @@ -62,14 +72,14 @@ func newMember(key, value string) (member, error) { func parseMember(m string) (member, error) { matches := memberRe.FindStringSubmatch(m) - if len(matches) != 5 { + if len(matches) != 3 { return member{}, fmt.Errorf("%w: %s", errInvalidMember, m) } - - return member{ - Key: matches[1], - Value: matches[4], - }, nil + result, e := newMember(matches[1], matches[2]) + if e != nil { + return member{}, fmt.Errorf("%w: %s", errInvalidMember, m) + } + return result, nil } // String encodes member into a string compliant with the W3C Trace Context diff --git a/vendor/go.opentelemetry.io/otel/version.go b/vendor/go.opentelemetry.io/otel/version.go index ad64e19967..5a92f1d4b6 100644 --- a/vendor/go.opentelemetry.io/otel/version.go +++ b/vendor/go.opentelemetry.io/otel/version.go @@ -16,5 +16,5 @@ package otel // import "go.opentelemetry.io/otel" // Version is the current release version of OpenTelemetry in use. func Version() string { - return "1.19.0" + return "1.20.0" } diff --git a/vendor/go.opentelemetry.io/otel/versions.yaml b/vendor/go.opentelemetry.io/otel/versions.yaml index 7d21276924..82366e7998 100644 --- a/vendor/go.opentelemetry.io/otel/versions.yaml +++ b/vendor/go.opentelemetry.io/otel/versions.yaml @@ -14,7 +14,7 @@ module-sets: stable-v1: - version: v1.19.0 + version: v1.20.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/bridge/opentracing @@ -35,7 +35,7 @@ module-sets: - go.opentelemetry.io/otel/sdk/metric - go.opentelemetry.io/otel/trace experimental-metrics: - version: v0.42.0 + version: v0.43.0 modules: - go.opentelemetry.io/otel/bridge/opencensus - go.opentelemetry.io/otel/bridge/opencensus/test diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go index 5dfacbb983..661ea132e0 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s index f1f66230d1..7dd2638e88 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go index 02ff3d05e9..db42e6676a 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build (!arm64 && !s390x && !ppc64le) || !gc || purego -// +build !arm64,!s390x,!ppc64le !gc purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go index da420b2e97..3a4287f990 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s index 5c0fed26f8..66aebae258 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s @@ -20,7 +20,6 @@ // due to the calling conventions and initialization of constants. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go index 4652247b8a..683ccfd1c3 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s index f3ef5a019d..1eda91a3d4 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego #include "go_asm.h" #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go index 0c408c5709..50695a14f6 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package chacha20poly1305 diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s index 867c181a14..731d2ac6db 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s @@ -5,7 +5,6 @@ // This file was originally from https://golang.org/cl/24717 by Vlad Krasnov of CloudFlare. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" // General register allocation @@ -184,11 +183,31 @@ GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 #define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 #define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 #define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 + // Some macros + +// ROL rotates the uint32s in register R left by N bits, using temporary T. +#define ROL(N, R, T) \ + MOVO R, T; PSLLL $(N), T; PSRLL $(32-(N)), R; PXOR T, R + +// ROL16 rotates the uint32s in register R left by 16, using temporary T if needed. +#ifdef GOAMD64_v2 +#define ROL16(R, T) PSHUFB ·rol16<>(SB), R +#else +#define ROL16(R, T) ROL(16, R, T) +#endif + +// ROL8 rotates the uint32s in register R left by 8, using temporary T if needed. +#ifdef GOAMD64_v2 +#define ROL8(R, T) PSHUFB ·rol8<>(SB), R +#else +#define ROL8(R, T) ROL(8, R, T) +#endif + #define chachaQR(A, B, C, D, T) \ - PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ + PADDD B, A; PXOR A, D; ROL16(D, T) \ PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ - PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ + PADDD B, A; PXOR A, D; ROL8(D, T) \ PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B #define chachaQR_AVX2(A, B, C, D, T) \ diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go index f832b33d45..34e6ab1df8 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !amd64 || !gc || purego -// +build !amd64 !gc purego package chacha20poly1305 diff --git a/vendor/golang.org/x/crypto/hkdf/hkdf.go b/vendor/golang.org/x/crypto/hkdf/hkdf.go index dda3f143be..f4ded5fee2 100644 --- a/vendor/golang.org/x/crypto/hkdf/hkdf.go +++ b/vendor/golang.org/x/crypto/hkdf/hkdf.go @@ -56,7 +56,9 @@ func (f *hkdf) Read(p []byte) (int, error) { // Fill the rest of the buffer for len(p) > 0 { - f.expander.Reset() + if f.counter > 1 { + f.expander.Reset() + } f.expander.Write(f.prev) f.expander.Write(f.info) f.expander.Write([]byte{f.counter}) diff --git a/vendor/golang.org/x/crypto/internal/alias/alias.go b/vendor/golang.org/x/crypto/internal/alias/alias.go index 69c17f822b..551ff0c353 100644 --- a/vendor/golang.org/x/crypto/internal/alias/alias.go +++ b/vendor/golang.org/x/crypto/internal/alias/alias.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !purego -// +build !purego // Package alias implements memory aliasing tests. package alias diff --git a/vendor/golang.org/x/crypto/internal/alias/alias_purego.go b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go index 4775b0a438..6fe61b5c6e 100644 --- a/vendor/golang.org/x/crypto/internal/alias/alias_purego.go +++ b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build purego -// +build purego // Package alias implements memory aliasing tests. package alias diff --git a/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go index 45b5c966b2..d33c8890fc 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !go1.13 -// +build !go1.13 package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go index ed52b3418a..495c1fa697 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.13 -// +build go1.13 package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go index f184b67d98..333da285b3 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build (!amd64 && !ppc64le && !s390x) || !gc || purego -// +build !amd64,!ppc64le,!s390x !gc purego package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go index 6d522333f2..164cd47d32 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s index 1d74f0f881..e0d3c64756 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go index 4a069941a6..4aec4874b5 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s index 58422aad23..d2ca5deeb9 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go index ec95966889..e1d033a491 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s index aa9e0494c9..0fe3a7c217 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc && !purego -// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go index a3067f8de7..e6f55cbd16 100644 --- a/vendor/golang.org/x/net/http2/databuffer.go +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -20,41 +20,44 @@ import ( // TODO: Benchmark to determine if the pools are necessary. The GC may have // improved enough that we can instead allocate chunks like this: // make([]byte, max(16<<10, expectedBytesRemaining)) -var ( - dataChunkSizeClasses = []int{ - 1 << 10, - 2 << 10, - 4 << 10, - 8 << 10, - 16 << 10, - } - dataChunkPools = [...]sync.Pool{ - {New: func() interface{} { return make([]byte, 1<<10) }}, - {New: func() interface{} { return make([]byte, 2<<10) }}, - {New: func() interface{} { return make([]byte, 4<<10) }}, - {New: func() interface{} { return make([]byte, 8<<10) }}, - {New: func() interface{} { return make([]byte, 16<<10) }}, - } -) +var dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return new([1 << 10]byte) }}, + {New: func() interface{} { return new([2 << 10]byte) }}, + {New: func() interface{} { return new([4 << 10]byte) }}, + {New: func() interface{} { return new([8 << 10]byte) }}, + {New: func() interface{} { return new([16 << 10]byte) }}, +} func getDataBufferChunk(size int64) []byte { - i := 0 - for ; i < len(dataChunkSizeClasses)-1; i++ { - if size <= int64(dataChunkSizeClasses[i]) { - break - } + switch { + case size <= 1<<10: + return dataChunkPools[0].Get().(*[1 << 10]byte)[:] + case size <= 2<<10: + return dataChunkPools[1].Get().(*[2 << 10]byte)[:] + case size <= 4<<10: + return dataChunkPools[2].Get().(*[4 << 10]byte)[:] + case size <= 8<<10: + return dataChunkPools[3].Get().(*[8 << 10]byte)[:] + default: + return dataChunkPools[4].Get().(*[16 << 10]byte)[:] } - return dataChunkPools[i].Get().([]byte) } func putDataBufferChunk(p []byte) { - for i, n := range dataChunkSizeClasses { - if len(p) == n { - dataChunkPools[i].Put(p) - return - } + switch len(p) { + case 1 << 10: + dataChunkPools[0].Put((*[1 << 10]byte)(p)) + case 2 << 10: + dataChunkPools[1].Put((*[2 << 10]byte)(p)) + case 4 << 10: + dataChunkPools[2].Put((*[4 << 10]byte)(p)) + case 8 << 10: + dataChunkPools[3].Put((*[8 << 10]byte)(p)) + case 16 << 10: + dataChunkPools[4].Put((*[16 << 10]byte)(p)) + default: + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } - panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } // dataBuffer is an io.ReadWriter backed by a list of data chunks. diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go deleted file mode 100644 index 5bf62b032e..0000000000 --- a/vendor/golang.org/x/net/http2/go111.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.11 -// +build go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { - return trace != nil && trace.WroteHeaderField != nil -} - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { - if trace != nil && trace.WroteHeaderField != nil { - trace.WroteHeaderField(k, []string{v}) - } -} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - if trace != nil { - return trace.Got1xxResponse - } - return nil -} diff --git a/vendor/golang.org/x/net/http2/go115.go b/vendor/golang.org/x/net/http2/go115.go deleted file mode 100644 index 908af1ab93..0000000000 --- a/vendor/golang.org/x/net/http2/go115.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.15 -// +build go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS -// connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - dialer := &tls.Dialer{ - Config: cfg, - } - cn, err := dialer.DialContext(ctx, network, addr) - if err != nil { - return nil, err - } - tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed - return tlsCn, nil -} diff --git a/vendor/golang.org/x/net/http2/go118.go b/vendor/golang.org/x/net/http2/go118.go deleted file mode 100644 index aca4b2b31a..0000000000 --- a/vendor/golang.org/x/net/http2/go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.18 -// +build go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return tc.NetConn() -} diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go deleted file mode 100644 index cc0baa8197..0000000000 --- a/vendor/golang.org/x/net/http2/not_go111.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.11 -// +build !go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false } - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - return nil -} diff --git a/vendor/golang.org/x/net/http2/not_go115.go b/vendor/golang.org/x/net/http2/not_go115.go deleted file mode 100644 index e6c04cf7ac..0000000000 --- a/vendor/golang.org/x/net/http2/not_go115.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.15 -// +build !go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext opens a TLS connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - cn, err := tls.Dial(network, addr, cfg) - if err != nil { - return nil, err - } - if err := cn.Handshake(); err != nil { - return nil, err - } - if cfg.InsecureSkipVerify { - return cn, nil - } - if err := cn.VerifyHostname(cfg.ServerName); err != nil { - return nil, err - } - return cn, nil -} diff --git a/vendor/golang.org/x/net/http2/not_go118.go b/vendor/golang.org/x/net/http2/not_go118.go deleted file mode 100644 index eab532c96b..0000000000 --- a/vendor/golang.org/x/net/http2/not_go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.18 -// +build !go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return nil -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 02c88b6b3e..ae94c6408d 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -2549,7 +2549,6 @@ type responseWriterState struct { wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. sentHeader bool // have we sent the header frame? handlerDone bool // handler has finished - dirty bool // a Write failed; don't reuse this responseWriterState sentContentLen int64 // non-zero if handler set a Content-Length header wroteBytes int64 @@ -2669,7 +2668,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { date: date, }) if err != nil { - rws.dirty = true return 0, err } if endStream { @@ -2690,7 +2688,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { if len(p) > 0 || endStream { // only send a 0 byte DATA frame if we're ending the stream. if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { - rws.dirty = true return 0, err } } @@ -2702,9 +2699,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { trailers: rws.trailers, endStream: true, }) - if err != nil { - rws.dirty = true - } return len(p), err } return len(p), nil @@ -2920,14 +2914,12 @@ func (rws *responseWriterState) writeHeader(code int) { h.Del("Transfer-Encoding") } - if rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + rws.conn.writeHeaders(rws.stream, &writeResHeaders{ streamID: rws.stream.id, httpResCode: code, h: h, endStream: rws.handlerDone && !rws.hasTrailers(), - }) != nil { - rws.dirty = true - } + }) return } @@ -2992,19 +2984,10 @@ func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, func (w *responseWriter) handlerDone() { rws := w.rws - dirty := rws.dirty rws.handlerDone = true w.Flush() w.rws = nil - if !dirty { - // Only recycle the pool if all prior Write calls to - // the serverConn goroutine completed successfully. If - // they returned earlier due to resets from the peer - // there might still be write goroutines outstanding - // from the serverConn referencing the rws memory. See - // issue 20704. - responseWriterStatePool.Put(rws) - } + responseWriterStatePool.Put(rws) } // Push errors. @@ -3187,6 +3170,7 @@ func (sc *serverConn) startPush(msg *startPushRequest) { panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) } + sc.curHandlers++ go sc.runHandler(rw, req, sc.handler.ServeHTTP) return promisedID, nil } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 4515b22c4a..df578b86c6 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -1018,7 +1018,7 @@ func (cc *ClientConn) forceCloseConn() { if !ok { return } - if nc := tlsUnderlyingConn(tc); nc != nil { + if nc := tc.NetConn(); nc != nil { nc.Close() } } @@ -3201,3 +3201,34 @@ func traceFirstResponseByte(trace *httptrace.ClientTrace) { trace.GotFirstResponseByte() } } + +func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { + return trace != nil && trace.WroteHeaderField != nil +} + +func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { + if trace != nil && trace.WroteHeaderField != nil { + trace.WroteHeaderField(k, []string{v}) + } +} + +func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { + if trace != nil { + return trace.Got1xxResponse + } + return nil +} + +// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS +// connection. +func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { + dialer := &tls.Dialer{ + Config: cfg, + } + cn, err := dialer.DialContext(ctx, network, addr) + if err != nil { + return nil, err + } + tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed + return tlsCn, nil +} diff --git a/vendor/golang.org/x/net/idna/go118.go b/vendor/golang.org/x/net/idna/go118.go index c5c4338dbe..712f1ad839 100644 --- a/vendor/golang.org/x/net/idna/go118.go +++ b/vendor/golang.org/x/net/idna/go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.18 -// +build go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go index 64ccf85feb..7b37178847 100644 --- a/vendor/golang.org/x/net/idna/idna10.0.0.go +++ b/vendor/golang.org/x/net/idna/idna10.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.10 -// +build go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index ee1698cefb..cc6a892a4a 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.10 -// +build !go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/pre_go118.go b/vendor/golang.org/x/net/idna/pre_go118.go index 3aaccab1c5..40e74bb3d2 100644 --- a/vendor/golang.org/x/net/idna/pre_go118.go +++ b/vendor/golang.org/x/net/idna/pre_go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.18 -// +build !go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go index d1d62ef459..c6c2bf10a6 100644 --- a/vendor/golang.org/x/net/idna/tables10.0.0.go +++ b/vendor/golang.org/x/net/idna/tables10.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.10 && !go1.13 -// +build go1.10,!go1.13 package idna diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go index 167efba712..76789393cc 100644 --- a/vendor/golang.org/x/net/idna/tables11.0.0.go +++ b/vendor/golang.org/x/net/idna/tables11.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.13 && !go1.14 -// +build go1.13,!go1.14 package idna diff --git a/vendor/golang.org/x/net/idna/tables12.0.0.go b/vendor/golang.org/x/net/idna/tables12.0.0.go index ab40f7bcc3..0600cd2ae5 100644 --- a/vendor/golang.org/x/net/idna/tables12.0.0.go +++ b/vendor/golang.org/x/net/idna/tables12.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.14 && !go1.16 -// +build go1.14,!go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index 66701eadfb..2fb768ef6d 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.16 && !go1.21 -// +build go1.16,!go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go index 40033778f0..5ff05fe1af 100644 --- a/vendor/golang.org/x/net/idna/tables15.0.0.go +++ b/vendor/golang.org/x/net/idna/tables15.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.21 -// +build go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go index 4074b5332e..0f25e84ca2 100644 --- a/vendor/golang.org/x/net/idna/tables9.0.0.go +++ b/vendor/golang.org/x/net/idna/tables9.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build !go1.10 -// +build !go1.10 package idna diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go index bb63f904b3..8a75b96673 100644 --- a/vendor/golang.org/x/net/idna/trie12.0.0.go +++ b/vendor/golang.org/x/net/idna/trie12.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.16 -// +build !go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go index 7d68a8dc13..fa45bb9074 100644 --- a/vendor/golang.org/x/net/idna/trie13.0.0.go +++ b/vendor/golang.org/x/net/idna/trie13.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.16 -// +build go1.16 package idna diff --git a/vendor/golang.org/x/oauth2/google/doc.go b/vendor/golang.org/x/oauth2/google/doc.go index ca717634a3..03c42c6f87 100644 --- a/vendor/golang.org/x/oauth2/google/doc.go +++ b/vendor/golang.org/x/oauth2/google/doc.go @@ -101,6 +101,8 @@ // executable-sourced credentials), please check out: // https://cloud.google.com/iam/docs/workforce-obtaining-short-lived-credentials#generate_a_configuration_file_for_non-interactive_sign-in // +// # Security considerations +// // Note that this library does not perform any validation on the token_url, token_info_url, // or service_account_impersonation_url fields of the credential configuration. // It is not recommended to use a credential configuration that you did not generate with diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go index 7d419d3760..f93c740b63 100644 --- a/vendor/golang.org/x/sync/errgroup/go120.go +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.20 -// +build go1.20 package errgroup diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go index 1795c18ace..88ce33434e 100644 --- a/vendor/golang.org/x/sync/errgroup/pre_go120.go +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !go1.20 -// +build !go1.20 package errgroup diff --git a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s index db9171c2e4..269e173ca4 100644 --- a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s +++ b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix.go b/vendor/golang.org/x/sys/cpu/cpu_aix.go index 8aaeef545a..9bf0c32eb6 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_aix.go +++ b/vendor/golang.org/x/sys/cpu/cpu_aix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix -// +build aix package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_arm64.s index c61f95a05a..fcb9a38882 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.s +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go index ccf542a73d..a8acd3e328 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go index 0af2f24841..c8ae6ddc15 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go index fa7cdb9bcd..910728fb16 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (386 || amd64 || amd64p32) && gc -// +build 386 amd64 amd64p32 -// +build gc package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go index 2aff318911..7f1946780b 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gccgo -// +build gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go index 4bfbda6199..9526d2ce3a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gccgo -// +build gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c index 6cc73109f5..3f73a05dcf 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (386 || amd64 || amd64p32) && gccgo -// +build 386 amd64 amd64p32 -// +build gccgo #include #include diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go index 863d415ab4..99c60fe9f9 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (386 || amd64 || amd64p32) && gccgo -// +build 386 amd64 amd64p32 -// +build gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go index 159a686f6f..743eb54354 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !386 && !amd64 && !amd64p32 && !arm64 -// +build !386,!amd64,!amd64p32,!arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go index 6000db4cdd..4686c1d541 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (mips64 || mips64le) -// +build linux -// +build mips64 mips64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go index f4992b1a59..cd63e73355 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x -// +build linux,!arm,!arm64,!mips64,!mips64le,!ppc64,!ppc64le,!s390x package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go index 021356d6de..197188e67f 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (ppc64 || ppc64le) -// +build linux -// +build ppc64 ppc64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_loong64.go b/vendor/golang.org/x/sys/cpu/cpu_loong64.go index 0f57b05bdb..558635850c 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_loong64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_loong64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build loong64 -// +build loong64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go index f4063c6642..fedb00cc4c 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build mips64 || mips64le -// +build mips64 mips64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go index 07c4e36d8f..ffb4ec7eb3 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build mips || mipsle -// +build mips mipsle package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go index d7b4fb4ccc..e9ecf2a456 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux && arm -// +build !linux,arm package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go index f3cde129b6..5341e7f88d 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux && !netbsd && !openbsd && arm64 -// +build !linux,!netbsd,!openbsd,arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go index 0dafe9644a..5f8f2419ab 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux && (mips64 || mips64le) -// +build !linux -// +build mips64 mips64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go index 060d46b6ea..89608fba27 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !linux && (ppc64 || ppc64le) -// +build !aix -// +build !linux -// +build ppc64 ppc64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go index dd10eb79fe..5ab87808f7 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux && riscv64 -// +build !linux,riscv64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go index 4e8acd1658..c14f12b149 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build ppc64 || ppc64le -// +build ppc64 ppc64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go index ff7da60eb8..7f0c79c004 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 -// +build riscv64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.s b/vendor/golang.org/x/sys/cpu/cpu_s390x.s index 96f81e2097..1fb4b70133 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_s390x.s +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/vendor/golang.org/x/sys/cpu/cpu_wasm.go index 7747d888a6..384787ea30 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_wasm.go +++ b/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build wasm -// +build wasm package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go index 2dcde8285d..c29f5e4c5a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 || amd64 || amd64p32 -// +build 386 amd64 amd64p32 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.s b/vendor/golang.org/x/sys/cpu/cpu_x86.s index 39acab2ff5..7d7ba33efb 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.s +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (386 || amd64 || amd64p32) && gc -// +build 386 amd64 amd64p32 -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/cpu/endian_big.go b/vendor/golang.org/x/sys/cpu/endian_big.go index 93ce03a346..7fe04b0a13 100644 --- a/vendor/golang.org/x/sys/cpu/endian_big.go +++ b/vendor/golang.org/x/sys/cpu/endian_big.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64 -// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/endian_little.go b/vendor/golang.org/x/sys/cpu/endian_little.go index 55db853efb..48eccc4c79 100644 --- a/vendor/golang.org/x/sys/cpu/endian_little.go +++ b/vendor/golang.org/x/sys/cpu/endian_little.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm -// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh wasm package cpu diff --git a/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go b/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go index d87bd6b3eb..4cd64c7042 100644 --- a/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go +++ b/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && arm64 -// +build linux,arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go b/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go index b975ea2a04..4c9788ea8e 100644 --- a/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go +++ b/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.21 -// +build go1.21 package cpu diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go index 96134157a1..1b9ccb091a 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -9,7 +9,6 @@ // gccgo's libgo and thus must not used a CGo method. //go:build aix && gccgo -// +build aix,gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go index 904be42ffd..e8b6cdbe9a 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -7,7 +7,6 @@ // (See golang.org/issue/32102) //go:build aix && ppc64 && gc -// +build aix,ppc64,gc package cpu diff --git a/vendor/golang.org/x/sys/unix/aliases.go b/vendor/golang.org/x/sys/unix/aliases.go index abc89c104a..e7d3df4bd3 100644 --- a/vendor/golang.org/x/sys/unix/aliases.go +++ b/vendor/golang.org/x/sys/unix/aliases.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9 -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos -// +build go1.9 package unix diff --git a/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s b/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s index db9171c2e4..269e173ca4 100644 --- a/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s +++ b/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_386.s b/vendor/golang.org/x/sys/unix/asm_bsd_386.s index e0fcd9b3de..a4fcef0e0d 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_386.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_386.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (freebsd || netbsd || openbsd) && gc -// +build freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s b/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s index 2b99c349a2..1e63615c57 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_amd64.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin || dragonfly || freebsd || netbsd || openbsd) && gc -// +build darwin dragonfly freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_arm.s b/vendor/golang.org/x/sys/unix/asm_bsd_arm.s index d702d4adc7..6496c31008 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_arm.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_arm.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (freebsd || netbsd || openbsd) && gc -// +build freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s b/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s index fe36a7391a..4fd1f54daa 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_arm64.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin || freebsd || netbsd || openbsd) && gc -// +build darwin freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s b/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s index e5b9a84899..42f7eb9e47 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin || freebsd || netbsd || openbsd) && gc -// +build darwin freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s index d560019ea2..f8902667e9 100644 --- a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin || freebsd || netbsd || openbsd) && gc -// +build darwin freebsd netbsd openbsd -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_386.s b/vendor/golang.org/x/sys/unix/asm_linux_386.s index 8fd101d071..3b4734870d 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_386.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s index 7ed38e43c6..67e29f3178 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/vendor/golang.org/x/sys/unix/asm_linux_arm.s index 8ef1d51402..d6ae269ce1 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_arm.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s index 98ae02760d..01e5e253c6 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && arm64 && gc -// +build linux -// +build arm64 -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_loong64.s b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s index 565357288a..2abf12f6e8 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_loong64.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_loong64.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && loong64 && gc -// +build linux -// +build loong64 -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s index 21231d2ce1..f84bae7120 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (mips64 || mips64le) && gc -// +build linux -// +build mips64 mips64le -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s index 6783b26c60..f08f628077 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (mips || mipsle) && gc -// +build linux -// +build mips mipsle -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s index 19d4989344..bdfc024d2d 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (ppc64 || ppc64le) && gc -// +build linux -// +build ppc64 ppc64le -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s index e42eb81d58..2e8c996120 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 && gc -// +build riscv64 -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s index c46aab3395..2c394b11eb 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && s390x && gc -// +build linux -// +build s390x -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s index 5e7a1169c0..fab586a2c4 100644 --- a/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s index f8c5394c1a..f949ec5476 100644 --- a/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s +++ b/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gc -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/asm_zos_s390x.s b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s index 3b54e18581..2f67ba86d5 100644 --- a/vendor/golang.org/x/sys/unix/asm_zos_s390x.s +++ b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x && gc -// +build zos -// +build s390x -// +build gc #include "textflag.h" diff --git a/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/golang.org/x/sys/unix/cap_freebsd.go index 0b7c6adb86..a08657890f 100644 --- a/vendor/golang.org/x/sys/unix/cap_freebsd.go +++ b/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build freebsd -// +build freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/constants.go b/vendor/golang.org/x/sys/unix/constants.go index 394a3965b6..6fb7cb77d0 100644 --- a/vendor/golang.org/x/sys/unix/constants.go +++ b/vendor/golang.org/x/sys/unix/constants.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go index 65a998508d..d785134617 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix && ppc -// +build aix,ppc // Functions to access/create device major and minor numbers matching the // encoding used by AIX. diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go index 8fc08ad0aa..623a5e6973 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix && ppc64 -// +build aix,ppc64 // Functions to access/create device major and minor numbers matching the // encoding used AIX. diff --git a/vendor/golang.org/x/sys/unix/dev_zos.go b/vendor/golang.org/x/sys/unix/dev_zos.go index a388e59a0e..bb6a64fe92 100644 --- a/vendor/golang.org/x/sys/unix/dev_zos.go +++ b/vendor/golang.org/x/sys/unix/dev_zos.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x // Functions to access/create device major and minor numbers matching the // encoding used by z/OS. diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go index 2499f977b0..1ebf117826 100644 --- a/vendor/golang.org/x/sys/unix/dirent.go +++ b/vendor/golang.org/x/sys/unix/dirent.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/golang.org/x/sys/unix/endian_big.go index a520265576..1095fd31d6 100644 --- a/vendor/golang.org/x/sys/unix/endian_big.go +++ b/vendor/golang.org/x/sys/unix/endian_big.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. // //go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64 -// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64 package unix diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go index b0f2bc4ae3..b9f0e277b1 100644 --- a/vendor/golang.org/x/sys/unix/endian_little.go +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. // //go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh -// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh package unix diff --git a/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/golang.org/x/sys/unix/env_unix.go index 29ccc4d133..a96da71f47 100644 --- a/vendor/golang.org/x/sys/unix/env_unix.go +++ b/vendor/golang.org/x/sys/unix/env_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Unix environment variables. diff --git a/vendor/golang.org/x/sys/unix/epoll_zos.go b/vendor/golang.org/x/sys/unix/epoll_zos.go index cedaf7e024..7753fddea8 100644 --- a/vendor/golang.org/x/sys/unix/epoll_zos.go +++ b/vendor/golang.org/x/sys/unix/epoll_zos.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go index e9b991258c..58c6bfc70f 100644 --- a/vendor/golang.org/x/sys/unix/fcntl.go +++ b/vendor/golang.org/x/sys/unix/fcntl.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build dragonfly || freebsd || linux || netbsd || openbsd -// +build dragonfly freebsd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go index 29d44808b1..13b4acd5c6 100644 --- a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +++ b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build (linux && 386) || (linux && arm) || (linux && mips) || (linux && mipsle) || (linux && ppc) -// +build linux,386 linux,arm linux,mips linux,mipsle linux,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go index a8068f94f2..9e83d18cd0 100644 --- a/vendor/golang.org/x/sys/unix/fdset.go +++ b/vendor/golang.org/x/sys/unix/fdset.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/fstatfs_zos.go b/vendor/golang.org/x/sys/unix/fstatfs_zos.go index e377cc9f49..c8bde601e7 100644 --- a/vendor/golang.org/x/sys/unix/fstatfs_zos.go +++ b/vendor/golang.org/x/sys/unix/fstatfs_zos.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/golang.org/x/sys/unix/gccgo.go index b06f52d748..aca5721ddc 100644 --- a/vendor/golang.org/x/sys/unix/gccgo.go +++ b/vendor/golang.org/x/sys/unix/gccgo.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gccgo && !aix && !hurd -// +build gccgo,!aix,!hurd package unix diff --git a/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/golang.org/x/sys/unix/gccgo_c.c index f98a1c542f..d468b7b47f 100644 --- a/vendor/golang.org/x/sys/unix/gccgo_c.c +++ b/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gccgo && !aix && !hurd -// +build gccgo,!aix,!hurd #include #include diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go index e60e49a3d9..972d61bd75 100644 --- a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build gccgo && linux && amd64 -// +build gccgo,linux,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go index 15721a5104..848840ae4c 100644 --- a/vendor/golang.org/x/sys/unix/ifreq_linux.go +++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_signed.go b/vendor/golang.org/x/sys/unix/ioctl_signed.go index 7def9580e6..5b0759bd86 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_signed.go +++ b/vendor/golang.org/x/sys/unix/ioctl_signed.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || solaris -// +build aix solaris package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_unsigned.go b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go index 649913d1ea..20f470b9d0 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_unsigned.go +++ b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd -// +build darwin dragonfly freebsd hurd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_zos.go b/vendor/golang.org/x/sys/unix/ioctl_zos.go index cdc21bf76d..c8b2a750f8 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_zos.go +++ b/vendor/golang.org/x/sys/unix/ioctl_zos.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 47fa6a7ebd..cbe24150a7 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -663,7 +663,6 @@ echo '// mkerrors.sh' "$@" echo '// Code generated by the command above; see README.md. DO NOT EDIT.' echo echo "//go:build ${GOARCH} && ${GOOS}" -echo "// +build ${GOARCH},${GOOS}" echo go tool cgo -godefs -- "$@" _const.go >_error.out cat _error.out | grep -vf _error.grep | grep -vf _signal.grep diff --git a/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/vendor/golang.org/x/sys/unix/mmap_nomremap.go index ca0513632e..4b68e59780 100644 --- a/vendor/golang.org/x/sys/unix/mmap_nomremap.go +++ b/vendor/golang.org/x/sys/unix/mmap_nomremap.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || openbsd || solaris -// +build aix darwin dragonfly freebsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go index fa93d0aa90..fd45fe529d 100644 --- a/vendor/golang.org/x/sys/unix/mremap.go +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux || netbsd -// +build linux netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/pagesize_unix.go b/vendor/golang.org/x/sys/unix/pagesize_unix.go index 53f1b4c5b8..4d0a3430ed 100644 --- a/vendor/golang.org/x/sys/unix/pagesize_unix.go +++ b/vendor/golang.org/x/sys/unix/pagesize_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris // For Unix, get the pagesize from the runtime. diff --git a/vendor/golang.org/x/sys/unix/pledge_openbsd.go b/vendor/golang.org/x/sys/unix/pledge_openbsd.go index eb48294b27..6a09af53e6 100644 --- a/vendor/golang.org/x/sys/unix/pledge_openbsd.go +++ b/vendor/golang.org/x/sys/unix/pledge_openbsd.go @@ -8,54 +8,31 @@ import ( "errors" "fmt" "strconv" - "syscall" - "unsafe" ) // Pledge implements the pledge syscall. // -// The pledge syscall does not accept execpromises on OpenBSD releases -// before 6.3. -// -// execpromises must be empty when Pledge is called on OpenBSD -// releases predating 6.3, otherwise an error will be returned. +// This changes both the promises and execpromises; use PledgePromises or +// PledgeExecpromises to only change the promises or execpromises +// respectively. // // For more information see pledge(2). func Pledge(promises, execpromises string) error { - maj, min, err := majmin() + if err := pledgeAvailable(); err != nil { + return err + } + + pptr, err := BytePtrFromString(promises) if err != nil { return err } - err = pledgeAvailable(maj, min, execpromises) + exptr, err := BytePtrFromString(execpromises) if err != nil { return err } - pptr, err := syscall.BytePtrFromString(promises) - if err != nil { - return err - } - - // This variable will hold either a nil unsafe.Pointer or - // an unsafe.Pointer to a string (execpromises). - var expr unsafe.Pointer - - // If we're running on OpenBSD > 6.2, pass execpromises to the syscall. - if maj > 6 || (maj == 6 && min > 2) { - exptr, err := syscall.BytePtrFromString(execpromises) - if err != nil { - return err - } - expr = unsafe.Pointer(exptr) - } - - _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) - if e != 0 { - return e - } - - return nil + return pledge(pptr, exptr) } // PledgePromises implements the pledge syscall. @@ -64,30 +41,16 @@ func Pledge(promises, execpromises string) error { // // For more information see pledge(2). func PledgePromises(promises string) error { - maj, min, err := majmin() + if err := pledgeAvailable(); err != nil { + return err + } + + pptr, err := BytePtrFromString(promises) if err != nil { return err } - err = pledgeAvailable(maj, min, "") - if err != nil { - return err - } - - // This variable holds the execpromises and is always nil. - var expr unsafe.Pointer - - pptr, err := syscall.BytePtrFromString(promises) - if err != nil { - return err - } - - _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) - if e != 0 { - return e - } - - return nil + return pledge(pptr, nil) } // PledgeExecpromises implements the pledge syscall. @@ -96,30 +59,16 @@ func PledgePromises(promises string) error { // // For more information see pledge(2). func PledgeExecpromises(execpromises string) error { - maj, min, err := majmin() + if err := pledgeAvailable(); err != nil { + return err + } + + exptr, err := BytePtrFromString(execpromises) if err != nil { return err } - err = pledgeAvailable(maj, min, execpromises) - if err != nil { - return err - } - - // This variable holds the promises and is always nil. - var pptr unsafe.Pointer - - exptr, err := syscall.BytePtrFromString(execpromises) - if err != nil { - return err - } - - _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(pptr), uintptr(unsafe.Pointer(exptr)), 0) - if e != 0 { - return e - } - - return nil + return pledge(nil, exptr) } // majmin returns major and minor version number for an OpenBSD system. @@ -147,16 +96,15 @@ func majmin() (major int, minor int, err error) { // pledgeAvailable checks for availability of the pledge(2) syscall // based on the running OpenBSD version. -func pledgeAvailable(maj, min int, execpromises string) error { - // If OpenBSD <= 5.9, pledge is not available. - if (maj == 5 && min != 9) || maj < 5 { - return fmt.Errorf("pledge syscall is not available on OpenBSD %d.%d", maj, min) +func pledgeAvailable() error { + maj, min, err := majmin() + if err != nil { + return err } - // If OpenBSD <= 6.2 and execpromises is not empty, - // return an error - execpromises is not available before 6.3 - if (maj < 6 || (maj == 6 && min <= 2)) && execpromises != "" { - return fmt.Errorf("cannot use execpromises on OpenBSD %d.%d", maj, min) + // Require OpenBSD 6.4 as a minimum. + if maj < 6 || (maj == 6 && min <= 3) { + return fmt.Errorf("cannot call Pledge on OpenBSD %d.%d", maj, min) } return nil diff --git a/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/vendor/golang.org/x/sys/unix/ptrace_darwin.go index 463c3eff7f..3f0975f3de 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_darwin.go +++ b/vendor/golang.org/x/sys/unix/ptrace_darwin.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin && !ios -// +build darwin,!ios package unix diff --git a/vendor/golang.org/x/sys/unix/ptrace_ios.go b/vendor/golang.org/x/sys/unix/ptrace_ios.go index ed0509a011..a4d35db5dc 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_ios.go +++ b/vendor/golang.org/x/sys/unix/ptrace_ios.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build ios -// +build ios package unix diff --git a/vendor/golang.org/x/sys/unix/race.go b/vendor/golang.org/x/sys/unix/race.go index 6f6c5fec5a..714d2aae7c 100644 --- a/vendor/golang.org/x/sys/unix/race.go +++ b/vendor/golang.org/x/sys/unix/race.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin && race) || (linux && race) || (freebsd && race) -// +build darwin,race linux,race freebsd,race package unix diff --git a/vendor/golang.org/x/sys/unix/race0.go b/vendor/golang.org/x/sys/unix/race0.go index 706e1322ae..4a9f6634c9 100644 --- a/vendor/golang.org/x/sys/unix/race0.go +++ b/vendor/golang.org/x/sys/unix/race0.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || (darwin && !race) || (linux && !race) || (freebsd && !race) || netbsd || openbsd || solaris || dragonfly || zos -// +build aix darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly zos package unix diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdents.go b/vendor/golang.org/x/sys/unix/readdirent_getdents.go index 4d6257569e..dbd2b6ccb1 100644 --- a/vendor/golang.org/x/sys/unix/readdirent_getdents.go +++ b/vendor/golang.org/x/sys/unix/readdirent_getdents.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || dragonfly || freebsd || linux || netbsd || openbsd -// +build aix dragonfly freebsd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go index 2a4ba47c45..130398b6b7 100644 --- a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go +++ b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin -// +build darwin package unix diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 3865943f6e..c3a62dbb1b 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Socket control messages diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go index 0840fe4a57..4a1eab37ec 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/syscall.go b/vendor/golang.org/x/sys/unix/syscall.go index 63e8c83831..5ea74da982 100644 --- a/vendor/golang.org/x/sys/unix/syscall.go +++ b/vendor/golang.org/x/sys/unix/syscall.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Package unix contains an interface to the low-level operating system // primitives. OS details vary depending on the underlying system, and diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index e94e6cdac8..67ce6cef2d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix -// +build aix // Aix system calls. // This file is compiled as ordinary Go code, @@ -107,7 +106,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { if n > 0 { sl += _Socklen(n) + 1 } - if sa.raw.Path[0] == '@' { + if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { + // Check sl > 3 so we don't change unnamed socket behavior. sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go index f2871fa953..1fdaa47600 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix && ppc -// +build aix,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go index 75718ec0f1..c87f9a9f45 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix && ppc64 -// +build aix,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 4217de518b..6f328e3a55 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd // BSD system call wrappers shared by *BSD based systems // including OS X (Darwin) and FreeBSD. Like the other diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index b37310ce9b..0eaecf5fc3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && darwin -// +build amd64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index d51ec99630..f36c6707cf 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm64 && darwin -// +build arm64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go index 53c96641f8..16dc699379 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin && go1.12 -// +build darwin,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go index 4e2d32120a..14bab6b2de 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && dragonfly -// +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index b8da510043..3967bca772 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 && freebsd -// +build 386,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index 47155c4839..eff19ada23 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && freebsd -// +build amd64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 08932093fa..4f24b517a6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm && freebsd -// +build arm,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index d151a0d0e5..ac30759ece 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm64 && freebsd -// +build arm64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go index d5cd64b378..aab725ca77 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 && freebsd -// +build riscv64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_hurd.go b/vendor/golang.org/x/sys/unix/syscall_hurd.go index 381fd4673b..ba46651f8e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_hurd.go +++ b/vendor/golang.org/x/sys/unix/syscall_hurd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build hurd -// +build hurd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_hurd_386.go b/vendor/golang.org/x/sys/unix/syscall_hurd_386.go index 7cf54a3e4f..df89f9e6b4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_hurd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_hurd_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 && hurd -// +build 386,hurd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index 87db5a6a8c..a863f7052c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -5,7 +5,6 @@ // illumos system calls not present on Solaris. //go:build amd64 && illumos -// +build amd64,illumos package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index fb4e50224c..a5e1c10e34 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -417,7 +417,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { if n > 0 { sl += _Socklen(n) + 1 } - if sa.raw.Path[0] == '@' { + if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { + // Check sl > 3 so we don't change unnamed socket behavior. sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- @@ -2482,3 +2483,5 @@ func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { } return attr, nil } + +//sys Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index c7d9945ea1..506dafa7b4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 && linux -// +build 386,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go index 08086ac6a4..38d55641b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_alarm.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64) -// +build linux -// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 70601ce369..d557cf8de3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && linux -// +build amd64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go index 8b0f0f3aa5..facdb83b23 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && linux && gc -// +build amd64,linux,gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index da2986415a..cd2dd797fd 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm && linux -// +build arm,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index f5266689af..cf2ee6c75e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm64 && linux -// +build arm64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go index 2b1168d7d1..ffc4c2b635 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && gc -// +build linux,gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go index 9843fb4896..9ebfdcf447 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && gc && 386 -// +build linux,gc,386 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go index a6008fccd5..5f2b57c4c2 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm && gc && linux -// +build arm,gc,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go index 7740af2428..d1a3ad8263 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && gccgo && 386 -// +build linux,gccgo,386 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go index e16a12299a..f2f67423e9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && gccgo && arm -// +build linux,gccgo,arm package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index f6ab02ec15..3d0e98451f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build loong64 && linux -// +build loong64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 93fe59d25d..70963a95ab 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (mips64 || mips64le) -// +build linux -// +build mips64 mips64le package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index aae7f0ffd3..c218ebd280 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (mips || mipsle) -// +build linux -// +build mips mipsle package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index 66eff19a32..e6c48500ca 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && ppc -// +build linux,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 806aa2574d..7286a9aa88 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (ppc64 || ppc64le) -// +build linux -// +build ppc64 ppc64le package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 5e6ceee129..6f5a288944 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 && linux -// +build riscv64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 2f89e8f5de..66f31210d0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build s390x && linux -// +build s390x,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index 7ca064ae76..11d1f16986 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build sparc64 && linux -// +build sparc64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go index 5199d282fd..7a5eb57432 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 && netbsd -// +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go index 70a9c52e98..62d8957ae6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && netbsd -// +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go index 3eb5942f93..ce6a068851 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm && netbsd -// +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go index fc6ccfd810..d46d689d1b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm64 && netbsd -// +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 6f34479b59..d2882ee04f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -137,18 +137,13 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e } func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { - var _p0 unsafe.Pointer + var bufptr *Statfs_t var bufsize uintptr if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) + bufptr = &buf[0] bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } - r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) - n = int(r0) - if e1 != 0 { - err = e1 - } - return + return getfsstat(bufptr, bufsize, flags) } //sysnb getresuid(ruid *_C_int, euid *_C_int, suid *_C_int) @@ -326,4 +321,7 @@ func Uname(uname *Utsname) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) +//sys getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) +//sys pledge(promises *byte, execpromises *byte) (err error) +//sys unveil(path *byte, flags *byte) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go index 6baabcdcb0..9ddc89f4fc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build 386 && openbsd -// +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go index bab25360ea..70a3c96eea 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && openbsd -// +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go index 8eed3c4d4e..265caa87f7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm && openbsd -// +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go index 483dde99d4..ac4fda1715 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build arm64 && openbsd -// +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go index 04aa43f41b..0a451e6dd4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build openbsd -// +build openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go index c2796139c0..30a308cbb4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build ppc64 && openbsd -// +build ppc64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go index 23199a7ff6..ea954330fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 && openbsd -// +build riscv64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index b99cfa1342..60c8142d49 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -128,7 +128,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { if n > 0 { sl += _Socklen(n) + 1 } - if sa.raw.Path[0] == '@' { + if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { + // Check sl > 3 so we don't change unnamed socket behavior. sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go index 0bd25ef81f..e02d8ceae3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index f6eda27050..77081de8c7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go index b6919ca580..05c95bccfa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin || dragonfly || freebsd || (linux && !ppc64 && !ppc64le) || netbsd || openbsd || solaris) && gc -// +build darwin dragonfly freebsd linux,!ppc64,!ppc64le netbsd openbsd solaris -// +build gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go index f6f707acf2..23f39b7af7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go @@ -3,9 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && (ppc64le || ppc64) && gc -// +build linux -// +build ppc64le ppc64 -// +build gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index 4596d041ce..d99d05f1bc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/sysvshm_linux.go b/vendor/golang.org/x/sys/unix/sysvshm_linux.go index 2c3a4437f0..4fcd38de27 100644 --- a/vendor/golang.org/x/sys/unix/sysvshm_linux.go +++ b/vendor/golang.org/x/sys/unix/sysvshm_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package unix diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix.go b/vendor/golang.org/x/sys/unix/sysvshm_unix.go index 5bb41d17bc..79a84f18b4 100644 --- a/vendor/golang.org/x/sys/unix/sysvshm_unix.go +++ b/vendor/golang.org/x/sys/unix/sysvshm_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build (darwin && !ios) || linux -// +build darwin,!ios linux package unix diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go index 71bddefdb8..9eb0db664c 100644 --- a/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go +++ b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin && !ios -// +build darwin,!ios package unix diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go index 616b1b2848..7997b19022 100644 --- a/vendor/golang.org/x/sys/unix/timestruct.go +++ b/vendor/golang.org/x/sys/unix/timestruct.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/unveil_openbsd.go b/vendor/golang.org/x/sys/unix/unveil_openbsd.go index 168d5ae779..cb7e598cef 100644 --- a/vendor/golang.org/x/sys/unix/unveil_openbsd.go +++ b/vendor/golang.org/x/sys/unix/unveil_openbsd.go @@ -4,39 +4,48 @@ package unix -import ( - "syscall" - "unsafe" -) +import "fmt" // Unveil implements the unveil syscall. // For more information see unveil(2). // Note that the special case of blocking further // unveil calls is handled by UnveilBlock. func Unveil(path string, flags string) error { - pathPtr, err := syscall.BytePtrFromString(path) + if err := supportsUnveil(); err != nil { + return err + } + pathPtr, err := BytePtrFromString(path) if err != nil { return err } - flagsPtr, err := syscall.BytePtrFromString(flags) + flagsPtr, err := BytePtrFromString(flags) if err != nil { return err } - _, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(flagsPtr)), 0) - if e != 0 { - return e - } - return nil + return unveil(pathPtr, flagsPtr) } // UnveilBlock blocks future unveil calls. // For more information see unveil(2). func UnveilBlock() error { - // Both pointers must be nil. - var pathUnsafe, flagsUnsafe unsafe.Pointer - _, _, e := syscall.Syscall(SYS_UNVEIL, uintptr(pathUnsafe), uintptr(flagsUnsafe), 0) - if e != 0 { - return e + if err := supportsUnveil(); err != nil { + return err } + return unveil(nil, nil) +} + +// supportsUnveil checks for availability of the unveil(2) system call based +// on the running OpenBSD version. +func supportsUnveil() error { + maj, min, err := majmin() + if err != nil { + return err + } + + // unveil is not available before 6.4 + if maj < 6 || (maj == 6 && min <= 3) { + return fmt.Errorf("cannot call Unveil on OpenBSD %d.%d", maj, min) + } + return nil } diff --git a/vendor/golang.org/x/sys/unix/xattr_bsd.go b/vendor/golang.org/x/sys/unix/xattr_bsd.go index f5f8e9f366..e168793961 100644 --- a/vendor/golang.org/x/sys/unix/xattr_bsd.go +++ b/vendor/golang.org/x/sys/unix/xattr_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build freebsd || netbsd -// +build freebsd netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go index ca9799b79e..2fb219d787 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && aix -// +build ppc,aix // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -maix32 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go index 200c8c26fe..b0e6f5c85c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && aix -// +build ppc64,aix // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -maix64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index 1430076271..e40fa85245 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && darwin -// +build amd64,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index ab044a7427..bb02aa6c05 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && darwin -// +build arm64,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go index 17bba0e44f..c0e0f8694c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && dragonfly -// +build amd64,dragonfly // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index f8c2c51387..6c6923906f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && freebsd -// +build 386,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index 96310c3be1..dd9163f8e8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && freebsd -// +build amd64,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index 777b69defa..493a2a793c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && freebsd -// +build arm,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go index c557ac2db3..8b437b307d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && freebsd -// +build arm64,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go index 341b4d9626..67c02dd579 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && freebsd -// +build riscv64,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index f9c7f479b0..9c00cbf512 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -1,7 +1,6 @@ // Code generated by mkmerge; DO NOT EDIT. //go:build linux -// +build linux package unix @@ -481,10 +480,14 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_AFTER = 0x10 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_KPROBE_MULTI_RETURN = 0x1 + BPF_F_BEFORE = 0x8 + BPF_F_ID = 0x20 + BPF_F_LINK = 0x2000 + BPF_F_NETFILTER_IP_DEFRAG = 0x1 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 BPF_F_SLEEPABLE = 0x10 @@ -521,6 +524,7 @@ const ( BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 + BPF_MEMSX = 0x80 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 @@ -776,6 +780,8 @@ const ( DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" DEVLINK_GENL_NAME = "devlink" DEVLINK_GENL_VERSION = 0x1 + DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO = 0x4 + DEVLINK_PORT_FN_CAP_IPSEC_PACKET = 0x8 DEVLINK_PORT_FN_CAP_MIGRATABLE = 0x2 DEVLINK_PORT_FN_CAP_ROCE = 0x1 DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 @@ -1698,6 +1704,7 @@ const ( KEXEC_ON_CRASH = 0x1 KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 + KEXEC_UPDATE_ELFCOREHDR = 0x4 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CAPABILITIES = 0x1f KEYCTL_CAPS0_BIG_KEY = 0x10 @@ -2275,6 +2282,7 @@ const ( PERF_MEM_LVLNUM_PMEM = 0xe PERF_MEM_LVLNUM_RAM = 0xd PERF_MEM_LVLNUM_SHIFT = 0x21 + PERF_MEM_LVLNUM_UNC = 0x8 PERF_MEM_LVL_HIT = 0x2 PERF_MEM_LVL_IO = 0x1000 PERF_MEM_LVL_L1 = 0x8 @@ -3461,6 +3469,7 @@ const ( XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 + XDP_PKT_CONTD = 0x1 XDP_RING_NEED_WAKEUP = 0x1 XDP_RX_RING = 0x2 XDP_SHARED_UMEM = 0x1 @@ -3473,6 +3482,7 @@ const ( XDP_UMEM_REG = 0x4 XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 XDP_USE_NEED_WAKEUP = 0x8 + XDP_USE_SG = 0x10 XDP_ZEROCOPY = 0x4 XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 30aee00a53..4920821cf3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux -// +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/386/include -m32 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 8ebfa51278..a0c1e41127 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux -// +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/amd64/include -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 271a21cdc7..c63985560f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux -// +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/arm/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 910c330a39..47cc62e25c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux -// +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index a640798c93..27ac4a09e2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux -// +build loong64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/loong64/include _const.go @@ -119,6 +118,7 @@ const ( IXOFF = 0x1000 IXON = 0x400 LASX_CTX_MAGIC = 0x41535801 + LBT_CTX_MAGIC = 0x42540001 LSX_CTX_MAGIC = 0x53580001 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 0d5925d340..54694642a5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux -// +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/mips/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index d72a00e0b6..3adb81d758 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux -// +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/mips64/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 02ba129f85..2dfe98f0d1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux -// +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/mips64le/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 8daa6dd968..f5398f84f0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux -// +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/mipsle/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 63c8fa2f7f..c54f152d68 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux -// +build ppc,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 930799ec1b..76057dc72f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux -// +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 8605a7dd7e..e0c3725e2b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux -// +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64le/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 95a016f1c0..18f2813ed5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux -// +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/riscv64/include _const.go @@ -228,6 +227,9 @@ const ( PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffffffffffff + PTRACE_GETFDPIC = 0x21 + PTRACE_GETFDPIC_EXEC = 0x0 + PTRACE_GETFDPIC_INTERP = 0x1 RLIMIT_AS = 0x9 RLIMIT_MEMLOCK = 0x8 RLIMIT_NOFILE = 0x7 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 1ae0108f57..11619d4ec8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux -// +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 1bb7c6333b..396d994da7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux -// +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -Wall -Werror -static -I/tmp/sparc64/include _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go index 72f7420d20..130085df40 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && netbsd -// +build 386,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go index 8d4eb0c080..84769a1a38 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && netbsd -// +build amd64,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go index 9eef9749f6..602ded0033 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && netbsd -// +build arm,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -marm _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go index 3b62ba192c..efc0406ee1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && netbsd -// +build arm64,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go index af20e474b3..5a6500f837 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && openbsd -// +build 386,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go index 6015fcb2bf..a5aeeb979d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && openbsd -// +build amd64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go index 8d44955e44..0e9748a722 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && openbsd -// +build arm,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go index ae16fe7542..4f4449abc1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && openbsd -// +build arm64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go index 03d90fe355..76a363f0fe 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && openbsd -// +build mips64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go index 8e2c51b1ee..43ca0cdfdc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && openbsd -// +build ppc64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go index 13d403031e..b1b8bb2005 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && openbsd -// +build riscv64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go index 1afee6a089..d2ddd3176e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && solaris -// +build amd64,solaris // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go diff --git a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go index fc7d0506f6..4dfd2e051d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x // Hand edited based on zerrors_linux_s390x.go // TODO: auto-generate. diff --git a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go index 97f20ca282..586317c78e 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go @@ -1,8 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("arm", "arm64"). DO NOT EDIT. //go:build linux && (arm || arm64) -// +build linux -// +build arm arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go index 0b5f794305..d7c881be77 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go @@ -1,8 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("mips", "mips64"). DO NOT EDIT. //go:build linux && (mips || mips64) -// +build linux -// +build mips mips64 package unix diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go index 2807f7e646..2d2de5d292 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go @@ -1,8 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("mipsle", "mips64le"). DO NOT EDIT. //go:build linux && (mipsle || mips64le) -// +build linux -// +build mipsle mips64le package unix diff --git a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go index 281ea64e34..5adc79fb5e 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go @@ -1,8 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("386", "amd64"). DO NOT EDIT. //go:build linux && (386 || amd64) -// +build linux -// +build 386 amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index d1d1d23311..6ea64a3c0c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build aix && ppc -// +build aix,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index f99a18adc3..99ee4399a3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build aix && ppc64 -// +build aix,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index c4d50ae500..b68a78362b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build aix && ppc64 && gc -// +build aix,ppc64,gc package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index 6903d3b09e..0a87450bf8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build aix && ppc64 && gccgo -// +build aix,ppc64,gccgo package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 1cad561e98..ccb02f240a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build darwin && amd64 -// +build darwin,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index b18edbd0e3..1b40b997b5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build darwin && arm64 -// +build darwin,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 0c67df64a5..aad65fc793 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build dragonfly && amd64 -// +build dragonfly,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index e6e05d145b..c0096391af 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build freebsd && 386 -// +build freebsd,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 7508accac9..7664df7496 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build freebsd && amd64 -// +build freebsd,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 7b56aead46..ae099182c9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build freebsd && arm -// +build freebsd,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index cc623dcaae..11fd5d45bb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build freebsd && arm64 -// +build freebsd,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go index 5818491974..c3d2d65307 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build freebsd && riscv64 -// +build freebsd,riscv64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go index 6be25cd190..c698cbc01a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build illumos && amd64 -// +build illumos,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 1ff3aec74c..faca7a557b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1,7 +1,6 @@ // Code generated by mkmerge; DO NOT EDIT. //go:build linux -// +build linux package unix @@ -2195,3 +2194,13 @@ func schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) { + _, _, e1 := Syscall6(SYS_CACHESTAT, uintptr(fd), uintptr(unsafe.Pointer(crange)), uintptr(unsafe.Pointer(cstat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 07b549cc25..4def3e9fcb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && 386 -// +build linux,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 5f481bf83f..fef2bc8ba9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && amd64 -// +build linux,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 824cd52c7f..a9fd76a884 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && arm -// +build linux,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index e77aecfe98..4600650280 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && arm64 -// +build linux,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go index 806ffd1e12..c8987d2646 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && loong64 -// +build linux,loong64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 961a3afb7b..921f430611 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mips -// +build linux,mips package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index ed05005e91..44f067829c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mips64 -// +build linux,mips64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index d365b718f3..e7fa0abf0d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mips64le -// +build linux,mips64le package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index c3f1b8bbde..8c5125675e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && mipsle -// +build linux,mipsle package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index a6574cf98b..7392fd45e4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc -// +build linux,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index f40990264f..41180434e6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc64 -// +build linux,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 9dfcc29974..40c6ce7ae5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && ppc64le -// +build linux,ppc64le package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 0ab4f2ed72..2cfe34adb1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && riscv64 -// +build linux,riscv64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 6cde32237d..61e6f07097 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && s390x -// +build linux,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 5253d65bf1..834b842042 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build linux && sparc64 -// +build linux,sparc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 2df3c5bac6..e91ebc14a1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build netbsd && 386 -// +build netbsd,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index a60556babb..be28babbcd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build netbsd && amd64 -// +build netbsd,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 9f788917a4..fb587e8261 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build netbsd && arm -// +build netbsd,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 82a4cb2dc4..d576438bb0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build netbsd && arm64 -// +build netbsd,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 66b3b64563..88bfc28857 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && 386 -// +build openbsd,386 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 3dcacd30d7..4cbeff171b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getfsstat_trampoline_addr(SB)/4, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index c5c4cc112e..b8a67b99af 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && amd64 -// +build openbsd,amd64 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 2763620b01..1123f27571 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 93bfbb3287..af50a65c0c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && arm -// +build openbsd,arm package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index c922314048..82badae39f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getfsstat_trampoline_addr(SB)/4, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pledge_trampoline_addr(SB)/4, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unveil_trampoline_addr(SB)/4, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index a107b8fda5..8fb4ff36a7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && arm64 -// +build openbsd,arm64 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index a6bc32c922..24d7eecb93 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index c427de509e..f469a83ee6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && mips64 -// +build openbsd,mips64 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index b4e7bceabf..9a498a0677 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index 60c1a99ae4..c26ca2e1aa 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && ppc64 -// +build openbsd,ppc64 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index ca3f766009..1f224aa416 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -801,8 +801,26 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_getfsstat(SB) + RET +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_utimensat(SB) RET GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_pledge(SB) + RET +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_unveil(SB) + RET +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 52eba360f8..bcc920dd25 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && riscv64 -// +build openbsd,riscv64 package unix @@ -2213,6 +2212,21 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func getfsstat(stat *Statfs_t, bufsize uintptr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_getfsstat_trampoline_addr, uintptr(unsafe.Pointer(stat)), uintptr(bufsize), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_getfsstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getfsstat getfsstat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2229,3 +2243,33 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error var libc_utimensat_trampoline_addr uintptr //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pledge(promises *byte, execpromises *byte) (err error) { + _, _, e1 := syscall_syscall(libc_pledge_trampoline_addr, uintptr(unsafe.Pointer(promises)), uintptr(unsafe.Pointer(execpromises)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_pledge_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pledge pledge "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unveil(path *byte, flags *byte) (err error) { + _, _, e1 := syscall_syscall(libc_unveil_trampoline_addr, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(flags)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_unveil_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unveil unveil "libc.so" + + diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index 477a7d5b21..87a79c7095 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -668,7 +668,22 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) +TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getfsstat(SB) +GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) + TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) + +TEXT libc_pledge_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pledge(SB) +GLOBL ·libc_pledge_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pledge_trampoline_addr(SB)/8, $libc_pledge_trampoline<>(SB) + +TEXT libc_unveil_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unveil(SB) +GLOBL ·libc_unveil_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unveil_trampoline_addr(SB)/8, $libc_unveil_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index b401894644..829b87feb8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build solaris && amd64 -// +build solaris,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go index 1d8fe1d4b2..94f0112383 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go index 55e0484719..3a58ae819a 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build 386 && openbsd -// +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go index d2243cf83f..dcb7a0eb72 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build amd64 && openbsd -// +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go index 82dc51bd8b..db5a7bf13c 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build arm && openbsd -// +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go index cbdda1a4ae..7be575a777 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build arm64 && openbsd -// +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go index f55eae1a82..d6e3174c69 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build mips64 && openbsd -// +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go index e44054470b..ee97157d01 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build ppc64 && openbsd -// +build ppc64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go index a0db82fce2..35c3b91d0f 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build riscv64 && openbsd -// +build riscv64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go index f8298ff9b5..5edda76870 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && darwin -// +build amd64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go index 5eb433bbf0..0dc9e8b4d9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && darwin -// +build arm64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go index 703675c0c4..308ddf3a1f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && dragonfly -// +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 4e0d96107b..418664e3dc 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && freebsd -// +build 386,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 01636b838d..34d0b86d7c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && freebsd -// +build amd64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index ad99bc106a..b71cf45e2e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && freebsd -// +build arm,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 89dcc42747..e32df1c1ee 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && freebsd -// +build arm64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go index ee37aaa0c9..15ad6111f3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && freebsd -// +build riscv64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 9862853d34..fcf3ecbdde 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux -// +build 386,linux package unix @@ -448,4 +447,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 8901f0f4e5..f56dc2504a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux -// +build amd64,linux package unix @@ -370,4 +369,6 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 6902c37eed..974bf24676 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux -// +build arm,linux package unix @@ -412,4 +411,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index a6d3dff811..39a2739e23 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux -// +build arm64,linux package unix @@ -315,4 +314,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index b18f3f7107..cf9c9d77e1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux -// +build loong64,linux package unix @@ -309,4 +308,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 0302e5e3de..10b7362ef4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux -// +build mips,linux package unix @@ -432,4 +431,5 @@ const ( SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 SYS_CACHESTAT = 4451 + SYS_FCHMODAT2 = 4452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 6693ba4a0f..cd4d8b4fd3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux -// +build mips64,linux package unix @@ -362,4 +361,5 @@ const ( SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 SYS_CACHESTAT = 5451 + SYS_FCHMODAT2 = 5452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index fd93f4987c..2c0efca818 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux -// +build mips64le,linux package unix @@ -362,4 +361,5 @@ const ( SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 SYS_CACHESTAT = 5451 + SYS_FCHMODAT2 = 5452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 760ddcadc2..a72e31d391 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux -// +build mipsle,linux package unix @@ -432,4 +431,5 @@ const ( SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 SYS_CACHESTAT = 4451 + SYS_FCHMODAT2 = 4452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index cff2b2555b..c7d1e37471 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux -// +build ppc,linux package unix @@ -439,4 +438,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index a4b2405d09..f4d4838c87 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux -// +build ppc64,linux package unix @@ -411,4 +410,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index aca54b4e3a..b64f0e5911 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux -// +build ppc64le,linux package unix @@ -411,4 +410,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 9d1738d641..95711195a0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux -// +build riscv64,linux package unix @@ -316,4 +315,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 022878dc8d..f94e943bc4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux -// +build s390x,linux package unix @@ -377,4 +376,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 4100a761c2..ba0c2bc515 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux -// +build sparc64,linux package unix @@ -390,4 +389,5 @@ const ( SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 + SYS_FCHMODAT2 = 452 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go index 3a6699eba9..b2aa8cd495 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && netbsd -// +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go index 5677cd4f15..524a1b1c9a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && netbsd -// +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go index e784cb6db1..d59b943ac2 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && netbsd -// +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go index bd4952efa5..31e771d53e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; DO NOT EDIT. //go:build arm64 && netbsd -// +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go index 597733813e..9fd77c6cb4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && openbsd -// +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go index 16af291899..af10af28cb 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && openbsd -// +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go index f59b18a977..cc2028af4b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && openbsd -// +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go index 721ef59103..c06dd4415a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && openbsd -// +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go index 01c43a01fd..9ddbf3e08f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && openbsd -// +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go index f258cfa24e..19a6ee4134 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && openbsd -// +build ppc64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go index 07919e0ecc..05192a782d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && openbsd -// +build riscv64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go index 073daad43b..b2e3085819 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go index 7a8161c1d1..3e6d57cae7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && aix -// +build ppc,aix package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go index 07ed733c51..3a219bdce7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && aix -// +build ppc64,aix package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 690cefc3d0..091d107f3a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && darwin -// +build amd64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 5bffc10eac..28ff4ef74d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && darwin -// +build arm64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index d0ba8e9b86..30e405bb4c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && dragonfly -// +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 29dc483378..6cbd094a3a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && freebsd -// +build 386,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 0a89b28906..7c03b6ee77 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && freebsd -// +build amd64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index c8666bb152..422107ee8b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && freebsd -// +build arm,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 88fb48a887..505a12acfd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && freebsd -// +build arm64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go index 698dc975e9..cc986c7900 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && freebsd -// +build riscv64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 18aa70b426..997bcd55ae 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -1,7 +1,6 @@ // Code generated by mkmerge; DO NOT EDIT. //go:build linux -// +build linux package unix @@ -5883,3 +5882,15 @@ type SchedAttr struct { } const SizeofSchedAttr = 0x38 + +type Cachestat_t struct { + Cache uint64 + Dirty uint64 + Writeback uint64 + Evicted uint64 + Recently_evicted uint64 +} +type CachestatRange struct { + Off uint64 + Len uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 6d8acbcc57..438a30affa 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux -// +build 386,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 59293c6884..adceca3553 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux -// +build amd64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 40cfa38c29..eeaa00a37d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux -// +build arm,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 055bc4216d..6739aa91d4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux -// +build arm64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index f28affbc60..9920ef6317 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux -// +build loong64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 9d71e7ccd8..2923b799a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux -// +build mips,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index fd5ccd332a..ce2750ee41 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux -// +build mips64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 7704de77a2..3038811d70 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux -// +build mips64le,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index df00b87571..efc6fed18c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux -// +build mipsle,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index 0942840db6..9a654b75a9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux -// +build ppc,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 0348743950..40d358e33e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux -// +build ppc64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index bad0670475..148c6ceb86 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux -// +build ppc64le,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 1b4c97c32a..72ba81543e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux -// +build riscv64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index aa268d025c..71e765508e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux -// +build s390x,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 444045b6c5..4abbdb9de9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux -// +build sparc64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 9bc4c8f9d8..f22e7947d9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && netbsd -// +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index bb05f655d2..066a7d83d2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && netbsd -// +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index db40e3a19c..439548ec9a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && netbsd -// +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index 11121151cc..16085d3bbc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && netbsd -// +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 26eba23b72..afd13a3af7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && openbsd -// +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 5a54798869..5d97f1f9b6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && openbsd -// +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index be58c4e1ff..34871cdc15 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && openbsd -// +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index 52338266cb..5911bceb31 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && openbsd -// +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go index 605cfdb12b..e4f24f3bc9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && openbsd -// +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go index d6724c0102..ca50a79303 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && openbsd -// +build ppc64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go index ddfd27a434..d7d7f79023 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && openbsd -// +build riscv64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index 0400747c67..14160576d2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -2,7 +2,6 @@ // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && solaris -// +build amd64,solaris package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go index aec1efcb30..54f31be637 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build zos && s390x -// +build zos,s390x // Hand edited based on ztypes_linux_s390x.go // TODO: auto-generate. diff --git a/vendor/golang.org/x/sys/windows/aliases.go b/vendor/golang.org/x/sys/windows/aliases.go index a20ebea633..ce2d713d62 100644 --- a/vendor/golang.org/x/sys/windows/aliases.go +++ b/vendor/golang.org/x/sys/windows/aliases.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows && go1.9 -// +build windows,go1.9 package windows diff --git a/vendor/golang.org/x/sys/windows/empty.s b/vendor/golang.org/x/sys/windows/empty.s index fdbbbcd317..ba64caca5d 100644 --- a/vendor/golang.org/x/sys/windows/empty.s +++ b/vendor/golang.org/x/sys/windows/empty.s @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !go1.12 -// +build !go1.12 // This file is here to allow bodyless functions with go:linkname for Go 1.11 // and earlier (see https://golang.org/issue/23311). diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go index 2cd60645ee..6c366955d9 100644 --- a/vendor/golang.org/x/sys/windows/eventlog.go +++ b/vendor/golang.org/x/sys/windows/eventlog.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows -// +build windows package windows diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go index 8563f79c57..dbcdb090c0 100644 --- a/vendor/golang.org/x/sys/windows/mksyscall.go +++ b/vendor/golang.org/x/sys/windows/mksyscall.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build generate -// +build generate package windows diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go index 9196b089ca..0f1bdc3860 100644 --- a/vendor/golang.org/x/sys/windows/race.go +++ b/vendor/golang.org/x/sys/windows/race.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows && race -// +build windows,race package windows diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go index 7bae4817a0..0c78da78b1 100644 --- a/vendor/golang.org/x/sys/windows/race0.go +++ b/vendor/golang.org/x/sys/windows/race0.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows && !race -// +build windows,!race package windows diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index c44a1b9636..a9dc6308d6 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows -// +build windows package windows diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go index 4fc01434e4..6a4f9ce6aa 100644 --- a/vendor/golang.org/x/sys/windows/str.go +++ b/vendor/golang.org/x/sys/windows/str.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows -// +build windows package windows diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go index 8732cdb957..e85ed6b9c8 100644 --- a/vendor/golang.org/x/sys/windows/syscall.go +++ b/vendor/golang.org/x/sys/windows/syscall.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build windows -// +build windows // Package windows contains an interface to the low-level operating system // primitives. OS details vary depending on the underlying system, and diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 35cfc57ca8..fb6cfd0462 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -233,6 +233,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock //sys getTickCount64() (ms uint64) = kernel32.GetTickCount64 +//sys GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) //sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) //sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW @@ -969,7 +970,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { if n > 0 { sl += int32(n) + 1 } - if sa.raw.Path[0] == '@' { + if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) { + // Check sl > 3 so we don't change unnamed socket behavior. sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index b88dc7c85e..359780f6ac 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -1094,7 +1094,33 @@ const ( SOMAXCONN = 0x7fffffff - TCP_NODELAY = 1 + TCP_NODELAY = 1 + TCP_EXPEDITED_1122 = 2 + TCP_KEEPALIVE = 3 + TCP_MAXSEG = 4 + TCP_MAXRT = 5 + TCP_STDURG = 6 + TCP_NOURG = 7 + TCP_ATMARK = 8 + TCP_NOSYNRETRIES = 9 + TCP_TIMESTAMPS = 10 + TCP_OFFLOAD_PREFERENCE = 11 + TCP_CONGESTION_ALGORITHM = 12 + TCP_DELAY_FIN_ACK = 13 + TCP_MAXRTMS = 14 + TCP_FASTOPEN = 15 + TCP_KEEPCNT = 16 + TCP_KEEPIDLE = TCP_KEEPALIVE + TCP_KEEPINTVL = 17 + TCP_FAIL_CONNECT_ON_ICMP_ERROR = 18 + TCP_ICMP_ERROR_INFO = 19 + + UDP_NOCHECKSUM = 1 + UDP_SEND_MSG_SIZE = 2 + UDP_RECV_MAX_COALESCED_SIZE = 3 + UDP_CHECKSUM_COVERAGE = 20 + + UDP_COALESCED_INFO = 3 SHUT_RD = 0 SHUT_WR = 1 diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 8b1688de4c..db6282e00a 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -253,6 +253,7 @@ var ( procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") + procGetFileTime = modkernel32.NewProc("GetFileTime") procGetFileType = modkernel32.NewProc("GetFileType") procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW") procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") @@ -2185,6 +2186,14 @@ func GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, return } +func GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procGetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func GetFileType(filehandle Handle) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) n = uint32(r0) diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go index 8a7392c4a1..784bb88087 100644 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +++ b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.10 -// +build go1.10 package bidirule diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go index bb0a920018..8e1e943955 100644 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +++ b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !go1.10 -// +build !go1.10 package bidirule diff --git a/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go index 42fa8d72ce..d2bd71181d 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.10 && !go1.13 -// +build go1.10,!go1.13 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go index 56a0e1ea21..f76bdca273 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.13 && !go1.14 -// +build go1.13,!go1.14 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go index baacf32b43..3aa2c3bdf8 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.14 && !go1.16 -// +build go1.14,!go1.16 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index ffadb7bebd..a713757906 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.16 && !go1.21 -// +build go1.16,!go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go index 92cce5802c..f15746f7df 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.21 -// +build go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go index f517fdb202..c164d37917 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build !go1.10 -// +build !go1.10 package bidi diff --git a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go index f5a0788277..1af161c756 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.10 && !go1.13 -// +build go1.10,!go1.13 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go index cb7239c437..eb73ecc373 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.13 && !go1.14 -// +build go1.13,!go1.14 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go index 11b2733001..276cb8d8c0 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.14 && !go1.16 -// +build go1.14,!go1.16 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index f65785e8ac..0cceffd731 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.16 && !go1.21 -// +build go1.16,!go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go index e1858b879d..b0819e42d0 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.21 -// +build go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go index 0175eae50a..bf65457d9b 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build !go1.10 -// +build !go1.10 package norm diff --git a/vendor/google.golang.org/api/internal/version.go b/vendor/google.golang.org/api/internal/version.go index 0674cb4f61..62a5a2386b 100644 --- a/vendor/google.golang.org/api/internal/version.go +++ b/vendor/google.golang.org/api/internal/version.go @@ -5,4 +5,4 @@ package internal // Version is the current tagged release of the library. -const Version = "0.149.0" +const Version = "0.150.0" diff --git a/vendor/google.golang.org/api/storage/v1/storage-api.json b/vendor/google.golang.org/api/storage/v1/storage-api.json index 2af5c30f44..5481a74cbb 100644 --- a/vendor/google.golang.org/api/storage/v1/storage-api.json +++ b/vendor/google.golang.org/api/storage/v1/storage-api.json @@ -26,7 +26,7 @@ "description": "Stores and retrieves potentially large, immutable data objects.", "discoveryVersion": "v1", "documentationLink": "https://developers.google.com/storage/docs/json_api/", - "etag": "\"3133333835393639383131353638313238353437\"", + "etag": "\"39383633393336373936373236333033393737\"", "icons": { "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" @@ -92,6 +92,242 @@ }, "protocol": "rest", "resources": { + "anywhereCache": { + "methods": { + "disable": { + "description": "Disables an Anywhere Cache instance.", + "httpMethod": "POST", + "id": "storage.anywhereCaches.disable", + "parameterOrder": [ + "bucket", + "anywhereCacheId" + ], + "parameters": { + "anywhereCacheId": { + "description": "The ID of requested Anywhere Cache instance.", + "location": "path", + "required": true, + "type": "string" + }, + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/disable", + "response": { + "$ref": "AnywhereCache" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "get": { + "description": "Returns the metadata of an Anywhere Cache instance.", + "httpMethod": "GET", + "id": "storage.anywhereCaches.get", + "parameterOrder": [ + "bucket", + "anywhereCacheId" + ], + "parameters": { + "anywhereCacheId": { + "description": "The ID of requested Anywhere Cache instance.", + "location": "path", + "required": true, + "type": "string" + }, + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", + "response": { + "$ref": "AnywhereCache" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "insert": { + "description": "Creates an Anywhere Cache instance.", + "httpMethod": "POST", + "id": "storage.anywhereCaches.insert", + "parameterOrder": [ + "bucket" + ], + "parameters": { + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches", + "request": { + "$ref": "AnywhereCache" + }, + "response": { + "$ref": "GoogleLongrunningOperation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "list": { + "description": "Returns a list of Anywhere Cache instances of the bucket matching the criteria.", + "httpMethod": "GET", + "id": "storage.anywhereCaches.list", + "parameterOrder": [ + "bucket" + ], + "parameters": { + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + }, + "pageSize": { + "description": "Maximum number of items return in a single page of responses. Maximum 1000.", + "format": "int32", + "location": "query", + "minimum": "0", + "type": "integer" + }, + "pageToken": { + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query", + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCache", + "response": { + "$ref": "AnywhereCaches" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "pause": { + "description": "Pauses an Anywhere Cache instance.", + "httpMethod": "POST", + "id": "storage.anywhereCaches.pause", + "parameterOrder": [ + "bucket", + "anywhereCacheId" + ], + "parameters": { + "anywhereCacheId": { + "description": "The ID of requested Anywhere Cache instance.", + "location": "path", + "required": true, + "type": "string" + }, + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/pause", + "response": { + "$ref": "AnywhereCache" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "resume": { + "description": "Resumes a paused or disabled Anywhere Cache instance.", + "httpMethod": "POST", + "id": "storage.anywhereCaches.resume", + "parameterOrder": [ + "bucket", + "anywhereCacheId" + ], + "parameters": { + "anywhereCacheId": { + "description": "The ID of requested Anywhere Cache instance.", + "location": "path", + "required": true, + "type": "string" + }, + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/resume", + "response": { + "$ref": "AnywhereCache" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "update": { + "description": "Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance.", + "httpMethod": "PATCH", + "id": "storage.anywhereCaches.update", + "parameterOrder": [ + "bucket", + "anywhereCacheId" + ], + "parameters": { + "anywhereCacheId": { + "description": "The ID of requested Anywhere Cache instance.", + "location": "path", + "required": true, + "type": "string" + }, + "bucket": { + "description": "Name of the partent bucket", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", + "request": { + "$ref": "AnywhereCache" + }, + "response": { + "$ref": "GoogleLongrunningOperation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + } + } + }, "bucketAccessControls": { "methods": { "delete": { @@ -3563,9 +3799,87 @@ } } }, - "revision": "20231012", + "revision": "20231028", "rootUrl": "https://storage.googleapis.com/", "schemas": { + "AnywhereCache": { + "description": "An Anywhere Cache instance.", + "id": "AnywhereCache", + "properties": { + "admissionPolicy": { + "description": "The cache-level entry admission policy.", + "type": "string" + }, + "anywhereCacheId": { + "description": "The ID of the Anywhere cache instance.", + "type": "string" + }, + "bucket": { + "description": "The name of the bucket containing this cache instance.", + "type": "string" + }, + "createTime": { + "description": "The creation time of the cache instance in RFC 3339 format.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the resource, including the project number, bucket name and anywhere cache ID.", + "type": "string" + }, + "kind": { + "default": "storage#anywhereCache", + "description": "The kind of item this is. For Anywhere Cache, this is always storage#anywhereCache.", + "type": "string" + }, + "pendingUpdate": { + "description": "True if the cache instance has an active Update long-running operation.", + "type": "boolean" + }, + "selfLink": { + "description": "The link to this cache instance.", + "type": "string" + }, + "state": { + "description": "The current state of the cache instance.", + "type": "string" + }, + "ttl": { + "description": "The TTL of all cache entries in whole seconds. e.g., \"7200s\". ", + "format": "google-duration", + "type": "string" + }, + "updateTime": { + "description": "The modification time of the cache instance metadata in RFC 3339 format.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "AnywhereCaches": { + "description": "A list of Anywhere Caches.", + "id": "AnywhereCaches", + "properties": { + "items": { + "description": "The list of items.", + "items": { + "$ref": "AnywhereCache" + }, + "type": "array" + }, + "kind": { + "default": "storage#anywhereCaches", + "description": "The kind of item this is. For lists of Anywhere Caches, this is always storage#anywhereCaches.", + "type": "string" + }, + "nextPageToken": { + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.", + "type": "string" + } + }, + "type": "object" + }, "Bucket": { "description": "A bucket.", "id": "Bucket", @@ -3951,7 +4265,7 @@ "type": "string" }, "retentionDurationSeconds": { - "description": "The period of time in seconds, that soft-deleted objects in the bucket will be retained and cannot be permanently deleted.", + "description": "The duration in seconds that soft-deleted objects in the bucket will be retained and cannot be permanently deleted.", "format": "int64", "type": "string" } diff --git a/vendor/google.golang.org/api/storage/v1/storage-gen.go b/vendor/google.golang.org/api/storage/v1/storage-gen.go index 2b2aa81ec0..90320fcc0b 100644 --- a/vendor/google.golang.org/api/storage/v1/storage-gen.go +++ b/vendor/google.golang.org/api/storage/v1/storage-gen.go @@ -155,6 +155,7 @@ func New(client *http.Client) (*Service, error) { return nil, errors.New("client is nil") } s := &Service{client: client, BasePath: basePath} + s.AnywhereCache = NewAnywhereCacheService(s) s.BucketAccessControls = NewBucketAccessControlsService(s) s.Buckets = NewBucketsService(s) s.Channels = NewChannelsService(s) @@ -173,6 +174,8 @@ type Service struct { BasePath string // API endpoint base URL UserAgent string // optional additional User-Agent fragment + AnywhereCache *AnywhereCacheService + BucketAccessControls *BucketAccessControlsService Buckets *BucketsService @@ -201,6 +204,15 @@ func (s *Service) userAgent() string { return googleapi.UserAgent + " " + s.UserAgent } +func NewAnywhereCacheService(s *Service) *AnywhereCacheService { + rs := &AnywhereCacheService{s: s} + return rs +} + +type AnywhereCacheService struct { + s *Service +} + func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService { rs := &BucketAccessControlsService{s: s} return rs @@ -315,6 +327,115 @@ type ProjectsServiceAccountService struct { s *Service } +// AnywhereCache: An Anywhere Cache instance. +type AnywhereCache struct { + // AdmissionPolicy: The cache-level entry admission policy. + AdmissionPolicy string `json:"admissionPolicy,omitempty"` + + // AnywhereCacheId: The ID of the Anywhere cache instance. + AnywhereCacheId string `json:"anywhereCacheId,omitempty"` + + // Bucket: The name of the bucket containing this cache instance. + Bucket string `json:"bucket,omitempty"` + + // CreateTime: The creation time of the cache instance in RFC 3339 + // format. + CreateTime string `json:"createTime,omitempty"` + + // Id: The ID of the resource, including the project number, bucket name + // and anywhere cache ID. + Id string `json:"id,omitempty"` + + // Kind: The kind of item this is. For Anywhere Cache, this is always + // storage#anywhereCache. + Kind string `json:"kind,omitempty"` + + // PendingUpdate: True if the cache instance has an active Update + // long-running operation. + PendingUpdate bool `json:"pendingUpdate,omitempty"` + + // SelfLink: The link to this cache instance. + SelfLink string `json:"selfLink,omitempty"` + + // State: The current state of the cache instance. + State string `json:"state,omitempty"` + + // Ttl: The TTL of all cache entries in whole seconds. e.g., "7200s". + Ttl string `json:"ttl,omitempty"` + + // UpdateTime: The modification time of the cache instance metadata in + // RFC 3339 format. + UpdateTime string `json:"updateTime,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AdmissionPolicy") to + // unconditionally include in API requests. By default, fields with + // empty or default values are omitted from API requests. However, any + // non-pointer, non-interface field appearing in ForceSendFields will be + // sent to the server regardless of whether the field is empty or not. + // This may be used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AdmissionPolicy") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AnywhereCache) MarshalJSON() ([]byte, error) { + type NoMethod AnywhereCache + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AnywhereCaches: A list of Anywhere Caches. +type AnywhereCaches struct { + // Items: The list of items. + Items []*AnywhereCache `json:"items,omitempty"` + + // Kind: The kind of item this is. For lists of Anywhere Caches, this is + // always storage#anywhereCaches. + Kind string `json:"kind,omitempty"` + + // NextPageToken: The continuation token, used to page through large + // result sets. Provide this value in a subsequent request to return the + // next page of results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty or default values are omitted from API requests. However, any + // non-pointer, non-interface field appearing in ForceSendFields will be + // sent to the server regardless of whether the field is empty or not. + // This may be used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AnywhereCaches) MarshalJSON() ([]byte, error) { + type NoMethod AnywhereCaches + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Bucket: A bucket. type Bucket struct { // Acl: Access controls on the bucket. @@ -1120,9 +1241,9 @@ type BucketSoftDeletePolicy struct { // This value is in RFC 3339 format. EffectiveTime string `json:"effectiveTime,omitempty"` - // RetentionDurationSeconds: The period of time in seconds, that - // soft-deleted objects in the bucket will be retained and cannot be - // permanently deleted. + // RetentionDurationSeconds: The duration in seconds that soft-deleted + // objects in the bucket will be retained and cannot be permanently + // deleted. RetentionDurationSeconds int64 `json:"retentionDurationSeconds,omitempty,string"` // ForceSendFields is a list of field names (e.g. "EffectiveTime") to @@ -2944,6 +3065,1087 @@ func (s *TestIamPermissionsResponse) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// method id "storage.anywhereCaches.disable": + +type AnywhereCacheDisableCall struct { + s *Service + bucket string + anywhereCacheId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Disable: Disables an Anywhere Cache instance. +// +// - anywhereCacheId: The ID of requested Anywhere Cache instance. +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Disable(bucket string, anywhereCacheId string) *AnywhereCacheDisableCall { + c := &AnywhereCacheDisableCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywhereCacheId = anywhereCacheId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheDisableCall) Fields(s ...googleapi.Field) *AnywhereCacheDisableCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheDisableCall) Context(ctx context.Context) *AnywhereCacheDisableCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheDisableCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheDisableCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches/{anywhereCacheId}/disable") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + "anywhereCacheId": c.anywhereCacheId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.disable" call. +// Exactly one of *AnywhereCache or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AnywhereCache.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheDisableCall) Do(opts ...googleapi.CallOption) (*AnywhereCache, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &AnywhereCache{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Disables an Anywhere Cache instance.", + // "httpMethod": "POST", + // "id": "storage.anywhereCaches.disable", + // "parameterOrder": [ + // "bucket", + // "anywhereCacheId" + // ], + // "parameters": { + // "anywhereCacheId": { + // "description": "The ID of requested Anywhere Cache instance.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/disable", + // "response": { + // "$ref": "AnywhereCache" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// method id "storage.anywhereCaches.get": + +type AnywhereCacheGetCall struct { + s *Service + bucket string + anywhereCacheId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the metadata of an Anywhere Cache instance. +// +// - anywhereCacheId: The ID of requested Anywhere Cache instance. +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Get(bucket string, anywhereCacheId string) *AnywhereCacheGetCall { + c := &AnywhereCacheGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywhereCacheId = anywhereCacheId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheGetCall) Fields(s ...googleapi.Field) *AnywhereCacheGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *AnywhereCacheGetCall) IfNoneMatch(entityTag string) *AnywhereCacheGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheGetCall) Context(ctx context.Context) *AnywhereCacheGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches/{anywhereCacheId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + "anywhereCacheId": c.anywhereCacheId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.get" call. +// Exactly one of *AnywhereCache or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AnywhereCache.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheGetCall) Do(opts ...googleapi.CallOption) (*AnywhereCache, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &AnywhereCache{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the metadata of an Anywhere Cache instance.", + // "httpMethod": "GET", + // "id": "storage.anywhereCaches.get", + // "parameterOrder": [ + // "bucket", + // "anywhereCacheId" + // ], + // "parameters": { + // "anywhereCacheId": { + // "description": "The ID of requested Anywhere Cache instance.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", + // "response": { + // "$ref": "AnywhereCache" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/cloud-platform.read-only", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_only", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// method id "storage.anywhereCaches.insert": + +type AnywhereCacheInsertCall struct { + s *Service + bucket string + anywherecache *AnywhereCache + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates an Anywhere Cache instance. +// +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Insert(bucket string, anywherecache *AnywhereCache) *AnywhereCacheInsertCall { + c := &AnywhereCacheInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywherecache = anywherecache + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheInsertCall) Fields(s ...googleapi.Field) *AnywhereCacheInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheInsertCall) Context(ctx context.Context) *AnywhereCacheInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.anywherecache) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.insert" call. +// Exactly one of *GoogleLongrunningOperation or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *GoogleLongrunningOperation.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheInsertCall) Do(opts ...googleapi.CallOption) (*GoogleLongrunningOperation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &GoogleLongrunningOperation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates an Anywhere Cache instance.", + // "httpMethod": "POST", + // "id": "storage.anywhereCaches.insert", + // "parameterOrder": [ + // "bucket" + // ], + // "parameters": { + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches", + // "request": { + // "$ref": "AnywhereCache" + // }, + // "response": { + // "$ref": "GoogleLongrunningOperation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// method id "storage.anywhereCaches.list": + +type AnywhereCacheListCall struct { + s *Service + bucket string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Returns a list of Anywhere Cache instances of the bucket +// matching the criteria. +// +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) List(bucket string) *AnywhereCacheListCall { + c := &AnywhereCacheListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + return c +} + +// PageSize sets the optional parameter "pageSize": Maximum number of +// items return in a single page of responses. Maximum 1000. +func (c *AnywhereCacheListCall) PageSize(pageSize int64) *AnywhereCacheListCall { + c.urlParams_.Set("pageSize", fmt.Sprint(pageSize)) + return c +} + +// PageToken sets the optional parameter "pageToken": A +// previously-returned page token representing part of the larger set of +// results to view. +func (c *AnywhereCacheListCall) PageToken(pageToken string) *AnywhereCacheListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheListCall) Fields(s ...googleapi.Field) *AnywhereCacheListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *AnywhereCacheListCall) IfNoneMatch(entityTag string) *AnywhereCacheListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheListCall) Context(ctx context.Context) *AnywhereCacheListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCache") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.list" call. +// Exactly one of *AnywhereCaches or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AnywhereCaches.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheListCall) Do(opts ...googleapi.CallOption) (*AnywhereCaches, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &AnywhereCaches{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns a list of Anywhere Cache instances of the bucket matching the criteria.", + // "httpMethod": "GET", + // "id": "storage.anywhereCaches.list", + // "parameterOrder": [ + // "bucket" + // ], + // "parameters": { + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "pageSize": { + // "description": "Maximum number of items return in a single page of responses. Maximum 1000.", + // "format": "int32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "pageToken": { + // "description": "A previously-returned page token representing part of the larger set of results to view.", + // "location": "query", + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCache", + // "response": { + // "$ref": "AnywhereCaches" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/cloud-platform.read-only", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_only", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *AnywhereCacheListCall) Pages(ctx context.Context, f func(*AnywhereCaches) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "storage.anywhereCaches.pause": + +type AnywhereCachePauseCall struct { + s *Service + bucket string + anywhereCacheId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Pause: Pauses an Anywhere Cache instance. +// +// - anywhereCacheId: The ID of requested Anywhere Cache instance. +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Pause(bucket string, anywhereCacheId string) *AnywhereCachePauseCall { + c := &AnywhereCachePauseCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywhereCacheId = anywhereCacheId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCachePauseCall) Fields(s ...googleapi.Field) *AnywhereCachePauseCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCachePauseCall) Context(ctx context.Context) *AnywhereCachePauseCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCachePauseCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCachePauseCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches/{anywhereCacheId}/pause") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + "anywhereCacheId": c.anywhereCacheId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.pause" call. +// Exactly one of *AnywhereCache or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AnywhereCache.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCachePauseCall) Do(opts ...googleapi.CallOption) (*AnywhereCache, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &AnywhereCache{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Pauses an Anywhere Cache instance.", + // "httpMethod": "POST", + // "id": "storage.anywhereCaches.pause", + // "parameterOrder": [ + // "bucket", + // "anywhereCacheId" + // ], + // "parameters": { + // "anywhereCacheId": { + // "description": "The ID of requested Anywhere Cache instance.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/pause", + // "response": { + // "$ref": "AnywhereCache" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// method id "storage.anywhereCaches.resume": + +type AnywhereCacheResumeCall struct { + s *Service + bucket string + anywhereCacheId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Resume: Resumes a paused or disabled Anywhere Cache instance. +// +// - anywhereCacheId: The ID of requested Anywhere Cache instance. +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Resume(bucket string, anywhereCacheId string) *AnywhereCacheResumeCall { + c := &AnywhereCacheResumeCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywhereCacheId = anywhereCacheId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheResumeCall) Fields(s ...googleapi.Field) *AnywhereCacheResumeCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheResumeCall) Context(ctx context.Context) *AnywhereCacheResumeCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheResumeCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheResumeCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches/{anywhereCacheId}/resume") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + "anywhereCacheId": c.anywhereCacheId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.resume" call. +// Exactly one of *AnywhereCache or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AnywhereCache.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheResumeCall) Do(opts ...googleapi.CallOption) (*AnywhereCache, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &AnywhereCache{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Resumes a paused or disabled Anywhere Cache instance.", + // "httpMethod": "POST", + // "id": "storage.anywhereCaches.resume", + // "parameterOrder": [ + // "bucket", + // "anywhereCacheId" + // ], + // "parameters": { + // "anywhereCacheId": { + // "description": "The ID of requested Anywhere Cache instance.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/resume", + // "response": { + // "$ref": "AnywhereCache" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + +// method id "storage.anywhereCaches.update": + +type AnywhereCacheUpdateCall struct { + s *Service + bucket string + anywhereCacheId string + anywherecache *AnywhereCache + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates the config(ttl and admissionPolicy) of an Anywhere +// Cache instance. +// +// - anywhereCacheId: The ID of requested Anywhere Cache instance. +// - bucket: Name of the partent bucket. +func (r *AnywhereCacheService) Update(bucket string, anywhereCacheId string, anywherecache *AnywhereCache) *AnywhereCacheUpdateCall { + c := &AnywhereCacheUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.bucket = bucket + c.anywhereCacheId = anywhereCacheId + c.anywherecache = anywherecache + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AnywhereCacheUpdateCall) Fields(s ...googleapi.Field) *AnywhereCacheUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AnywhereCacheUpdateCall) Context(ctx context.Context) *AnywhereCacheUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AnywhereCacheUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AnywhereCacheUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/"+internal.Version) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.anywherecache) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/anywhereCaches/{anywhereCacheId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "bucket": c.bucket, + "anywhereCacheId": c.anywhereCacheId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "storage.anywhereCaches.update" call. +// Exactly one of *GoogleLongrunningOperation or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *GoogleLongrunningOperation.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AnywhereCacheUpdateCall) Do(opts ...googleapi.CallOption) (*GoogleLongrunningOperation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, gensupport.WrapError(&googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + }) + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, gensupport.WrapError(err) + } + ret := &GoogleLongrunningOperation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance.", + // "httpMethod": "PATCH", + // "id": "storage.anywhereCaches.update", + // "parameterOrder": [ + // "bucket", + // "anywhereCacheId" + // ], + // "parameters": { + // "anywhereCacheId": { + // "description": "The ID of requested Anywhere Cache instance.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "bucket": { + // "description": "Name of the partent bucket", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", + // "request": { + // "$ref": "AnywhereCache" + // }, + // "response": { + // "$ref": "GoogleLongrunningOperation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_write" + // ] + // } + +} + // method id "storage.bucketAccessControls.delete": type BucketAccessControlsDeleteCall struct { diff --git a/vendor/google.golang.org/api/transport/grpc/dial.go b/vendor/google.golang.org/api/transport/grpc/dial.go index e36d7589ee..87a22f7586 100644 --- a/vendor/google.golang.org/api/transport/grpc/dial.go +++ b/vendor/google.golang.org/api/transport/grpc/dial.go @@ -14,10 +14,12 @@ import ( "net" "os" "strings" + "time" "cloud.google.com/go/compute/metadata" "go.opencensus.io/plugin/ocgrpc" "golang.org/x/oauth2" + "golang.org/x/time/rate" "google.golang.org/api/internal" "google.golang.org/api/option" "google.golang.org/grpc" @@ -38,6 +40,9 @@ const enableDirectPathXds = "GOOGLE_CLOUD_ENABLE_DIRECT_PATH_XDS" // Set at init time by dial_socketopt.go. If nil, socketopt is not supported. var timeoutDialerOption grpc.DialOption +// Log rate limiter +var logRateLimiter = rate.Sometimes{Interval: 1 * time.Second} + // Dial returns a GRPC connection for use communicating with a Google cloud // service, configured with the given ClientOptions. func Dial(ctx context.Context, opts ...option.ClientOption) (*grpc.ClientConn, error) { @@ -153,6 +158,9 @@ func dial(ctx context.Context, insecure bool, o *internal.DialSettings) (*grpc.C ) // Attempt Direct Path: + logRateLimiter.Do(func() { + logDirectPathMisconfig(endpoint, creds.TokenSource, o) + }) if isDirectPathEnabled(endpoint, o) && isTokenSourceDirectPathCompatible(creds.TokenSource, o) && metadata.OnGCE() { // Overwrite all of the previously specific DialOptions, DirectPath uses its own set of credentials and certificates. grpcOpts = []grpc.DialOption{ @@ -296,6 +304,24 @@ func checkDirectPathEndPoint(endpoint string) bool { return true } +func logDirectPathMisconfig(endpoint string, ts oauth2.TokenSource, o *internal.DialSettings) { + if isDirectPathXdsUsed(o) { + // Case 1: does not enable DirectPath + if !isDirectPathEnabled(endpoint, o) { + log.Println("WARNING: DirectPath is misconfigured. Please set the EnableDirectPath option along with the EnableDirectPathXds option.") + } else { + // Case 2: credential is not correctly set + if !isTokenSourceDirectPathCompatible(ts, o) { + log.Println("WARNING: DirectPath is misconfigured. Please make sure the token source is fetched from GCE metadata server and the default service account is used.") + } + // Case 3: not running on GCE + if !metadata.OnGCE() { + log.Println("WARNING: DirectPath is misconfigured. DirectPath is only available in a GCE environment.") + } + } + } +} + func processAndValidateOpts(opts []option.ClientOption) (*internal.DialSettings, error) { var o internal.DialSettings for _, opt := range opts { diff --git a/vendor/modules.txt b/vendor/modules.txt index ce15fbd925..7dbf272ff8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -14,13 +14,13 @@ cloud.google.com/go/compute/metadata ## explicit; go 1.19 cloud.google.com/go/iam cloud.google.com/go/iam/apiv1/iampb -# cloud.google.com/go/storage v1.34.1 +# cloud.google.com/go/storage v1.35.1 ## explicit; go 1.19 cloud.google.com/go/storage cloud.google.com/go/storage/internal cloud.google.com/go/storage/internal/apiv2 cloud.google.com/go/storage/internal/apiv2/storagepb -# github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 +# github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 ## explicit; go 1.18 github.com/Azure/azure-sdk-for-go/sdk/azcore github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud @@ -29,6 +29,7 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body +github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared @@ -109,7 +110,7 @@ github.com/VividCortex/ewma # github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 ## explicit; go 1.15 github.com/alecthomas/units -# github.com/aws/aws-sdk-go v1.47.2 +# github.com/aws/aws-sdk-go v1.47.9 ## explicit; go 1.19 github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/auth/bearer @@ -153,7 +154,7 @@ github.com/aws/aws-sdk-go/service/sso/ssoiface github.com/aws/aws-sdk-go/service/ssooidc github.com/aws/aws-sdk-go/service/sts github.com/aws/aws-sdk-go/service/sts/stsiface -# github.com/aws/aws-sdk-go-v2 v1.22.1 +# github.com/aws/aws-sdk-go-v2 v1.22.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2 github.com/aws/aws-sdk-go-v2/aws @@ -182,10 +183,10 @@ github.com/aws/aws-sdk-go-v2/internal/timeconv ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi -# github.com/aws/aws-sdk-go-v2/config v1.22.0 +# github.com/aws/aws-sdk-go-v2/config v1.23.0 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.15.1 +# github.com/aws/aws-sdk-go-v2/credentials v1.15.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds @@ -194,23 +195,23 @@ github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.1 +# github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/feature/s3/manager -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 -# github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 +# github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/internal/ini -# github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.1 +# github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/internal/v4a github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto @@ -218,35 +219,35 @@ github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4 # github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding -# github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.1 +# github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/internal/checksum -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.1 +# github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/internal/s3shared github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config -# github.com/aws/aws-sdk-go-v2/service/s3 v1.42.0 +# github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/s3 github.com/aws/aws-sdk-go-v2/service/s3/internal/arn github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations github.com/aws/aws-sdk-go-v2/service/s3/internal/endpoints github.com/aws/aws-sdk-go-v2/service/s3/types -# github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 +# github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 +# github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 ## explicit; go 1.19 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints @@ -296,10 +297,10 @@ github.com/davecgh/go-spew/spew # github.com/dennwc/varint v1.0.0 ## explicit; go 1.12 github.com/dennwc/varint -# github.com/fatih/color v1.15.0 +# github.com/fatih/color v1.16.0 ## explicit; go 1.17 github.com/fatih/color -# github.com/felixge/httpsnoop v1.0.3 +# github.com/felixge/httpsnoop v1.0.4 ## explicit; go 1.13 github.com/felixge/httpsnoop # github.com/go-kit/log v0.2.1 @@ -324,7 +325,7 @@ github.com/gogo/protobuf/proto github.com/gogo/protobuf/protoc-gen-gogo/descriptor github.com/gogo/protobuf/sortkeys github.com/gogo/protobuf/types -# github.com/golang-jwt/jwt/v5 v5.0.0 +# github.com/golang-jwt/jwt/v5 v5.1.0 ## explicit; go 1.18 github.com/golang-jwt/jwt/v5 # github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da @@ -590,11 +591,11 @@ go.opentelemetry.io/collector/pdata/pmetric/pmetricotlp # go.opentelemetry.io/collector/semconv v0.88.0 ## explicit; go 1.20 go.opentelemetry.io/collector/semconv/v1.6.1 -# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 -## explicit; go 1.19 +# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 +## explicit; go 1.20 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil -# go.opentelemetry.io/otel v1.19.0 +# go.opentelemetry.io/otel v1.20.0 ## explicit; go 1.20 go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute @@ -606,13 +607,14 @@ go.opentelemetry.io/otel/internal/baggage go.opentelemetry.io/otel/internal/global go.opentelemetry.io/otel/propagation go.opentelemetry.io/otel/semconv/v1.17.0 -# go.opentelemetry.io/otel/metric v1.19.0 +# go.opentelemetry.io/otel/metric v1.20.0 ## explicit; go 1.20 go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/embedded -# go.opentelemetry.io/otel/trace v1.19.0 +# go.opentelemetry.io/otel/trace v1.20.0 ## explicit; go 1.20 go.opentelemetry.io/otel/trace +go.opentelemetry.io/otel/trace/embedded # go.uber.org/atomic v1.11.0 ## explicit; go 1.18 go.uber.org/atomic @@ -623,8 +625,8 @@ go.uber.org/goleak/internal/stack # go.uber.org/multierr v1.11.0 ## explicit; go 1.19 go.uber.org/multierr -# golang.org/x/crypto v0.14.0 -## explicit; go 1.17 +# golang.org/x/crypto v0.15.0 +## explicit; go 1.18 golang.org/x/crypto/chacha20 golang.org/x/crypto/chacha20poly1305 golang.org/x/crypto/cryptobyte @@ -634,12 +636,12 @@ golang.org/x/crypto/internal/alias golang.org/x/crypto/internal/poly1305 golang.org/x/crypto/pkcs12 golang.org/x/crypto/pkcs12/internal/rc2 -# golang.org/x/exp v0.0.0-20231006140011-7918f672742d => golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 +# golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa => golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 ## explicit; go 1.20 golang.org/x/exp/constraints golang.org/x/exp/slices -# golang.org/x/net v0.17.0 -## explicit; go 1.17 +# golang.org/x/net v0.18.0 +## explicit; go 1.18 golang.org/x/net/http/httpguts golang.org/x/net/http/httpproxy golang.org/x/net/http2 @@ -649,7 +651,7 @@ golang.org/x/net/internal/socks golang.org/x/net/internal/timeseries golang.org/x/net/proxy golang.org/x/net/trace -# golang.org/x/oauth2 v0.13.0 +# golang.org/x/oauth2 v0.14.0 ## explicit; go 1.18 golang.org/x/oauth2 golang.org/x/oauth2/authhandler @@ -661,29 +663,29 @@ golang.org/x/oauth2/google/internal/stsexchange golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sync v0.4.0 -## explicit; go 1.17 +# golang.org/x/sync v0.5.0 +## explicit; go 1.18 golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.13.0 -## explicit; go 1.17 +# golang.org/x/sys v0.14.0 +## explicit; go 1.18 golang.org/x/sys/cpu golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/text v0.13.0 -## explicit; go 1.17 +# golang.org/x/text v0.14.0 +## explicit; go 1.18 golang.org/x/text/secure/bidirule golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm -# golang.org/x/time v0.3.0 -## explicit +# golang.org/x/time v0.4.0 +## explicit; go 1.18 golang.org/x/time/rate # golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 ## explicit; go 1.18 golang.org/x/xerrors golang.org/x/xerrors/internal -# google.golang.org/api v0.149.0 +# google.golang.org/api v0.150.0 ## explicit; go 1.19 google.golang.org/api/googleapi google.golang.org/api/googleapi/transport @@ -713,16 +715,16 @@ google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 +# google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 ## explicit; go 1.19 google.golang.org/genproto/googleapis/type/date google.golang.org/genproto/googleapis/type/expr google.golang.org/genproto/internal -# google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 +# google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 ## explicit; go 1.19 google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/api/annotations -# google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 +# google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 ## explicit; go 1.19 google.golang.org/genproto/googleapis/rpc/code google.golang.org/genproto/googleapis/rpc/errdetails From cf23dc6480f77b79de500f145135a8f7be0ac065 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 19:12:51 +0100 Subject: [PATCH 37/48] all: cleanup: remove `// +build ...` lines, since they are no longer needed after Go1.17, and the minimum supported Go version for VictoriaMetrics source code is Go1.20 --- app/vmctl/terminal/unix.go | 1 - app/vmctl/terminal/unix_bsd.go | 1 - app/vmctl/terminal/windows..go | 1 - app/vmselect/promql/tzdata.go | 1 - lib/encoding/encoding_cgo_test.go | 1 - lib/encoding/encoding_pure_test.go | 1 - lib/encoding/zstd/zstd_cgo.go | 1 - lib/encoding/zstd/zstd_pure.go | 1 - lib/encoding/zstd/zstd_test.go | 1 - lib/fs/fadvise_unix.go | 1 - lib/fs/fs_nix.go | 1 - lib/fs/fs_unix.go | 1 - lib/logger/tzdata.go | 1 - lib/memory/memory_bsd.go | 1 - lib/memory/sysctl.go | 1 - lib/procutil/signal.go | 1 - lib/procutil/signal_windows.go | 1 - 17 files changed, 17 deletions(-) diff --git a/app/vmctl/terminal/unix.go b/app/vmctl/terminal/unix.go index ad8e64b07c..1b3417d985 100644 --- a/app/vmctl/terminal/unix.go +++ b/app/vmctl/terminal/unix.go @@ -1,5 +1,4 @@ //go:build aix || linux || solaris || zos -// +build aix linux solaris zos package terminal diff --git a/app/vmctl/terminal/unix_bsd.go b/app/vmctl/terminal/unix_bsd.go index d46146ca88..1b65edd1ff 100644 --- a/app/vmctl/terminal/unix_bsd.go +++ b/app/vmctl/terminal/unix_bsd.go @@ -1,5 +1,4 @@ //go:build darwin || freebsd || openbsd -// +build darwin freebsd openbsd package terminal diff --git a/app/vmctl/terminal/windows..go b/app/vmctl/terminal/windows..go index c3af23e406..5e9c8c4d02 100644 --- a/app/vmctl/terminal/windows..go +++ b/app/vmctl/terminal/windows..go @@ -1,5 +1,4 @@ //go:build windows -// +build windows package terminal diff --git a/app/vmselect/promql/tzdata.go b/app/vmselect/promql/tzdata.go index f2e2b48041..f64b3472db 100644 --- a/app/vmselect/promql/tzdata.go +++ b/app/vmselect/promql/tzdata.go @@ -1,5 +1,4 @@ //go:build go1.15 -// +build go1.15 package promql diff --git a/lib/encoding/encoding_cgo_test.go b/lib/encoding/encoding_cgo_test.go index b6f0f6d891..738c3206a3 100644 --- a/lib/encoding/encoding_cgo_test.go +++ b/lib/encoding/encoding_cgo_test.go @@ -1,5 +1,4 @@ //go:build cgo -// +build cgo package encoding diff --git a/lib/encoding/encoding_pure_test.go b/lib/encoding/encoding_pure_test.go index ba3e40f130..befd6db063 100644 --- a/lib/encoding/encoding_pure_test.go +++ b/lib/encoding/encoding_pure_test.go @@ -1,5 +1,4 @@ //go:build !cgo -// +build !cgo package encoding diff --git a/lib/encoding/zstd/zstd_cgo.go b/lib/encoding/zstd/zstd_cgo.go index b38a48e429..0917f0e219 100644 --- a/lib/encoding/zstd/zstd_cgo.go +++ b/lib/encoding/zstd/zstd_cgo.go @@ -1,5 +1,4 @@ //go:build cgo -// +build cgo package zstd diff --git a/lib/encoding/zstd/zstd_pure.go b/lib/encoding/zstd/zstd_pure.go index a6aa98056b..93c73b1565 100644 --- a/lib/encoding/zstd/zstd_pure.go +++ b/lib/encoding/zstd/zstd_pure.go @@ -1,5 +1,4 @@ //go:build !cgo -// +build !cgo package zstd diff --git a/lib/encoding/zstd/zstd_test.go b/lib/encoding/zstd/zstd_test.go index 124b60e1ae..17f2a91015 100644 --- a/lib/encoding/zstd/zstd_test.go +++ b/lib/encoding/zstd/zstd_test.go @@ -1,5 +1,4 @@ //go:build cgo -// +build cgo package zstd diff --git a/lib/fs/fadvise_unix.go b/lib/fs/fadvise_unix.go index b0d4bdf71e..2f61615fb1 100644 --- a/lib/fs/fadvise_unix.go +++ b/lib/fs/fadvise_unix.go @@ -1,5 +1,4 @@ //go:build linux || freebsd -// +build linux freebsd package fs diff --git a/lib/fs/fs_nix.go b/lib/fs/fs_nix.go index 8e6694373c..fed424edb3 100644 --- a/lib/fs/fs_nix.go +++ b/lib/fs/fs_nix.go @@ -1,5 +1,4 @@ //go:build linux || darwin || freebsd -// +build linux darwin freebsd package fs diff --git a/lib/fs/fs_unix.go b/lib/fs/fs_unix.go index daa746e6af..c7308fa378 100644 --- a/lib/fs/fs_unix.go +++ b/lib/fs/fs_unix.go @@ -1,5 +1,4 @@ //go:build linux || darwin || freebsd || openbsd -// +build linux darwin freebsd openbsd package fs diff --git a/lib/logger/tzdata.go b/lib/logger/tzdata.go index d2efe9f0d1..7788e60d18 100644 --- a/lib/logger/tzdata.go +++ b/lib/logger/tzdata.go @@ -1,5 +1,4 @@ //go:build go1.15 -// +build go1.15 package logger diff --git a/lib/memory/memory_bsd.go b/lib/memory/memory_bsd.go index 4955ef6e93..d785346009 100644 --- a/lib/memory/memory_bsd.go +++ b/lib/memory/memory_bsd.go @@ -1,5 +1,4 @@ //go:build freebsd || openbsd || dragonfly || netbsd -// +build freebsd openbsd dragonfly netbsd package memory diff --git a/lib/memory/sysctl.go b/lib/memory/sysctl.go index 1c31e09789..d9934312be 100644 --- a/lib/memory/sysctl.go +++ b/lib/memory/sysctl.go @@ -1,5 +1,4 @@ //go:build darwin || freebsd || openbsd || dragonfly || netbsd -// +build darwin freebsd openbsd dragonfly netbsd package memory diff --git a/lib/procutil/signal.go b/lib/procutil/signal.go index 97439850e1..d9469bd4e1 100644 --- a/lib/procutil/signal.go +++ b/lib/procutil/signal.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows package procutil diff --git a/lib/procutil/signal_windows.go b/lib/procutil/signal_windows.go index 1a1d32e0ac..9c83af3f04 100644 --- a/lib/procutil/signal_windows.go +++ b/lib/procutil/signal_windows.go @@ -1,5 +1,4 @@ //go:build windows -// +build windows package procutil From 8af56ea2edd68cabaf7c369741d7523571dfb1e5 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Nov 2023 20:13:50 +0100 Subject: [PATCH 38/48] lib/htmlcomponents: use relative links for the top page and for favicon.ico This allows hiding VictoriaMetrics components behind proxies with arbitrary path prefixes. For example, vmagent HTTP handlers can be served via /vmagent/ path prefix: - http://proxy/vmagent/targets - http://proxy/vmagent/service-discovery The path prefix can be arbitrary. For example, below are vmagent urls for /tenantID/vmagent/ path prefix: - http://proxy/tenantID/vmagent/targets - http://proxy/tenantID/vmagent/service-discovery While at it, consistently serve favicon.ico from any path directory. Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5306 Updates https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5307 --- app/vmui/packages/vmui/public/favicon.ico | Bin 15086 -> 0 bytes docs/CHANGELOG.md | 1 + lib/htmlcomponents/components.qtpl | 3 +- lib/htmlcomponents/components.qtpl.go | 94 +++++++++--------- .../vmui => lib/httpserver}/favicon.ico | Bin lib/httpserver/httpserver.go | 16 ++- 6 files changed, 61 insertions(+), 53 deletions(-) delete mode 100644 app/vmui/packages/vmui/public/favicon.ico rename {app/vmselect/vmui => lib/httpserver}/favicon.ico (100%) diff --git a/app/vmui/packages/vmui/public/favicon.ico b/app/vmui/packages/vmui/public/favicon.ico deleted file mode 100644 index efeb4570290716d4e69698fcb9751434b8789197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 + {% endfunc %} // Navbar writes navigation bar for /targets-like pages {% func Navbar() %}