/
lib.go
134 lines (109 loc) · 2.46 KB
/
lib.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
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package service
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/digitalcircle-com-br/buildinfo"
"github.com/go-redis/redis/v8"
"github.com/gorilla/mux"
"gopkg.in/yaml.v2"
)
type EMPTY_TYPE struct{}
func ctx() (context.Context, context.CancelFunc) {
return context.WithTimeout(context.Background(), time.Second*10)
}
func IsDocker() bool {
_, err := os.Stat("/.dockerenv")
return err == nil
}
var svcName = ""
var sigCh = make(chan os.Signal)
var rediscli *redis.Client
var router *mux.Router
var onStop = func() {
Log("Terminating")
}
func Init(s string) {
svcName = s
signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT)
redisurl := os.Getenv("REDIS")
if redisurl == "" {
redisurl = "redis://redis:6379"
}
opts, err := redis.ParseURL(redisurl)
if err != nil {
panic(err)
}
rediscli = redis.NewClient(opts)
context, cancel := ctx()
defer cancel()
_, err = rediscli.Ping(context).Result()
if err != nil {
//TODO: improve error msg
panic(err)
}
router = mux.NewRouter()
router.Path("/__test").Methods(http.MethodGet).HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(buildinfo.String()))
})
router.Path("/__help").Methods(http.MethodGet).HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-type", "application/json")
json.NewEncoder(w).Encode(apiEntries)
})
go func() {
<-sigCh
err := rediscli.Close()
Err(err)
onStop()
if server != nil {
HttpStop()
}
os.Exit(0)
}()
if IsDocker() {
Log("Initiating Container for: %s", svcName)
} else {
Log("Initiating Service: %s", svcName)
}
Log(buildinfo.String())
}
var cfg = []byte{}
func Config(i interface{}) chan struct{} {
ret := make(chan struct{})
go func() {
for {
lastCfg := cfg
cfgstr, err := DataGet(svcName)
if err == nil {
cfgbs := []byte(cfgstr)
if !bytes.Equal(cfgbs, lastCfg) {
cfg = cfgbs
yaml.Unmarshal(cfg, i)
ret <- struct{}{}
}
}
time.Sleep(time.Duration(10) * time.Second)
}
}()
return ret
}
func OnStop(f func()) {
onStop = f
}
func LockMainRoutine() {
for {
time.Sleep(time.Minute)
}
}
func ServerTiming(w http.ResponseWriter, metric string, desc string, t time.Time) {
dur := time.Since(t)
v := float64(dur.Nanoseconds()) / float64(1000000)
w.Header().Add("Server-Timing", fmt.Sprintf("%s;desc=\"%s\";dur=%v", metric, desc, v))
Debug("Server time: %s(%s): %v", desc, metric, v)
}