github.com/netdata/go.d.plugin@v0.58.1/pkg/prometheus/client_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package prometheus 4 5 import ( 6 "bytes" 7 "compress/gzip" 8 "net/http" 9 "net/http/httptest" 10 "os" 11 "strings" 12 "testing" 13 14 "github.com/netdata/go.d.plugin/pkg/prometheus/selector" 15 "github.com/netdata/go.d.plugin/pkg/web" 16 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 ) 20 21 var ( 22 testData, _ = os.ReadFile("testdata/testdata.txt") 23 testDataNoMeta, _ = os.ReadFile("testdata/testdata.nometa.txt") 24 ) 25 26 func Test_testClientDataIsValid(t *testing.T) { 27 for name, data := range map[string][]byte{ 28 "testData": testData, 29 } { 30 require.NotNilf(t, data, name) 31 } 32 } 33 34 func TestPrometheus404(t *testing.T) { 35 tsMux := http.NewServeMux() 36 tsMux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { 37 w.WriteHeader(404) 38 }) 39 ts := httptest.NewServer(tsMux) 40 defer ts.Close() 41 42 req := web.Request{URL: ts.URL + "/metrics"} 43 prom := New(http.DefaultClient, req) 44 res, err := prom.ScrapeSeries() 45 46 assert.Error(t, err) 47 assert.Nil(t, res) 48 } 49 50 func TestPrometheusPlain(t *testing.T) { 51 tsMux := http.NewServeMux() 52 tsMux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { 53 _, _ = w.Write(testData) 54 }) 55 ts := httptest.NewServer(tsMux) 56 defer ts.Close() 57 58 req := web.Request{URL: ts.URL + "/metrics"} 59 prom := New(http.DefaultClient, req) 60 res, err := prom.ScrapeSeries() 61 62 assert.NoError(t, err) 63 verifyTestData(t, res) 64 } 65 66 func TestPrometheusPlainWithSelector(t *testing.T) { 67 tsMux := http.NewServeMux() 68 tsMux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { 69 _, _ = w.Write(testData) 70 }) 71 ts := httptest.NewServer(tsMux) 72 defer ts.Close() 73 74 req := web.Request{URL: ts.URL + "/metrics"} 75 sr, err := selector.Parse("go_gc*") 76 require.NoError(t, err) 77 prom := NewWithSelector(http.DefaultClient, req, sr) 78 79 res, err := prom.ScrapeSeries() 80 require.NoError(t, err) 81 82 for _, v := range res { 83 assert.Truef(t, strings.HasPrefix(v.Name(), "go_gc"), v.Name()) 84 } 85 } 86 87 func TestPrometheusGzip(t *testing.T) { 88 counter := 0 89 rawTestData := [][]byte{testData, testDataNoMeta} 90 tsMux := http.NewServeMux() 91 tsMux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { 92 w.Header().Set("Content-Encoding", "gzip") 93 w.WriteHeader(200) 94 gz := new(bytes.Buffer) 95 ww := gzip.NewWriter(gz) 96 _, _ = ww.Write(rawTestData[counter]) 97 _ = ww.Close() 98 _, _ = gz.WriteTo(w) 99 counter++ 100 }) 101 ts := httptest.NewServer(tsMux) 102 defer ts.Close() 103 104 req := web.Request{URL: ts.URL + "/metrics"} 105 prom := New(http.DefaultClient, req) 106 107 for i := 0; i < 2; i++ { 108 res, err := prom.ScrapeSeries() 109 assert.NoError(t, err) 110 verifyTestData(t, res) 111 } 112 } 113 114 func TestPrometheusReadFromFile(t *testing.T) { 115 req := web.Request{URL: "file://testdata/testdata.txt"} 116 prom := NewWithSelector(http.DefaultClient, req, nil) 117 118 for i := 0; i < 2; i++ { 119 res, err := prom.ScrapeSeries() 120 assert.NoError(t, err) 121 verifyTestData(t, res) 122 } 123 } 124 125 func verifyTestData(t *testing.T, ms Series) { 126 assert.Equal(t, 410, len(ms)) 127 assert.Equal(t, "go_gc_duration_seconds", ms[0].Labels.Get("__name__")) 128 assert.Equal(t, "0.25", ms[0].Labels.Get("quantile")) 129 assert.InDelta(t, 4.9351e-05, ms[0].Value, 0.0001) 130 131 notExistYet := ms.FindByName("not_exist_yet") 132 assert.NotNil(t, notExistYet) 133 assert.Len(t, notExistYet, 0) 134 135 targetInterval := ms.FindByName("prometheus_target_interval_length_seconds") 136 assert.Len(t, targetInterval, 5) 137 }