使用prometheus库写一个网站监控的exporter,定时请求baidu和b站的首页,网站http请求的超时时间设置为100毫秒。
提供2个指标
1、http的请求时间(gauge)。
2、http请求出错的次数(counter)
对接prometheus并观察数据
func genGauge(url string) prometheus.Gauge {
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "lyzd",
Subsystem: "monitor",
Name: "web_req",
Help: "request web time",
ConstLabels: map[string]string{"url": url},
})
go func() {
client := &http.Client{
Timeout: time.Millisecond * 100,
}
ticker := time.NewTicker(3 * time.Second)
for range ticker.C {
begin := time.Now()
_, err := client.Get(url)
end := time.Now()
if err != nil {
fmt.Println("web error", err.Error())
continue
}
req_time := end.Sub(begin)
gauge.Set(float64(req_time / 1000 / 1000))
}
}()
return gauge
}
func main() {
//生成指标实例
//prometheus.NewCounter(),NewGauge(),NewSummary(),NewHistogram()
baidu := "https://www.baidu.com/"
bili := "https://www.bilibili.com"
prometheus.MustRegister(genGauge(baidu), genGauge(bili), genCounter(baidu), genCounter(bili))
http.Handle("/metrics", promhttp.Handler())
err := http.ListenAndServe(":9001", nil)
if err != nil {
fmt.Printf("server start error: %s\n", err.Error())
}
}
func genCounter(url string) prometheus.Counter {
counter := prometheus.NewCounter(prometheus.CounterOpts{
Namespace: "lyzd",
Subsystem: "monitor",
Name: "web_counter",
Help: "request web error num",
ConstLabels: map[string]string{"url": url},
})
go func() {
client := &http.Client{
Timeout: time.Millisecond * 100,
}
ticker := time.NewTicker(3 * time.Second)
for range ticker.C {
_, err := client.Get(url)
if err != nil {
fmt.Println("web error", err.Error())
counter.Add(1)
}
}
}()
return counter
}