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  }