Skip to content

Commit 2f54094

Browse files
committed
feat: add test for metrics part
1 parent 8164e98 commit 2f54094

File tree

3 files changed

+143
-14
lines changed

3 files changed

+143
-14
lines changed

main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"flag"
5+
"github.com/prometheus/client_golang/prometheus"
56
"github.com/prometheus/client_golang/prometheus/promhttp"
67
"log"
78
"net/http"
@@ -37,7 +38,7 @@ func main() {
3738
flag.Parse()
3839

3940
sitest.LoadConfig()
40-
sitest.Metrics.Register()
41+
sitest.Metrics.Register(prometheus.DefaultRegisterer)
4142

4243
log.Printf("Start querying sites...")
4344
for site := range sitest.Sites {

metrics.go

+16-13
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,55 @@ import (
66

77
// PromCollectors has instances of Prometheus Collectors
88
type PromCollectors struct {
9-
count *prometheus.CounterVec
10-
error *prometheus.CounterVec
11-
code *prometheus.GaugeVec
12-
duration *prometheus.HistogramVec
13-
length *prometheus.GaugeVec
14-
hash *prometheus.GaugeVec
9+
count *prometheus.CounterVec
10+
error *prometheus.CounterVec
11+
code *prometheus.GaugeVec
12+
duration *prometheus.HistogramVec
13+
length *prometheus.GaugeVec
14+
hash *prometheus.GaugeVec
15+
registerer prometheus.Registerer
1516
}
1617

1718
// Register registers all collectors
18-
func (promCollectors *PromCollectors) Register() {
19+
func (promCollectors *PromCollectors) Register(registerer prometheus.Registerer) {
20+
21+
promCollectors.registerer = registerer
1922

2023
promCollectors.count = prometheus.NewCounterVec(prometheus.CounterOpts{
2124
Name: "sitest_count",
2225
Help: "Total number of performed check",
2326
}, []string{"site"})
24-
prometheus.MustRegister(promCollectors.count)
27+
registerer.MustRegister(promCollectors.count)
2528

2629
promCollectors.error = prometheus.NewCounterVec(prometheus.CounterOpts{
2730
Name: "sitest_error",
2831
Help: "Total number of error",
2932
}, []string{"site"})
30-
prometheus.MustRegister(promCollectors.error)
33+
registerer.MustRegister(promCollectors.error)
3134

3235
promCollectors.code = prometheus.NewGaugeVec(prometheus.GaugeOpts{
3336
Name: "sitest_code",
3437
Help: "Response code",
3538
}, []string{"site"})
36-
prometheus.MustRegister(promCollectors.code)
39+
registerer.MustRegister(promCollectors.code)
3740

3841
promCollectors.duration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
3942
Name: "sitest_duration_seconds",
4043
Help: "Histogram of request duration",
4144
}, []string{"site"})
42-
prometheus.MustRegister(promCollectors.duration)
45+
registerer.MustRegister(promCollectors.duration)
4346

4447
promCollectors.length = prometheus.NewGaugeVec(prometheus.GaugeOpts{
4548
Name: "sitest_length",
4649
Help: "Page length",
4750
}, []string{"site"})
48-
prometheus.MustRegister(promCollectors.length)
51+
registerer.MustRegister(promCollectors.length)
4952

5053
promCollectors.hash = prometheus.NewGaugeVec(prometheus.GaugeOpts{
5154
Name: "sitest_hash",
5255
Help: "Page hash",
5356
}, []string{"site"})
54-
prometheus.MustRegister(promCollectors.hash)
57+
registerer.MustRegister(promCollectors.hash)
5558

5659
}
5760

metrics_test.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"github.com/prometheus/client_golang/prometheus"
6+
"github.com/prometheus/client_golang/prometheus/promhttp"
7+
"github.com/stretchr/testify/assert"
8+
"io/ioutil"
9+
"net/http"
10+
"net/http/httptest"
11+
"testing"
12+
)
13+
14+
func TestMetricCounting(t *testing.T) {
15+
assert := assert.New(t)
16+
17+
dr := prometheus.NewRegistry()
18+
var reg prometheus.Registerer = dr
19+
var gat prometheus.Gatherer = dr
20+
21+
promColl := PromCollectors{}
22+
promColl.Register(reg)
23+
24+
result := Result{StatusCode: 200, Length: 5, Duration: 6, Hash: 7}
25+
promColl.Update("my-site.example.com", result, nil)
26+
27+
srv := httptest.NewServer(promhttp.HandlerFor(gat, promhttp.HandlerOpts{}))
28+
defer srv.Close()
29+
resp, _ := http.Get(srv.URL)
30+
31+
assert.Equal(resp.StatusCode, 200, "response from prometheus handler")
32+
33+
defer resp.Body.Close()
34+
body, _ := ioutil.ReadAll(resp.Body)
35+
36+
expected_body := `# HELP sitest_code Response code
37+
# TYPE sitest_code gauge
38+
sitest_code{site="my-site.example.com"} 200
39+
# HELP sitest_count Total number of performed check
40+
# TYPE sitest_count counter
41+
sitest_count{site="my-site.example.com"} 1
42+
# HELP sitest_duration_seconds Histogram of request duration
43+
# TYPE sitest_duration_seconds histogram
44+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.005"} 1
45+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.01"} 1
46+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.025"} 1
47+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.05"} 1
48+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.1"} 1
49+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.25"} 1
50+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.5"} 1
51+
sitest_duration_seconds_bucket{site="my-site.example.com",le="1"} 1
52+
sitest_duration_seconds_bucket{site="my-site.example.com",le="2.5"} 1
53+
sitest_duration_seconds_bucket{site="my-site.example.com",le="5"} 1
54+
sitest_duration_seconds_bucket{site="my-site.example.com",le="10"} 1
55+
sitest_duration_seconds_bucket{site="my-site.example.com",le="+Inf"} 1
56+
sitest_duration_seconds_sum{site="my-site.example.com"} 6e-09
57+
sitest_duration_seconds_count{site="my-site.example.com"} 1
58+
# HELP sitest_hash Page hash
59+
# TYPE sitest_hash gauge
60+
sitest_hash{site="my-site.example.com"} 7
61+
# HELP sitest_length Page length
62+
# TYPE sitest_length gauge
63+
sitest_length{site="my-site.example.com"} 5
64+
`
65+
assert.Equal(string(body[:]), expected_body, "expected_body")
66+
67+
}
68+
69+
func TestMetricError(t *testing.T) {
70+
assert := assert.New(t)
71+
72+
dr := prometheus.NewRegistry()
73+
var reg prometheus.Registerer = dr
74+
var gat prometheus.Gatherer = dr
75+
76+
promColl := PromCollectors{}
77+
promColl.Register(reg)
78+
79+
result := Result{}
80+
promColl.Update("my-site.example.com", result, errors.New("test-error"))
81+
82+
srv := httptest.NewServer(promhttp.HandlerFor(gat, promhttp.HandlerOpts{}))
83+
defer srv.Close()
84+
resp, _ := http.Get(srv.URL)
85+
86+
assert.Equal(resp.StatusCode, 200, "response from prometheus handler")
87+
88+
defer resp.Body.Close()
89+
body, _ := ioutil.ReadAll(resp.Body)
90+
91+
expected_body := `# HELP sitest_code Response code
92+
# TYPE sitest_code gauge
93+
sitest_code{site="my-site.example.com"} 0
94+
# HELP sitest_count Total number of performed check
95+
# TYPE sitest_count counter
96+
sitest_count{site="my-site.example.com"} 1
97+
# HELP sitest_duration_seconds Histogram of request duration
98+
# TYPE sitest_duration_seconds histogram
99+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.005"} 1
100+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.01"} 1
101+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.025"} 1
102+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.05"} 1
103+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.1"} 1
104+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.25"} 1
105+
sitest_duration_seconds_bucket{site="my-site.example.com",le="0.5"} 1
106+
sitest_duration_seconds_bucket{site="my-site.example.com",le="1"} 1
107+
sitest_duration_seconds_bucket{site="my-site.example.com",le="2.5"} 1
108+
sitest_duration_seconds_bucket{site="my-site.example.com",le="5"} 1
109+
sitest_duration_seconds_bucket{site="my-site.example.com",le="10"} 1
110+
sitest_duration_seconds_bucket{site="my-site.example.com",le="+Inf"} 1
111+
sitest_duration_seconds_sum{site="my-site.example.com"} 0
112+
sitest_duration_seconds_count{site="my-site.example.com"} 1
113+
# HELP sitest_error Total number of error
114+
# TYPE sitest_error counter
115+
sitest_error{site="my-site.example.com"} 1
116+
# HELP sitest_hash Page hash
117+
# TYPE sitest_hash gauge
118+
sitest_hash{site="my-site.example.com"} 0
119+
# HELP sitest_length Page length
120+
# TYPE sitest_length gauge
121+
sitest_length{site="my-site.example.com"} 0
122+
`
123+
assert.Equal(string(body[:]), expected_body, "expected_body")
124+
125+
}

0 commit comments

Comments
 (0)