From 17dcf604ee5d5215c510a30bc9ac23c132304720 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 08:39:09 -0400 Subject: [PATCH 01/17] fix: prevent /usr/lib/.build-id links from being created --- package/rhel/circonus-agent.spec.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package/rhel/circonus-agent.spec.in b/package/rhel/circonus-agent.spec.in index 73eb5e3..42a8f66 100644 --- a/package/rhel/circonus-agent.spec.in +++ b/package/rhel/circonus-agent.spec.in @@ -7,6 +7,9 @@ %define _prefix /opt/circonus %define app_dir %{_prefix}/agent +# prevent /usr/lib/.build-id links from being created +%define _build_id_links none + %if 0%{?el8} # perl and python are *optional*, not required # rpmbuild autoreq will include by default because of scripts with perl|python shebang From bd9277d4410f9cd24b4433bed1c5e695ea0c65d1 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 08:46:44 -0400 Subject: [PATCH 02/17] fix: gofmt --- api/doc.go | 1 - api/metrics.go | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/api/doc.go b/api/doc.go index 82a34e4..33ea591 100644 --- a/api/doc.go +++ b/api/doc.go @@ -5,6 +5,5 @@ /* Package api provides the definition of the agent API - */ package api diff --git a/api/metrics.go b/api/metrics.go index 2609194..8c191e4 100644 --- a/api/metrics.go +++ b/api/metrics.go @@ -13,16 +13,18 @@ import ( // Metrics retrieves metrics from one or all plugins // NOTE: because the API is using the regular agent URL - the -// agent will act as though any other client (e.g. a broker) -// were requesting metrics - it will *run* the plugin(s). +// +// agent will act as though any other client (e.g. a broker) +// were requesting metrics - it will *run* the plugin(s). func (c *Client) Metrics(pluginID string) (*Metrics, error) { return c.MetricsWithContext(context.Background(), pluginID) } // MetricsWithContext retrieves metrics from one or all plugins // NOTE: because the API is using the regular agent URL - the -// agent will act as though any other client (e.g. a broker) -// were requesting metrics - it will *run* the plugin(s). +// +// agent will act as though any other client (e.g. a broker) +// were requesting metrics - it will *run* the plugin(s). func (c *Client) MetricsWithContext(ctx context.Context, pluginID string) (*Metrics, error) { pid := "" if pluginID != "" { From 675eb32964c3b863ba3d83aae9fd9dd634b80819 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 08:47:12 -0400 Subject: [PATCH 03/17] fix: ioutil deprecation --- api/get.go | 4 ++-- api/write.go | 4 ++-- api/write_test.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/api/get.go b/api/get.go index e2d5210..51a55fc 100644 --- a/api/get.go +++ b/api/get.go @@ -8,7 +8,7 @@ package api import ( "context" "fmt" - "io/ioutil" + "io" "net/http" "strings" ) @@ -35,7 +35,7 @@ func (c *Client) get(ctx context.Context, reqpath string) ([]byte, error) { } defer resp.Body.Close() - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("reading response: %w", err) } diff --git a/api/write.go b/api/write.go index 3105811..4e6311b 100644 --- a/api/write.go +++ b/api/write.go @@ -10,7 +10,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "strings" ) @@ -59,7 +59,7 @@ func (c *Client) WriteWithContext(ctx context.Context, groupID string, metrics * default: // extract any error message and return defer resp.Body.Close() - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { return fmt.Errorf("reading response: %w", err) } diff --git a/api/write_test.go b/api/write_test.go index 554141e..542b782 100644 --- a/api/write_test.go +++ b/api/write_test.go @@ -6,7 +6,7 @@ package api import ( - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -32,7 +32,7 @@ func TestWrite(t *testing.T) { t.Log("\t", test.name) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() - data, err := ioutil.ReadAll(r.Body) + data, err := io.ReadAll(r.Body) if err != nil { t.Fatalf("expected no error, got (%s)", err) } From 677be94bee7ee06716b34eda47e8d8f2148a3885 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 08:49:46 -0400 Subject: [PATCH 04/17] fix: ioutil deprecation --- internal/config/config.go | 2 -- internal/config/config_test.go | 8 ++++---- internal/config/cosi.go | 6 +++--- internal/config/load_config.go | 3 +-- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 6b5b98b..0d6d6cf 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -140,9 +140,7 @@ type Config struct { DebugAPI bool `mapstructure:"debug_api" json:"debug_api" yaml:"debug_api" toml:"debug_api"` } -// // NOTE: adding a Key* MUST be reflected in the Config structures above. -// const ( // KeyAPICAFile custom ca for circonus api (e.g. inside). KeyAPICAFile = "api.ca_file" diff --git a/internal/config/config_test.go b/internal/config/config_test.go index d9f3330..195f5b8 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -6,7 +6,7 @@ package config import ( - "io/ioutil" + "io" "testing" "github.com/rs/zerolog" @@ -43,7 +43,7 @@ func TestShowConfig(t *testing.T) { t.Log("YAML") { viper.Set(KeyShowConfig, "yaml") - err := ShowConfig(ioutil.Discard) + err := ShowConfig(io.Discard) if err != nil { t.Fatalf("expected no error, got %s", err) } @@ -52,7 +52,7 @@ func TestShowConfig(t *testing.T) { t.Log("TOML") { viper.Set(KeyShowConfig, "toml") - err := ShowConfig(ioutil.Discard) + err := ShowConfig(io.Discard) if err != nil { t.Fatalf("expected no error, got %s", err) } @@ -61,7 +61,7 @@ func TestShowConfig(t *testing.T) { t.Log("JSON") { viper.Set(KeyShowConfig, "json") - err := ShowConfig(ioutil.Discard) + err := ShowConfig(io.Discard) if err != nil { t.Fatalf("expected no error, got %s", err) } diff --git a/internal/config/cosi.go b/internal/config/cosi.go index 15a3c88..9d08f8a 100644 --- a/internal/config/cosi.go +++ b/internal/config/cosi.go @@ -8,7 +8,7 @@ package config import ( "encoding/json" "fmt" - "io/ioutil" + "os" "path/filepath" "regexp" @@ -89,7 +89,7 @@ func loadCosiAPIConfig() (*APIConfig, error) { // loadCosiV1Config loads (currently, only api) portion of cosi configuration. func loadCosiV1Config(cfgFile string) (*APIConfig, error) { - data, err := ioutil.ReadFile(cfgFile) + data, err := os.ReadFile(cfgFile) if err != nil { return nil, fmt.Errorf("unable to access cosi config: %w", err) } @@ -143,7 +143,7 @@ func loadCosiV2Config(cfgFile string) (*APIConfig, error) { // loadChecKConfig loads (currently, only cid) portion of a cosi check config. func loadCheckConfig(cfgFile string) (string, error) { - data, err := ioutil.ReadFile(cfgFile) + data, err := os.ReadFile(cfgFile) if err != nil { return "", fmt.Errorf("unable to access cosi check config: %w", err) } diff --git a/internal/config/load_config.go b/internal/config/load_config.go index f8fb98e..c54c66b 100644 --- a/internal/config/load_config.go +++ b/internal/config/load_config.go @@ -8,7 +8,6 @@ package config import ( "encoding/json" "fmt" - "io/ioutil" "os" "strings" @@ -43,7 +42,7 @@ func LoadConfigFile(base string, target interface{}) error { if _, err := os.Stat(cfg); os.IsNotExist(err) { continue } - data, err := ioutil.ReadFile(cfg) + data, err := os.ReadFile(cfg) if err != nil { return fmt.Errorf("reading configuration file (%s): %w", cfg, err) } From dd0385cea2c94d53465c56b1b7db1500dc5c069c Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 08:53:45 -0400 Subject: [PATCH 05/17] fix: ioutil deprecation --- internal/check/api_test.go | 10 +++++----- internal/check/broker.go | 4 ++-- internal/check/bundle/api_test.go | 8 ++++---- internal/check/bundle/bundle.go | 3 +-- internal/check/check.go | 9 ++++----- internal/check/check_test.go | 8 ++++---- 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/internal/check/api_test.go b/internal/check/api_test.go index 312c9e1..43c088c 100644 --- a/internal/check/api_test.go +++ b/internal/check/api_test.go @@ -3,7 +3,7 @@ package check import ( "encoding/json" "fmt" - "io/ioutil" + "os" "strings" "github.com/circonus-labs/go-apiclient" @@ -22,25 +22,25 @@ var ( ) func init() { - if data, err := ioutil.ReadFile("testdata/check1234.json"); err != nil { + if data, err := os.ReadFile("testdata/check1234.json"); err != nil { panic(err) } else if err := json.Unmarshal(data, &testCheck); err != nil { panic(err) } - if data, err := ioutil.ReadFile("testdata/checkbundle1234.json"); err != nil { + if data, err := os.ReadFile("testdata/checkbundle1234.json"); err != nil { panic(err) } else if err := json.Unmarshal(data, &testCheckBundle); err != nil { panic(err) } - if data, err := ioutil.ReadFile("testdata/broker1234.json"); err != nil { + if data, err := os.ReadFile("testdata/broker1234.json"); err != nil { panic(err) } else if err := json.Unmarshal(data, &testBroker); err != nil { panic(err) } - if data, err := ioutil.ReadFile("testdata/ca.crt"); err != nil { + if data, err := os.ReadFile("testdata/ca.crt"); err != nil { panic(err) } else { cacert.Contents = string(data) diff --git a/internal/check/broker.go b/internal/check/broker.go index b34d4d1..87efc59 100644 --- a/internal/check/broker.go +++ b/internal/check/broker.go @@ -10,8 +10,8 @@ import ( "crypto/x509" "encoding/json" "fmt" - "io/ioutil" "net/url" + "os" "github.com/circonus-labs/circonus-agent/internal/config" "github.com/spf13/viper" @@ -113,7 +113,7 @@ func (c *Check) fetchBrokerCA() ([]byte, error) { // use local file if specified file := viper.GetString(config.KeyReverseBrokerCAFile) if file != "" { - cert, err := ioutil.ReadFile(file) + cert, err := os.ReadFile(file) if err != nil { return nil, fmt.Errorf("read file: %w", err) } diff --git a/internal/check/bundle/api_test.go b/internal/check/bundle/api_test.go index 4b54ce3..5b4680e 100644 --- a/internal/check/bundle/api_test.go +++ b/internal/check/bundle/api_test.go @@ -3,7 +3,7 @@ package bundle import ( "encoding/json" "fmt" - "io/ioutil" + "os" "strings" "github.com/circonus-labs/circonus-agent/internal/release" @@ -24,7 +24,7 @@ var ( func init() { { - data, err := ioutil.ReadFile("testdata/checkbundle1234.json") + data, err := os.ReadFile("testdata/checkbundle1234.json") if err != nil { panic(err) } @@ -38,13 +38,13 @@ func init() { testCheckBundleAgent.Notes = ¬es } - if data, err := ioutil.ReadFile("testdata/broker1234.json"); err != nil { + if data, err := os.ReadFile("testdata/broker1234.json"); err != nil { panic(err) } else if err := json.Unmarshal(data, &testBroker); err != nil { panic(err) } - if data, err := ioutil.ReadFile("testdata/ca.crt"); err != nil { + if data, err := os.ReadFile("testdata/ca.crt"); err != nil { panic(err) } else { cacert.Contents = string(data) diff --git a/internal/check/bundle/bundle.go b/internal/check/bundle/bundle.go index ee08fa3..c83e502 100644 --- a/internal/check/bundle/bundle.go +++ b/internal/check/bundle/bundle.go @@ -8,7 +8,6 @@ package bundle import ( "encoding/json" "fmt" - "io/ioutil" "os" "regexp" "strings" @@ -589,7 +588,7 @@ type MetricFilterFile struct { func (cb *Bundle) getMetricFilters() ([][]string, error) { mff := viper.GetString(config.KeyCheckMetricFilterFile) if mff != "" { - data, err := ioutil.ReadFile(mff) + data, err := os.ReadFile(mff) if err != nil { if !os.IsNotExist(err) { return nil, fmt.Errorf("reading %s: %w", mff, err) diff --git a/internal/check/check.go b/internal/check/check.go index e3fb976..1cb8a77 100644 --- a/internal/check/check.go +++ b/internal/check/check.go @@ -11,7 +11,6 @@ import ( "crypto/x509" "encoding/json" "fmt" - "io/ioutil" "net" "net/url" "os" @@ -362,7 +361,7 @@ func (c *Check) FetchBrokerConfig() error { func (c *Check) loadAPICAfile(file string) *x509.CertPool { cp := x509.NewCertPool() - cert, err := ioutil.ReadFile(file) + cert, err := os.ReadFile(file) if err != nil { c.logger.Error().Err(err).Str("file", file).Msg("unable to load api ca file") return nil @@ -375,9 +374,9 @@ func (c *Check) loadAPICAfile(file string) *x509.CertPool { } // DeleteCheck will attempt to delete a check bundle created by the agent. -// 1. The `etc/` directory must be writeable by the user running the agent. -// 2. The agent, when creating a check, will save the check object to `etc/check_bundle.json`. -// 3. The agent, when --check-delete is passed, will attempt to read this file and delete the check bundle. +// 1. The `etc/` directory must be writeable by the user running the agent. +// 2. The agent, when creating a check, will save the check object to `etc/check_bundle.json`. +// 3. The agent, when --check-delete is passed, will attempt to read this file and delete the check bundle. func (c *Check) DeleteCheck() error { bundleFile := defaults.CheckBundleFile diff --git a/internal/check/check_test.go b/internal/check/check_test.go index 7ee285e..ba1de5c 100644 --- a/internal/check/check_test.go +++ b/internal/check/check_test.go @@ -45,14 +45,14 @@ func TestCheck_CheckMeta(t *testing.T) { type fields struct { checkBundle *bundle.Bundle } - tests := []struct { //nolint:govet - name string + tests := []struct { fields fields want *Meta + name string wantErr bool }{ - {"nil checkbundle", fields{}, nil, true}, - {"checkbundle (nil bundle)", fields{checkBundle: &bundle.Bundle{}}, nil, true}, + {name: "nil checkbundle", fields: fields{}, want: nil, wantErr: true}, + {name: "checkbundle (nil bundle)", fields: fields{checkBundle: &bundle.Bundle{}}, want: nil, wantErr: true}, } for _, tt := range tests { tt := tt From dc09ca37ae338ea3b6f94b31396923c1e453641b Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:05:28 -0400 Subject: [PATCH 06/17] fix: ioutil deprecation --- internal/server/receiver/receiver_test.go | 102 +++++++++++----------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/internal/server/receiver/receiver_test.go b/internal/server/receiver/receiver_test.go index 4209eeb..4b8b892 100644 --- a/internal/server/receiver/receiver_test.go +++ b/internal/server/receiver/receiver_test.go @@ -9,7 +9,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" "strings" "testing" @@ -58,7 +58,7 @@ func TestParse(t *testing.T) { t.Log("\tinvalid json (no data)") { data := []byte{} - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) expectedErr := fmt.Errorf("parsing json for test: EOF") //nolint:goerr113 err := Parse("test", r) if err == nil { @@ -72,7 +72,7 @@ func TestParse(t *testing.T) { t.Log("\tinvalid json (blank)") { data := []byte("") - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) expectedErr := fmt.Errorf("parsing json for test: EOF") //nolint:goerr113 err := Parse("test", r) if err == nil { @@ -86,7 +86,7 @@ func TestParse(t *testing.T) { t.Log("\tinvalid json (syntax)") { data := []byte("{") - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) expectedErr := fmt.Errorf("parsing json for test: unexpected EOF") //nolint:goerr113 err := Parse("test", r) if err == nil { @@ -100,7 +100,7 @@ func TestParse(t *testing.T) { t.Log("\tinvalid json (syntax)") { data := []byte(`{"test": }`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) expectedErr := fmt.Errorf("id:test - offset 10 -- invalid character '}' looking for beginning of value") //nolint:goerr113 err := Parse("test", r) if err == nil { @@ -114,7 +114,7 @@ func TestParse(t *testing.T) { t.Log("\tno metrics") { data := []byte("{}") - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("test", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -135,7 +135,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'i' int32") { data := []byte(`{"test": {"_type": "i", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -153,7 +153,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'I' uint32") { data := []byte(`{"test": {"_type": "I", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -171,7 +171,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'l' int64") { data := []byte(`{"test": {"_type": "l", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -189,7 +189,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'L' uint64") { data := []byte(`{"test": {"_type": "L", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -207,7 +207,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'n' float") { data := []byte(`{"test": {"_type": "n", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -225,7 +225,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'n' float (histogram numeric samples)") { data := []byte(`{"test": {"_type": "n", "_value": [1]}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -247,7 +247,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'n' float (histogram encoded samples)") { data := []byte(`{"test": {"_type": "n", "_value": ["H[1.2]=1"]}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -269,7 +269,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'h' float") { data := []byte(`{"test": {"_type": "h", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -287,7 +287,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'h' float (histogram numeric samples)") { data := []byte(`{"test": {"_type": "h", "_value": [1]}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -309,7 +309,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'h' float (histogram encoded samples)") { data := []byte(`{"test": {"_type": "h", "_value": ["H[1.2]=1"]}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -331,7 +331,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 's' string") { data := []byte(`{"test": {"_type": "s", "_value": "foo"}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -349,7 +349,7 @@ func TestParse(t *testing.T) { t.Log("\ttype 'z' invalid type") { data := []byte(`{"test": {"_type": "z", "_value": null}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -364,7 +364,7 @@ func TestParse(t *testing.T) { t.Log("\twith tags") { data := []byte(`{"test": {"_tags": ["c1:v1","c2:v2"], "_type": "n", "_value": 1}}`) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse("testg", r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -408,16 +408,16 @@ func TestParseInt32(t *testing.T) { metricType := "i" - tt := []struct { //nolint:govet - Description string + tt := []struct { Value interface{} + Description string Expect int32 ShouldFail bool }{ - {"valid", 1, int32(1), false}, - {"valid, string", fmt.Sprintf("%v", 1), int32(1), false}, - {"bad conversion", fmt.Sprintf("%v", "1a"), 0, true}, - {"bad data type", []int{1}, 0, true}, + {Description: "valid", Value: 1, Expect: int32(1), ShouldFail: false}, + {Description: "valid, string", Value: fmt.Sprintf("%v", 1), Expect: int32(1), ShouldFail: false}, + {Description: "bad conversion", Value: fmt.Sprintf("%v", "1a"), Expect: 0, ShouldFail: true}, + {Description: "bad data type", Value: []int{1}, Expect: 0, ShouldFail: true}, } for _, test := range tt { @@ -445,16 +445,16 @@ func TestParseUint32(t *testing.T) { metricType := "I" - tt := []struct { //nolint:govet - Description string + tt := []struct { Value interface{} + Description string Expect uint32 ShouldFail bool }{ - {"valid", 1, uint32(1), false}, - {"valid, string", fmt.Sprintf("%v", 1), uint32(1), false}, - {"bad conversion", fmt.Sprintf("%v", "1a"), 0, true}, - {"bad data type", []int{1}, 0, true}, + {Description: "valid", Value: 1, Expect: uint32(1), ShouldFail: false}, + {Description: "valid, string", Value: fmt.Sprintf("%v", 1), Expect: uint32(1), ShouldFail: false}, + {Description: "bad conversion", Value: fmt.Sprintf("%v", "1a"), Expect: 0, ShouldFail: true}, + {Description: "bad data type", Value: []int{1}, Expect: 0, ShouldFail: true}, } for _, test := range tt { @@ -482,16 +482,16 @@ func TestParseInt64(t *testing.T) { metricType := "l" - tt := []struct { //nolint:govet - Description string + tt := []struct { Value interface{} + Description string Expect int64 ShouldFail bool }{ - {"valid", 1, int64(1), false}, - {"valid, string", fmt.Sprintf("%v", 1), int64(1), false}, - {"bad conversion", fmt.Sprintf("%v", "1a"), 0, true}, - {"bad data type", []int{1}, 0, true}, + {Description: "valid", Value: 1, Expect: int64(1), ShouldFail: false}, + {Description: "valid, string", Value: fmt.Sprintf("%v", 1), Expect: int64(1), ShouldFail: false}, + {Description: "bad conversion", Value: fmt.Sprintf("%v", "1a"), Expect: 0, ShouldFail: true}, + {Description: "bad data type", Value: []int{1}, Expect: 0, ShouldFail: true}, } for _, test := range tt { @@ -519,16 +519,16 @@ func TestParseUint64(t *testing.T) { metricType := "L" - tt := []struct { //nolint:govet - Description string + tt := []struct { Value interface{} + Description string Expect uint64 ShouldFail bool }{ - {"valid", 1, uint64(1), false}, - {"valid, string", fmt.Sprintf("%v", 1), uint64(1), false}, - {"bad conversion", fmt.Sprintf("%v", "1a"), 0, true}, - {"bad data type", []int{1}, 0, true}, + {Description: "valid", Value: 1, Expect: uint64(1), ShouldFail: false}, + {Description: "valid, string", Value: fmt.Sprintf("%v", 1), Expect: uint64(1), ShouldFail: false}, + {Description: "bad conversion", Value: fmt.Sprintf("%v", "1a"), Expect: 0, ShouldFail: true}, + {Description: "bad data type", Value: []int{1}, Expect: 0, ShouldFail: true}, } for _, test := range tt { @@ -556,18 +556,18 @@ func TestParseFloat(t *testing.T) { metricType := "n" - tt := []struct { //nolint:govet - Description string + tt := []struct { Value interface{} + Description string Expect float64 ShouldFail bool }{ - {"valid1", 1, float64(1), false}, - {"valid2", 1.2, float64(1.2), false}, - {"valid, string1", fmt.Sprintf("%v", 1), float64(1), false}, - {"valid, string2", fmt.Sprintf("%v", 1.2), float64(1.2), false}, - {"bad conversion", fmt.Sprintf("%v", "1a"), 0, true}, - {"bad data type", true, 0, true}, + {Description: "valid1", Value: 1, Expect: float64(1), ShouldFail: false}, + {Description: "valid2", Value: 1.2, Expect: float64(1.2), ShouldFail: false}, + {Description: "valid, string1", Value: fmt.Sprintf("%v", 1), Expect: float64(1), ShouldFail: false}, + {Description: "valid, string2", Value: fmt.Sprintf("%v", 1.2), Expect: float64(1.2), ShouldFail: false}, + {Description: "bad conversion", Value: fmt.Sprintf("%v", "1a"), Expect: 0, ShouldFail: true}, + {Description: "bad data type", Value: true, Expect: 0, ShouldFail: true}, } for _, test := range tt { From a5c9ae1623cbf821b6a571c17de3805ad4260b0d Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:08:55 -0400 Subject: [PATCH 07/17] fix: pass context to fetchPromMetrics --- internal/builtins/collector/prometheus/prometheus.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/builtins/collector/prometheus/prometheus.go b/internal/builtins/collector/prometheus/prometheus.go index d5c4b78..81b4e94 100644 --- a/internal/builtins/collector/prometheus/prometheus.go +++ b/internal/builtins/collector/prometheus/prometheus.go @@ -167,7 +167,7 @@ func (c *Prom) Collect(ctx context.Context) error { for _, u := range c.urls { c.logger.Debug().Str("id", u.ID).Str("url", u.URL).Msg("prom fetch request") - err := c.fetchPromMetrics(u, &metrics) + err := c.fetchPromMetrics(ctx, u, &metrics) if err != nil { c.logger.Error().Err(err).Interface("url", u).Msg("fetching prom metrics") } @@ -177,7 +177,7 @@ func (c *Prom) Collect(ctx context.Context) error { return nil } -func (c *Prom) fetchPromMetrics(u URLDef, metrics *cgm.Metrics) error { +func (c *Prom) fetchPromMetrics(pctx context.Context, u URLDef, metrics *cgm.Metrics) error { req, err := http.NewRequest("GET", u.URL, nil) if err != nil { return fmt.Errorf("prepare reqeust: %w", err) @@ -187,9 +187,9 @@ func (c *Prom) fetchPromMetrics(u URLDef, metrics *cgm.Metrics) error { var cancel context.CancelFunc if u.uttl > time.Duration(0) { - ctx, cancel = context.WithTimeout(context.Background(), u.uttl) + ctx, cancel = context.WithTimeout(pctx, u.uttl) } else { - ctx, cancel = context.WithCancel(context.Background()) + ctx, cancel = context.WithCancel(pctx) } req = req.WithContext(ctx) From 4a24af6f74f609ccf6809cb138de5bbc4948a715 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:09:56 -0400 Subject: [PATCH 08/17] fix: ioutil deprecation --- internal/server/promrecv/promrecv_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/server/promrecv/promrecv_test.go b/internal/server/promrecv/promrecv_test.go index fffdf93..1d59192 100644 --- a/internal/server/promrecv/promrecv_test.go +++ b/internal/server/promrecv/promrecv_test.go @@ -9,7 +9,7 @@ import ( "bytes" "encoding/base64" "fmt" - "io/ioutil" + "io" "testing" "github.com/rs/zerolog" @@ -108,7 +108,7 @@ func TestParse(t *testing.T) { t.Log("\tno data") { data := []byte{} - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse(r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -118,7 +118,7 @@ func TestParse(t *testing.T) { t.Log("\tblank/empty data") { data := []byte("") - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse(r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) @@ -128,7 +128,7 @@ func TestParse(t *testing.T) { t.Log("\tvalid data") { data := []byte(promData) - r := ioutil.NopCloser(bytes.NewReader(data)) + r := io.NopCloser(bytes.NewReader(data)) err := Parse(r) if err != nil { t.Fatalf("expected NO error, got (%s)", err) From cd204862664ded476244d51b76dcf59cdc6ace7b Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:10:50 -0400 Subject: [PATCH 09/17] fix: ioutil deprecation --- internal/statsd/statsd.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/statsd/statsd.go b/internal/statsd/statsd.go index 4a833ed..7431c29 100644 --- a/internal/statsd/statsd.go +++ b/internal/statsd/statsd.go @@ -11,8 +11,8 @@ import ( "crypto/x509" "errors" "fmt" - "io/ioutil" "net" + "os" "regexp" "strconv" "sync" @@ -321,8 +321,9 @@ func (l logshim) Printf(msgfmt string, v ...interface{}) { // initGroupMetrics initializes the group metric circonus-gometrics instance // NOTE: Group metrics are sent directly to circonus, to an existing HTTPTRAP -// check created manually or by cosi - the group check is intended to be -// used by multiple systems. +// +// check created manually or by cosi - the group check is intended to be +// used by multiple systems. func (s *Server) initGroupMetrics() error { if s.groupCID == "" { s.logger.Info().Msg("group check disabled") @@ -343,7 +344,7 @@ func (s *Server) initGroupMetrics() error { cmc.CheckManager.Check.ID = s.groupCID if s.apiCAFile != "" { - cert, err := ioutil.ReadFile(s.apiCAFile) + cert, err := os.ReadFile(s.apiCAFile) if err != nil { return fmt.Errorf("read file: %w", err) } From 37cca4d80b6bc758f4c10a9044f6e56100514080 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:14:12 -0400 Subject: [PATCH 10/17] fix: ioutil deprecation --- internal/plugins/scan.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/plugins/scan.go b/internal/plugins/scan.go index 29307bc..a2424cb 100644 --- a/internal/plugins/scan.go +++ b/internal/plugins/scan.go @@ -8,7 +8,6 @@ package plugins import ( "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "regexp" @@ -286,7 +285,7 @@ func (p *Plugins) scanPluginDirectory(b *builtins.Builtins) error { // check for config file cfgFile := filepath.Join(p.pluginDir, fmt.Sprintf("%s.json", fileBase)) - if data, err := ioutil.ReadFile(cfgFile); err != nil { + if data, err := os.ReadFile(cfgFile); err != nil { if !os.IsNotExist(err) { p.logger.Warn(). Err(err). From e47fa61c1b63aad02a75954e2c4ff269d895e8fc Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:14:22 -0400 Subject: [PATCH 11/17] fix: struct alignment --- internal/plugins/plugins_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/plugins/plugins_test.go b/internal/plugins/plugins_test.go index 3726e03..3c124c7 100644 --- a/internal/plugins/plugins_test.go +++ b/internal/plugins/plugins_test.go @@ -27,19 +27,19 @@ func TestNew(t *testing.T) { t.Log("Testing New") zerolog.SetGlobalLevel(zerolog.Disabled) - tests := []struct { //nolint:govet + tests := []struct { id string defaultDir string dir string + errMsg string list []string shouldFail bool - errMsg string }{ - {"invalid - both dir/list specified", "testdata", "testdata", []string{path.Join("testdata", "test.sh")}, true, "invalid configuration cannot specify plugin-dir AND plugin-list"}, - {"invalid - not a dir", "testdata", path.Join("testdata", "test.sh"), []string{}, true, "invalid plugin directory:"}, - {"valid - no dir/list, default to dir", "testdata", "", []string{}, false, ""}, - {"valid - dir", "", "testdata", []string{}, false, ""}, - {"valid - list", "", "", []string{path.Join("testdata", "test.sh")}, false, ""}, + {id: "invalid - both dir/list specified", defaultDir: "testdata", dir: "testdata", list: []string{path.Join("testdata", "test.sh")}, shouldFail: true, errMsg: "invalid configuration cannot specify plugin-dir AND plugin-list"}, + {id: "invalid - not a dir", defaultDir: "testdata", dir: path.Join("testdata", "test.sh"), list: []string{}, shouldFail: true, errMsg: "invalid plugin directory:"}, + {id: "valid - no dir/list, default to dir", defaultDir: "testdata", dir: "", list: []string{}, shouldFail: false, errMsg: ""}, + {id: "valid - dir", defaultDir: "", dir: "testdata", list: []string{}, shouldFail: false, errMsg: ""}, + {id: "valid - list", defaultDir: "", dir: "", list: []string{path.Join("testdata", "test.sh")}, shouldFail: false, errMsg: ""}, } for _, test := range tests { From 8d374dfefa6ad77043a305a187d6033c8458311b Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:15:39 -0400 Subject: [PATCH 12/17] fix: ioutil deprecation --- internal/reverse/connection/metrics.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/reverse/connection/metrics.go b/internal/reverse/connection/metrics.go index cd6e09d..d5dc106 100644 --- a/internal/reverse/connection/metrics.go +++ b/internal/reverse/connection/metrics.go @@ -9,7 +9,6 @@ import ( "crypto/tls" "fmt" "io" - "io/ioutil" "math" "net" "time" @@ -92,7 +91,7 @@ func (c *Connection) fetchMetricData(request *[]byte, channelID uint16) (*[]byte Msg("Mismatch") } - data, err := ioutil.ReadAll(conn) + data, err := io.ReadAll(conn) if err != nil { return nil, fmt.Errorf("reading metric data: %w", err) } From 986103bcc437a132ac5d38493b6ce9fee6371beb Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:15:50 -0400 Subject: [PATCH 13/17] fix gofmt --- internal/reverse/connection/frame.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/reverse/connection/frame.go b/internal/reverse/connection/frame.go index a4fec74..1313c75 100644 --- a/internal/reverse/connection/frame.go +++ b/internal/reverse/connection/frame.go @@ -16,8 +16,10 @@ import ( // buildFrame creates a frame to send to broker. // recipe: // bytes 1-6 header -// 2 bytes channel id and command flag -// 4 bytes length of data +// +// 2 bytes channel id and command flag +// 4 bytes length of data +// // bytes 7-n are data, where 0 < n <= maxPayloadLen. func buildFrame(channelID uint16, isCommand bool, payload []byte) []byte { frame := make([]byte, len(payload)+6) From 8585a7f180c76b26bcede754e69cc2f074ed2a79 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:19:48 -0400 Subject: [PATCH 14/17] fix: ioutil deprecation --- internal/multiagent/multiagent.go | 4 ++-- internal/server/handlers.go | 4 ++-- internal/server/handlers_test.go | 6 +++--- internal/server/routes_test.go | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/multiagent/multiagent.go b/internal/multiagent/multiagent.go index 1f5cc89..b631482 100644 --- a/internal/multiagent/multiagent.go +++ b/internal/multiagent/multiagent.go @@ -7,7 +7,7 @@ import ( "crypto/tls" "encoding/json" "fmt" - "io/ioutil" + "io" "net" "net/http" "os" @@ -292,7 +292,7 @@ func (s *Submitter) sendMetrics(ctx context.Context) error { return fmt.Errorf("http do: %w", err) } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { s.logger.Error().Err(err).Msg("reading body") return fmt.Errorf("read response: %w", err) diff --git a/internal/server/handlers.go b/internal/server/handlers.go index 12966fb..b373ca4 100644 --- a/internal/server/handlers.go +++ b/internal/server/handlers.go @@ -11,8 +11,8 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" + "os" "path/filepath" "strconv" "strings" @@ -314,7 +314,7 @@ func (s *Server) encodeResponse(m *cgm.Metrics, w http.ResponseWriter, r *http.R dumpDir := viper.GetString(config.KeyDebugDumpMetrics) if dumpDir != "" { dumpFile := filepath.Join(dumpDir, "metrics_"+time.Now().Format("20060102_150405")+".json") - if err := ioutil.WriteFile(dumpFile, jsonData, 0644); err != nil { //nolint:gosec + if err := os.WriteFile(dumpFile, jsonData, 0644); err != nil { //nolint:gosec s.logger.Error(). Err(err). Str("file", dumpFile). diff --git a/internal/server/handlers_test.go b/internal/server/handlers_test.go index c026953..1731042 100644 --- a/internal/server/handlers_test.go +++ b/internal/server/handlers_test.go @@ -10,7 +10,7 @@ import ( "bytes" "context" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "os" @@ -289,7 +289,7 @@ func TestPromReceiver(t *testing.T) { t.Logf("PUT /prom -> %d", http.StatusNoContent) { - r := ioutil.NopCloser(bytes.NewReader([]byte(promData))) + r := io.NopCloser(bytes.NewReader([]byte(promData))) req := httptest.NewRequest("PUT", "/prom", r) w := httptest.NewRecorder() @@ -456,7 +456,7 @@ func TestPromOutput(t *testing.T) { } expect := "gtest`mtest 1" - body, _ := ioutil.ReadAll(resp.Body) + body, _ := io.ReadAll(resp.Body) if !strings.Contains(string(body), expect) { resp.Body.Close() t.Fatalf("expected (%s) got (%s)", expect, string(body)) diff --git a/internal/server/routes_test.go b/internal/server/routes_test.go index 5a5932a..4af192d 100644 --- a/internal/server/routes_test.go +++ b/internal/server/routes_test.go @@ -8,7 +8,7 @@ package server import ( "bytes" "context" - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -158,7 +158,7 @@ func TestRouter(t *testing.T) { w := httptest.NewRecorder() s.router(w, req) resp := w.Result() - body, berr := ioutil.ReadAll(resp.Body) + body, berr := io.ReadAll(resp.Body) if berr != nil { t.Fatalf("expected no error, got (%s)", berr) } From 48eb42dfa5948e33ea31766103bffe9af86b3c3b Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:20:14 -0400 Subject: [PATCH 15/17] fix: G112 add ReadHeaderTimeout to http.Server --- internal/server/server.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 53b6dcb..054aa86 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -106,8 +106,9 @@ func New(ctx context.Context, c *check.Check, b *builtins.Builtins, p *plugins.P svr := httpServer{ address: ta, server: &http.Server{ - Addr: ta.String(), - Handler: http.HandlerFunc(s.router), + Addr: ta.String(), + Handler: http.HandlerFunc(s.router), + ReadHeaderTimeout: 2 * time.Second, }, } svr.server.SetKeepAlivesEnabled(false) @@ -144,6 +145,7 @@ func New(ctx context.Context, c *check.Check, b *builtins.Builtins, p *plugins.P Addr: ta.String(), Handler: http.HandlerFunc(s.router), // Handler: httpgzip.NewHandler(http.HandlerFunc(s.router), []string{"application/json"}), + ReadHeaderTimeout: 2 * time.Second, }, } @@ -175,7 +177,10 @@ func New(ctx context.Context, c *check.Check, b *builtins.Builtins, p *plugins.P s.svrSockets = append(s.svrSockets, &socketServer{ address: ua, listener: ul, - server: &http.Server{Handler: http.HandlerFunc(s.socketHandler)}, + server: &http.Server{ + ReadHeaderTimeout: 2 * time.Second, + Handler: http.HandlerFunc(s.socketHandler), + }, }) } } From 29f4beebcac61e00f631abae9db020bb5d875567 Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 09:21:56 -0400 Subject: [PATCH 16/17] fix: ioutil deprecation --- internal/builtins/collector/linux/procfs/disk.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/builtins/collector/linux/procfs/disk.go b/internal/builtins/collector/linux/procfs/disk.go index 917154e..ad8b3f5 100644 --- a/internal/builtins/collector/linux/procfs/disk.go +++ b/internal/builtins/collector/linux/procfs/disk.go @@ -11,7 +11,6 @@ package procfs import ( "context" "fmt" - "io/ioutil" "os" "path" "path/filepath" @@ -314,7 +313,7 @@ func (c *Disk) getSectorSize(dev string) uint64 { c.logger.Debug().Str("fn", fn).Msg("checking for sector size") - data, err := ioutil.ReadFile(fn) + data, err := os.ReadFile(fn) if err != nil { c.logger.Debug().Err(err).Str("device", dev).Msg("reading block size, using default") c.sectorSizeCache[dev] = c.sectorSizeDefault From 5bb6c4aca000ab698cf28edfb4e648dd28d22baf Mon Sep 17 00:00:00 2001 From: maier Date: Thu, 11 Aug 2022 17:33:38 -0400 Subject: [PATCH 17/17] v2.5.0 --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12c078d..313d31b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# v2.5.0 + +* fix: prevent `/usr/lib/.build-id` links from being created +* fix: ioutil deprecation +* fix: G112 add ReadHeaderTimeout to http.Server +* fix: gofmt certain files due to comment format +* fix: struct alignment in some test files for generated test snippets +* fix: pass context to fetchPromMetrics +* build(deps): bump github.com/shirou/gopsutil/v3 from 3.22.1 to 3.22.7 +* build(deps): bump github.com/circonus-labs/go-apiclient from 0.7.15 to 0.7.17 +* build(deps): bump github.com/prometheus/common from 0.32.1 to 0.37.0 +* build(deps): bump github.com/spf13/cobra from 1.3.0 to 1.5.0 +* build(deps): bump github.com/spf13/viper from 1.10.1 to 1.12.0 +* build(deps): bump github.com/hashicorp/go-retryablehttp from 0.7.0 to 0.7.1 +* build(deps): bump github.com/rs/zerolog from 1.25.0 to 1.26.1 +* fix: add `v` to version (changelog) +* upd: set prerelease false (goreleaser) + # v2.4.3 * fix: downgrade gopsutil v3.21.8 - build fail - see gopsutil PR 1142