-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
117 lines (93 loc) · 2.79 KB
/
main.go
File metadata and controls
117 lines (93 loc) · 2.79 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main
import (
"fmt"
"github.com/InVisionApp/go-health"
"github.com/InVisionApp/go-health/handlers"
prometheusPlugin "github.com/ProtocolONE/go-micro-plugins/wrapper/monitoring/prometheus"
"github.com/ProtocolONE/mfa-service/pkg"
"github.com/ProtocolONE/mfa-service/pkg/proto"
"github.com/go-redis/redis"
"github.com/kelseyhightower/envconfig"
"github.com/micro/go-micro"
"github.com/micro/go-plugins/client/selector/static"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"
"log"
"net/http"
"os"
"time"
)
type Config struct {
RedisAddr string `envconfig:"REDIS_ADDR" required:"true"`
MetricsPort int `envconfig:"METRICS_PORT" required:"false" default:"8081"`
}
type customHealthCheck struct{}
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
cfg := &Config{}
if err := envconfig.Process("", cfg); err != nil {
logger.Fatal("Config init failed with error", zap.Error(err))
}
r := redis.NewClient(&redis.Options{
Addr: cfg.RedisAddr,
})
defer func() {
err := r.Close()
if err != nil {
logger.Error("redis shutdown with error", zap.Error(err))
}
}()
var service micro.Service
options := []micro.Option{
micro.Name(mfa.ServiceName),
micro.Version(mfa.Version),
micro.WrapHandler(prometheusPlugin.NewHandlerWrapper()),
}
if os.Getenv("MICRO_SELECTOR") == "static" {
log.Println("Use micro selector `static`")
options = append(options, micro.Selector(static.NewSelector()))
}
service = micro.NewService(options...)
logger.Info("Initialize micro service")
service.Init()
err := proto.RegisterMfaServiceHandler(service.Server(), mfa.NewService(r, logger))
if err != nil {
logger.Fatal("Register MfaServiceHandler failed with error", zap.Error(err))
}
initHealth(cfg, logger)
initMetrics()
go func() {
if err = http.ListenAndServe(fmt.Sprintf(":%d", cfg.MetricsPort), nil); err != nil {
logger.Fatal("Metrics listen failed")
}
}()
if err := service.Run(); err != nil {
logger.Fatal("service run failed with error", zap.Error(err))
}
}
func initHealth(cfg *Config, logger *zap.Logger) {
h := health.New()
err := h.AddChecks([]*health.Config{
{
Name: "health-check",
Checker: &customHealthCheck{},
Interval: time.Duration(1) * time.Second,
Fatal: true,
},
})
if err != nil {
logger.Fatal("Health check register failed with error", zap.Error(err))
}
logger.Info("Health check listening on port", zap.Int("port", cfg.MetricsPort))
if err = h.Start(); err != nil {
logger.Fatal("Health check start failed with error", zap.Error(err))
}
http.HandleFunc("/health", handlers.NewJSONHandlerFunc(h, nil))
}
func initMetrics() {
http.Handle("/metrics", promhttp.Handler())
}
func (c *customHealthCheck) Status() (interface{}, error) {
return "ok", nil
}