-
Notifications
You must be signed in to change notification settings - Fork 3
/
exporter.go
63 lines (54 loc) · 1.54 KB
/
exporter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package prom
import (
"context"
"fmt"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/waltzofpearls/reckon/config"
"go.uber.org/zap"
)
type Exporter struct {
config *config.Config
logger *zap.Logger
server *http.Server
}
func NewExporter(cf *config.Config, lg *zap.Logger) Exporter {
return Exporter{
config: cf,
logger: lg,
}
}
func RegisterExporterEndpoints() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/metrics", http.StatusSeeOther)
})
http.Handle("/metrics", promhttp.Handler())
}
func (e *Exporter) Start(ctx context.Context) func() error {
return func() error {
e.server = &http.Server{
Addr: e.config.PromExporterAddr,
}
addrField := zap.String("addr", e.config.PromExporterAddr)
e.logger.Info("starting prometheus exporter server...", addrField)
if err := e.server.ListenAndServe(); err != http.ErrServerClosed {
return fmt.Errorf("prometheus exporter server stopped: %w", err)
}
e.logger.Info("prometheus exporter server stopped", addrField)
return nil
}
}
func (e *Exporter) Shutdown(ctx context.Context) func() error {
return func() error {
<-ctx.Done()
e.logger.Info("shutting down prometheus exporter server",
zap.String("addr", e.config.PromExporterAddr))
timeout, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := e.server.Shutdown(timeout); err != nil {
err = fmt.Errorf("failed to gracefully stop prometheus exporter server: %w", err)
}
return nil
}
}