Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/scrape/scrape_test.go
4094 views
1
package scrape
2
3
import (
4
"context"
5
"net"
6
"net/http"
7
"testing"
8
"time"
9
10
"github.com/grafana/agent/component"
11
"github.com/grafana/agent/component/prometheus"
12
"github.com/grafana/agent/pkg/cluster"
13
"github.com/grafana/agent/pkg/river"
14
"github.com/grafana/agent/pkg/util"
15
prometheus_client "github.com/prometheus/client_golang/prometheus"
16
"github.com/prometheus/client_golang/prometheus/promhttp"
17
"github.com/prometheus/prometheus/model/labels"
18
"github.com/prometheus/prometheus/storage"
19
"github.com/rfratto/ckit/memconn"
20
"github.com/stretchr/testify/require"
21
)
22
23
func TestRiverConfig(t *testing.T) {
24
var exampleRiverConfig = `
25
targets = [{ "target1" = "target1" }]
26
forward_to = []
27
scrape_interval = "10s"
28
job_name = "local"
29
30
bearer_token = "token"
31
proxy_url = "http://0.0.0.0:11111"
32
follow_redirects = true
33
enable_http2 = true
34
35
tls_config {
36
ca_file = "/path/to/file.ca"
37
cert_file = "/path/to/file.cert"
38
key_file = "/path/to/file.key"
39
server_name = "server_name"
40
insecure_skip_verify = false
41
min_version = "TLS13"
42
}
43
`
44
45
var args Arguments
46
err := river.Unmarshal([]byte(exampleRiverConfig), &args)
47
require.NoError(t, err)
48
}
49
50
func TestBadRiverConfig(t *testing.T) {
51
var exampleRiverConfig = `
52
targets = [{ "target1" = "target1" }]
53
forward_to = []
54
scrape_interval = "10s"
55
job_name = "local"
56
57
bearer_token = "token"
58
bearer_token_file = "/path/to/file.token"
59
proxy_url = "http://0.0.0.0:11111"
60
follow_redirects = true
61
enable_http2 = true
62
`
63
64
// Make sure the squashed HTTPClientConfig Validate function is being utilized correctly
65
var args Arguments
66
err := river.Unmarshal([]byte(exampleRiverConfig), &args)
67
require.ErrorContains(t, err, "at most one of bearer_token & bearer_token_file must be configured")
68
}
69
70
func TestForwardingToAppendable(t *testing.T) {
71
opts := component.Options{
72
Logger: util.TestFlowLogger(t),
73
Registerer: prometheus_client.NewRegistry(),
74
}
75
76
nilReceivers := []storage.Appendable{nil, nil}
77
78
args := DefaultArguments
79
args.ForwardTo = nilReceivers
80
81
s, err := New(opts, args)
82
require.NoError(t, err)
83
84
// Forwarding samples to the nil receivers shouldn't fail.
85
appender := s.appendable.Appender(context.Background())
86
_, err = appender.Append(0, labels.FromStrings("foo", "bar"), 0, 0)
87
require.NoError(t, err)
88
89
err = appender.Commit()
90
require.NoError(t, err)
91
92
// Update the component with a mock receiver; it should be passed along to the Appendable.
93
var receivedTs int64
94
var receivedSamples labels.Labels
95
fanout := prometheus.NewInterceptor(nil, prometheus.WithAppendHook(func(ref storage.SeriesRef, l labels.Labels, t int64, _ float64, _ storage.Appender) (storage.SeriesRef, error) {
96
receivedTs = t
97
receivedSamples = l
98
return ref, nil
99
}))
100
require.NoError(t, err)
101
args.ForwardTo = []storage.Appendable{fanout}
102
err = s.Update(args)
103
require.NoError(t, err)
104
105
// Forwarding a sample to the mock receiver should succeed.
106
appender = s.appendable.Appender(context.Background())
107
timestamp := time.Now().Unix()
108
sample := labels.FromStrings("foo", "bar")
109
_, err = appender.Append(0, sample, timestamp, 42.0)
110
require.NoError(t, err)
111
112
err = appender.Commit()
113
require.NoError(t, err)
114
115
require.Equal(t, receivedTs, timestamp)
116
require.Len(t, receivedSamples, 1)
117
require.Equal(t, receivedSamples, sample)
118
}
119
120
// TestCustomDialer ensures that prometheus.scrape respects the custom dialer
121
// given to it.
122
func TestCustomDialer(t *testing.T) {
123
ctx, cancel := context.WithCancel(context.Background())
124
defer cancel()
125
126
var (
127
reg = prometheus_client.NewRegistry()
128
regHandler = promhttp.HandlerFor(reg, promhttp.HandlerOpts{})
129
130
scrapeTrigger = util.NewWaitTrigger()
131
132
srv = &http.Server{
133
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
134
scrapeTrigger.Trigger()
135
regHandler.ServeHTTP(w, r)
136
}),
137
}
138
139
memLis = memconn.NewListener(util.TestLogger(t))
140
)
141
142
go srv.Serve(memLis)
143
defer srv.Shutdown(ctx)
144
145
var config = `
146
targets = [{ __address__ = "inmemory:80" }]
147
forward_to = []
148
scrape_interval = "100ms"
149
scrape_timeout = "85ms"
150
`
151
var args Arguments
152
err := river.Unmarshal([]byte(config), &args)
153
require.NoError(t, err)
154
155
opts := component.Options{
156
Logger: util.TestFlowLogger(t),
157
Clusterer: &cluster.Clusterer{
158
Node: cluster.NewLocalNode("inmemory:80"),
159
},
160
Registerer: prometheus_client.NewRegistry(),
161
DialFunc: func(ctx context.Context, network, address string) (net.Conn, error) {
162
return memLis.DialContext(ctx)
163
},
164
}
165
166
s, err := New(opts, args)
167
require.NoError(t, err)
168
go s.Run(ctx)
169
170
// Wait for our scrape to be invoked.
171
err = scrapeTrigger.Wait(1 * time.Minute)
172
require.NoError(t, err, "custom dialer was not used")
173
}
174
175