Path: blob/main/component/prometheus/scrape/scrape_test.go
4094 views
package scrape12import (3"context"4"net"5"net/http"6"testing"7"time"89"github.com/grafana/agent/component"10"github.com/grafana/agent/component/prometheus"11"github.com/grafana/agent/pkg/cluster"12"github.com/grafana/agent/pkg/river"13"github.com/grafana/agent/pkg/util"14prometheus_client "github.com/prometheus/client_golang/prometheus"15"github.com/prometheus/client_golang/prometheus/promhttp"16"github.com/prometheus/prometheus/model/labels"17"github.com/prometheus/prometheus/storage"18"github.com/rfratto/ckit/memconn"19"github.com/stretchr/testify/require"20)2122func TestRiverConfig(t *testing.T) {23var exampleRiverConfig = `24targets = [{ "target1" = "target1" }]25forward_to = []26scrape_interval = "10s"27job_name = "local"2829bearer_token = "token"30proxy_url = "http://0.0.0.0:11111"31follow_redirects = true32enable_http2 = true3334tls_config {35ca_file = "/path/to/file.ca"36cert_file = "/path/to/file.cert"37key_file = "/path/to/file.key"38server_name = "server_name"39insecure_skip_verify = false40min_version = "TLS13"41}42`4344var args Arguments45err := river.Unmarshal([]byte(exampleRiverConfig), &args)46require.NoError(t, err)47}4849func TestBadRiverConfig(t *testing.T) {50var exampleRiverConfig = `51targets = [{ "target1" = "target1" }]52forward_to = []53scrape_interval = "10s"54job_name = "local"5556bearer_token = "token"57bearer_token_file = "/path/to/file.token"58proxy_url = "http://0.0.0.0:11111"59follow_redirects = true60enable_http2 = true61`6263// Make sure the squashed HTTPClientConfig Validate function is being utilized correctly64var args Arguments65err := river.Unmarshal([]byte(exampleRiverConfig), &args)66require.ErrorContains(t, err, "at most one of bearer_token & bearer_token_file must be configured")67}6869func TestForwardingToAppendable(t *testing.T) {70opts := component.Options{71Logger: util.TestFlowLogger(t),72Registerer: prometheus_client.NewRegistry(),73}7475nilReceivers := []storage.Appendable{nil, nil}7677args := DefaultArguments78args.ForwardTo = nilReceivers7980s, err := New(opts, args)81require.NoError(t, err)8283// Forwarding samples to the nil receivers shouldn't fail.84appender := s.appendable.Appender(context.Background())85_, err = appender.Append(0, labels.FromStrings("foo", "bar"), 0, 0)86require.NoError(t, err)8788err = appender.Commit()89require.NoError(t, err)9091// Update the component with a mock receiver; it should be passed along to the Appendable.92var receivedTs int6493var receivedSamples labels.Labels94fanout := prometheus.NewInterceptor(nil, prometheus.WithAppendHook(func(ref storage.SeriesRef, l labels.Labels, t int64, _ float64, _ storage.Appender) (storage.SeriesRef, error) {95receivedTs = t96receivedSamples = l97return ref, nil98}))99require.NoError(t, err)100args.ForwardTo = []storage.Appendable{fanout}101err = s.Update(args)102require.NoError(t, err)103104// Forwarding a sample to the mock receiver should succeed.105appender = s.appendable.Appender(context.Background())106timestamp := time.Now().Unix()107sample := labels.FromStrings("foo", "bar")108_, err = appender.Append(0, sample, timestamp, 42.0)109require.NoError(t, err)110111err = appender.Commit()112require.NoError(t, err)113114require.Equal(t, receivedTs, timestamp)115require.Len(t, receivedSamples, 1)116require.Equal(t, receivedSamples, sample)117}118119// TestCustomDialer ensures that prometheus.scrape respects the custom dialer120// given to it.121func TestCustomDialer(t *testing.T) {122ctx, cancel := context.WithCancel(context.Background())123defer cancel()124125var (126reg = prometheus_client.NewRegistry()127regHandler = promhttp.HandlerFor(reg, promhttp.HandlerOpts{})128129scrapeTrigger = util.NewWaitTrigger()130131srv = &http.Server{132Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {133scrapeTrigger.Trigger()134regHandler.ServeHTTP(w, r)135}),136}137138memLis = memconn.NewListener(util.TestLogger(t))139)140141go srv.Serve(memLis)142defer srv.Shutdown(ctx)143144var config = `145targets = [{ __address__ = "inmemory:80" }]146forward_to = []147scrape_interval = "100ms"148scrape_timeout = "85ms"149`150var args Arguments151err := river.Unmarshal([]byte(config), &args)152require.NoError(t, err)153154opts := component.Options{155Logger: util.TestFlowLogger(t),156Clusterer: &cluster.Clusterer{157Node: cluster.NewLocalNode("inmemory:80"),158},159Registerer: prometheus_client.NewRegistry(),160DialFunc: func(ctx context.Context, network, address string) (net.Conn, error) {161return memLis.DialContext(ctx)162},163}164165s, err := New(opts, args)166require.NoError(t, err)167go s.Run(ctx)168169// Wait for our scrape to be invoked.170err = scrapeTrigger.Wait(1 * time.Minute)171require.NoError(t, err, "custom dialer was not used")172}173174175