/
main.go
201 lines (197 loc) · 5.76 KB
/
main.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package main
import (
"flag"
"github.com/gorilla/mux"
et "github.com/lixin9311/EventTracker/eventtracker"
"github.com/lixin9311/lfshook"
"github.com/lixin9311/logrus"
golog "log"
"net"
"net/http"
"net/rpc"
"os"
)
var (
conf *et.Config
configFile = flag.String("c", "config.toml", "Config file in json.")
// Fail safe buffer file
address []string
defaultHandler *et.DefaultHandler
kafka *et.Kafka
log *logrus.Logger
)
func init() {
// Parse flags
flag.Parse()
// open config
conf = et.ParseConfig(*configFile)
// Init log system
log = logrus.New()
log.Formatter = new(logrus.TextFormatter)
// Init log to file
switch conf.Main.Log_file_formatter {
case "json":
log.Hooks.Add(lfshook.NewHook(lfshook.PathMap{
logrus.InfoLevel: conf.Main.Log_file,
logrus.ErrorLevel: conf.Main.Log_file,
logrus.DebugLevel: conf.Main.Log_file,
logrus.PanicLevel: conf.Main.Log_file,
logrus.FatalLevel: conf.Main.Log_file,
logrus.WarnLevel: conf.Main.Log_file,
}, new(logrus.JSONFormatter)))
case "text":
formatter := new(logrus.TextFormatter) // default
formatter.ForceUnColored = true
log.Hooks.Add(lfshook.NewHook(lfshook.PathMap{
logrus.InfoLevel: conf.Main.Log_file,
logrus.ErrorLevel: conf.Main.Log_file,
logrus.DebugLevel: conf.Main.Log_file,
logrus.PanicLevel: conf.Main.Log_file,
logrus.FatalLevel: conf.Main.Log_file,
logrus.WarnLevel: conf.Main.Log_file,
}, formatter))
default:
log.Fatalln("Unrecognized log file formatter:", conf.Main.Log_file_formatter)
}
switch conf.Main.Log_level {
case "debug":
log.Level = logrus.DebugLevel
case "info":
log.Level = logrus.InfoLevel
case "warn":
log.Level = logrus.WarnLevel
case "error":
log.Level = logrus.ErrorLevel
case "fatal":
log.Level = logrus.FatalLevel
case "panic":
log.Level = logrus.PanicLevel
default:
log.Fatalln("Unrecognized log level:", conf.Main.Log_level)
}
// setup backup fi.e
safe_file, err := os.OpenFile(conf.Main.Backup_file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to open backup file:", err)
}
fail_safe := golog.New(safe_file, "", golog.LstdFlags)
// init avro
avro := et.NewAvroInst(log, conf.Avro)
// init kafka
kafka = et.NewKafkaInst(log, conf.Kafka)
defaultHandler = et.NewDefaultHandler(log, fail_safe, kafka, avro)
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Initialization done.")
}
func main() {
var err error
// ~kafka
defer kafka.Destroy()
defer log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Instance down.")
// REST route
r := mux.NewRouter()
r.HandleFunc("/", defaultHandler.HomeHandler)
r.HandleFunc("/event", defaultHandler.EventHandler)
r.HandleFunc("/upload", defaultHandler.UploadHandler)
r.HandleFunc("/ping", et.PingHandler)
// bring up the service
var ln net.Listener
if conf.Front.Enabled == true {
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Front server Enabled.")
ln, err = net.Listen("tcp", conf.Front.Backend_http_listen_addr)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Backend service failed to listen address[", conf.Front.Backend_http_listen_addr, "]:", err)
}
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Http server is listening at:", ln.Addr())
go func() {
// reg service to front
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Registering service to front server:", conf.Front.Service_reg_addr)
conn, err := net.Dial("tcp", conf.Front.Service_reg_addr)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to connect to the front service:", err)
}
rpcClient := rpc.NewClient(conn)
address = []string{"/", "http://" + ln.Addr().String()}
var response error
err = rpcClient.Call("Handle.Update", &address, &response)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to register service:", err)
}
if response != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to register service:", response)
}
rpcClient.Close()
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Registered to the front service.")
}()
defer func() {
// reg service to front
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Unsigning service from front server:", conf.Front.Service_reg_addr)
conn, err := net.Dial("tcp", conf.Front.Service_reg_addr)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to connect to the front service:", err)
}
rpcClient := rpc.NewClient(conn)
var response error
err = rpcClient.Call("Handle.Delete", &address, &response)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Failed to unsign:", err)
}
if response != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Failed to unsign:", response)
}
rpcClient.Close()
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Gracefully unsigned from front serive.")
}()
} else {
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Front service not enabled.")
ln, err = net.Listen("tcp", conf.Main.Http_listen_addr)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Fail to listen:", err)
}
log.WithFields(logrus.Fields{
"module": "main",
}).Infoln("Service listening at:", conf.Main.Http_listen_addr)
}
// err = http.ListenAndServe(":"+conf.MainSetting["port"], r)
err = http.Serve(ln, r)
if err != nil {
log.WithFields(logrus.Fields{
"module": "main",
}).Fatalln("Failed to bring up http server:", err)
}
}