diff --git a/Makefile b/Makefile index 40d833a03b..007a2bfa78 100644 --- a/Makefile +++ b/Makefile @@ -434,7 +434,7 @@ benchmark-pure: vendor-update: go get -u -d ./lib/... go get -u -d ./app/... - go mod tidy -compat=1.20 + go mod tidy -compat=1.22 go mod vendor app-local: diff --git a/app/vmagent/README.md b/app/vmagent/README.md index e574715895..ccc5886526 100644 --- a/app/vmagent/README.md +++ b/app/vmagent/README.md @@ -1130,7 +1130,7 @@ It may be needed to build `vmagent` from source code when developing or testing ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmagent` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds the `vmagent` binary and puts it into the `bin` folder. @@ -1159,7 +1159,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b ### Development ARM build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmagent-linux-arm` or `make vmagent-linux-arm64` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics) It builds `vmagent-linux-arm` or `vmagent-linux-arm64` binary respectively and puts it into the `bin` folder. diff --git a/app/vmalert/README.md b/app/vmalert/README.md index 3c38f2df0f..d395352a06 100644 --- a/app/vmalert/README.md +++ b/app/vmalert/README.md @@ -1515,7 +1515,7 @@ spec: ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmalert` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmalert` binary and puts it into the `bin` folder. @@ -1531,7 +1531,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b ### Development ARM build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmalert-linux-arm` or `make vmalert-linux-arm64` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmalert-linux-arm` or `vmalert-linux-arm64` binary respectively and puts it into the `bin` folder. diff --git a/app/vmalert/datasource/vm.go b/app/vmalert/datasource/vm.go index 2a4d1b74e2..ff1e1caa0d 100644 --- a/app/vmalert/datasource/vm.go +++ b/app/vmalert/datasource/vm.go @@ -134,14 +134,21 @@ func NewVMStorage(baseURL string, authCfg *promauth.Config, lookBack time.Durati // Query executes the given query and returns parsed response func (s *VMStorage) Query(ctx context.Context, query string, ts time.Time) (Result, *http.Request, error) { - req := s.newQueryRequest(query, ts) - resp, err := s.do(ctx, req) - if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { - // something in the middle between client and datasource might be closing - // the connection. So we do a one more attempt in hope request will succeed. - req = s.newQueryRequest(query, ts) - resp, err = s.do(ctx, req) + req, err := s.newRequestPOST() + if err != nil { + return Result{}, nil, err } + + switch s.dataSourceType { + case "", datasourcePrometheus: + s.setPrometheusInstantReqParams(req, query, ts) + case datasourceGraphite: + s.setGraphiteReqParams(req, query, ts) + default: + return Result{}, nil, fmt.Errorf("engine not found: %q", s.dataSourceType) + } + + resp, err := s.do(ctx, req) if err != nil { return Result{}, req, err } @@ -164,20 +171,18 @@ func (s *VMStorage) QueryRange(ctx context.Context, query string, start, end tim if s.dataSourceType != datasourcePrometheus { return res, fmt.Errorf("%q is not supported for QueryRange", s.dataSourceType) } + req, err := s.newRequestPOST() + if err != nil { + return res, err + } if start.IsZero() { return res, fmt.Errorf("start param is missing") } if end.IsZero() { return res, fmt.Errorf("end param is missing") } - req := s.newQueryRangeRequest(query, start, end) + s.setPrometheusRangeReqParams(req, query, start, end) resp, err := s.do(ctx, req) - if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { - // something in the middle between client and datasource might be closing - // the connection. So we do a one more attempt in hope request will succeed. - req = s.newQueryRangeRequest(query, start, end) - resp, err = s.do(ctx, req) - } if err != nil { return res, err } @@ -196,6 +201,11 @@ func (s *VMStorage) do(ctx context.Context, req *http.Request) (*http.Response, logger.Infof("DEBUG datasource request: executing %s request with params %q", req.Method, ru) } resp, err := s.c.Do(req.WithContext(ctx)) + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { + // something in the middle between client and datasource might be closing + // the connection. So we do a one more attempt in hope request will succeed. + resp, err = s.c.Do(req.WithContext(ctx)) + } if err != nil { return nil, fmt.Errorf("error getting response from %s: %w", ru, err) } @@ -207,29 +217,10 @@ func (s *VMStorage) do(ctx context.Context, req *http.Request) (*http.Response, return resp, nil } -func (s *VMStorage) newQueryRangeRequest(query string, start, end time.Time) *http.Request { - req := s.newRequest() - s.setPrometheusRangeReqParams(req, query, start, end) - return req -} - -func (s *VMStorage) newQueryRequest(query string, ts time.Time) *http.Request { - req := s.newRequest() - switch s.dataSourceType { - case "", datasourcePrometheus: - s.setPrometheusInstantReqParams(req, query, ts) - case datasourceGraphite: - s.setGraphiteReqParams(req, query, ts) - default: - logger.Panicf("BUG: engine not found: %q", s.dataSourceType) - } - return req -} - -func (s *VMStorage) newRequest() *http.Request { +func (s *VMStorage) newRequestPOST() (*http.Request, error) { req, err := http.NewRequest(http.MethodPost, s.datasourceURL, nil) if err != nil { - logger.Panicf("BUG: unexpected error from http.NewRequest(%q): %s", s.datasourceURL, err) + return nil, err } req.Header.Set("Content-Type", "application/json") if s.authCfg != nil { @@ -238,5 +229,5 @@ func (s *VMStorage) newRequest() *http.Request { for _, h := range s.extraHeaders { req.Header.Set(h.key, h.value) } - return req + return req, nil } diff --git a/app/vmalert/datasource/vm_test.go b/app/vmalert/datasource/vm_test.go index aa2e79598f..e9a410039e 100644 --- a/app/vmalert/datasource/vm_test.go +++ b/app/vmalert/datasource/vm_test.go @@ -640,7 +640,10 @@ func TestRequestParams(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - req := tc.vm.newRequest() + req, err := tc.vm.newRequestPOST() + if err != nil { + t.Fatalf("unexpected error: %s", err) + } switch tc.vm.dataSourceType { case "", datasourcePrometheus: if tc.queryRange { @@ -735,7 +738,10 @@ func TestHeaders(t *testing.T) { for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { vm := tt.vmFn() - req := vm.newQueryRequest("foo", time.Now()) + req, err := vm.newRequestPOST() + if err != nil { + t.Fatalf("unexpected error: %s", err) + } tt.checkFn(t, req) }) } diff --git a/app/vmauth/README.md b/app/vmauth/README.md index 357dfc2e40..a3f6827a7c 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -283,7 +283,7 @@ It is recommended using [binary releases](https://github.com/VictoriaMetrics/Vic ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmauth` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmauth` binary and puts it into the `bin` folder. diff --git a/app/vmbackup/README.md b/app/vmbackup/README.md index 8b90c6872b..4f054c557d 100644 --- a/app/vmbackup/README.md +++ b/app/vmbackup/README.md @@ -303,7 +303,7 @@ It is recommended using [binary releases](https://github.com/VictoriaMetrics/Vic ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmbackup` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmbackup` binary and puts it into the `bin` folder. diff --git a/app/vmctl/README.md b/app/vmctl/README.md index c4c5d676a7..2534434fa2 100644 --- a/app/vmctl/README.md +++ b/app/vmctl/README.md @@ -1023,7 +1023,7 @@ It is recommended using [binary releases](https://github.com/VictoriaMetrics/Vic ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmctl` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmctl` binary and puts it into the `bin` folder. @@ -1052,7 +1052,7 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b #### Development ARM build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmctl-linux-arm` or `make vmctl-linux-arm64` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmctl-linux-arm` or `vmctl-linux-arm64` binary respectively and puts it into the `bin` folder. diff --git a/app/vmrestore/README.md b/app/vmrestore/README.md index dd6d231d3e..fbef43bfb8 100644 --- a/app/vmrestore/README.md +++ b/app/vmrestore/README.md @@ -203,7 +203,7 @@ It is recommended using [binary releases](https://github.com/VictoriaMetrics/Vic ### Development build -1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.20. +1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.22. 1. Run `make vmrestore` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmrestore` binary and puts it into the `bin` folder.