Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/logs/http_test.go
4094 views
1
package logs
2
3
import (
4
"net/http"
5
"net/http/httptest"
6
"strings"
7
"testing"
8
"time"
9
10
"github.com/cortexproject/cortex/pkg/util/test"
11
"github.com/grafana/agent/pkg/util"
12
"github.com/grafana/loki/clients/pkg/promtail/targets/target"
13
"github.com/prometheus/client_golang/prometheus"
14
"github.com/prometheus/common/model"
15
"github.com/stretchr/testify/require"
16
"gopkg.in/yaml.v2"
17
)
18
19
func TestAgent_ListInstancesHandler(t *testing.T) {
20
cfgText := util.Untab(`
21
configs:
22
- name: instance-a
23
positions:
24
filename: /tmp/positions.yaml
25
clients:
26
- url: http://127.0.0.1:80/loki/api/v1/push
27
`)
28
29
var cfg Config
30
31
logger := util.TestLogger(t)
32
l, err := New(prometheus.NewRegistry(), &cfg, logger, false)
33
require.NoError(t, err)
34
defer l.Stop()
35
36
r := httptest.NewRequest("GET", "/agent/api/v1/logs/instances", nil)
37
38
t.Run("no instances", func(t *testing.T) {
39
rr := httptest.NewRecorder()
40
l.ListInstancesHandler(rr, r)
41
expect := `{"status":"success","data":[]}`
42
require.Equal(t, expect, rr.Body.String())
43
})
44
45
dec := yaml.NewDecoder(strings.NewReader(cfgText))
46
dec.SetStrict(true)
47
require.NoError(t, dec.Decode(&cfg))
48
t.Run("non-empty", func(t *testing.T) {
49
require.NoError(t, l.ApplyConfig(&cfg, false))
50
51
expect := `{"status":"success","data":["instance-a"]}`
52
test.Poll(t, time.Second, true, func() interface{} {
53
rr := httptest.NewRecorder()
54
l.ListInstancesHandler(rr, r)
55
return expect == rr.Body.String()
56
})
57
})
58
}
59
60
func TestAgent_ListTargetsHandler(t *testing.T) {
61
cfgText := util.Untab(`
62
configs:
63
- name: instance-a
64
positions:
65
filename: /tmp/positions.yaml
66
clients:
67
- url: http://127.0.0.1:80/loki/api/v1/push
68
`)
69
70
var cfg Config
71
dec := yaml.NewDecoder(strings.NewReader(cfgText))
72
dec.SetStrict(true)
73
require.NoError(t, dec.Decode(&cfg))
74
75
logger := util.TestLogger(t)
76
l, err := New(prometheus.NewRegistry(), &cfg, logger, false)
77
require.NoError(t, err)
78
defer l.Stop()
79
80
r := httptest.NewRequest("GET", "/agent/api/v1/logs/targets", nil)
81
82
t.Run("scrape manager not ready", func(t *testing.T) {
83
rr := httptest.NewRecorder()
84
l.ListTargetsHandler(rr, r)
85
expect := `{"status": "success", "data": []}`
86
require.JSONEq(t, expect, rr.Body.String())
87
require.Equal(t, http.StatusOK, rr.Result().StatusCode)
88
})
89
90
t.Run("scrape manager targets", func(t *testing.T) {
91
rr := httptest.NewRecorder()
92
targets := map[string]TargetSet{
93
"instance-a": mockActiveTargets(),
94
}
95
listTargetsHandler(targets).ServeHTTP(rr, r)
96
expect := `{
97
"status": "success",
98
"data": [
99
{
100
"instance": "instance-a",
101
"target_group": "varlogs",
102
"type": "File",
103
"labels": {
104
"job": "varlogs"
105
},
106
"discovered_labels": {
107
"__address__": "localhost",
108
"__path__": "/var/log/*log",
109
"job": "varlogs"
110
},
111
"ready": true,
112
"details": {
113
"/var/log/alternatives.log": 13386,
114
"/var/log/apport.log": 0,
115
"/var/log/auth.log": 37009,
116
"/var/log/bootstrap.log": 107347,
117
"/var/log/dpkg.log": 374420,
118
"/var/log/faillog": 0,
119
"/var/log/fontconfig.log": 11629,
120
"/var/log/gpu-manager.log": 1541,
121
"/var/log/kern.log": 782582,
122
"/var/log/lastlog": 0,
123
"/var/log/syslog": 788450
124
}
125
}
126
]
127
}`
128
require.JSONEq(t, expect, rr.Body.String())
129
require.Equal(t, http.StatusOK, rr.Result().StatusCode)
130
})
131
}
132
133
func mockActiveTargets() map[string][]target.Target {
134
return map[string][]target.Target{
135
"varlogs": {&mockTarget{}},
136
}
137
}
138
139
type mockTarget struct {
140
}
141
142
func (mt *mockTarget) Type() target.TargetType {
143
return target.TargetType("File")
144
}
145
146
func (mt *mockTarget) DiscoveredLabels() model.LabelSet {
147
return map[model.LabelName]model.LabelValue{
148
"__address__": "localhost",
149
"__path__": "/var/log/*log",
150
"job": "varlogs",
151
}
152
}
153
154
func (mt *mockTarget) Labels() model.LabelSet {
155
return map[model.LabelName]model.LabelValue{
156
"job": "varlogs",
157
}
158
}
159
160
func (mt *mockTarget) Ready() bool {
161
return true
162
}
163
164
func (mt *mockTarget) Details() interface{} {
165
return map[string]int{
166
"/var/log/alternatives.log": 13386,
167
"/var/log/apport.log": 0,
168
"/var/log/auth.log": 37009,
169
"/var/log/bootstrap.log": 107347,
170
"/var/log/dpkg.log": 374420,
171
"/var/log/faillog": 0,
172
"/var/log/fontconfig.log": 11629,
173
"/var/log/gpu-manager.log": 1541,
174
"/var/log/kern.log": 782582,
175
"/var/log/lastlog": 0,
176
"/var/log/syslog": 788450,
177
}
178
}
179
180