Skip to content

Commit edb3276

Browse files
committed
重构,加入消息时间
1 parent 1211eee commit edb3276

13 files changed

+236
-86
lines changed

.gitignore

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Binaries for programs and plugins
2-
./supervisor-event-listener
2+
supervisor-event-listener
33
*.exe
44
*.dll
55
*.so
@@ -15,4 +15,5 @@
1515
.glide/
1616
.idear
1717
vendor/**/*.yml
18-
vendor/**/.gitignore
18+
vendor/**/.gitignore
19+
build/

Makefile

+39-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,44 @@
1+
LDFLAGS:=-w
2+
BUILD_DIR:=./build/
3+
PROJECT_NAME:=supervisor-event-listener
4+
VERSION:=1.1.0
15

26
install:
3-
sudo supervisorctl stop alert
4-
go build
7+
cp ./supervisor-event-listener /usr/local/bin/
8+
9+
10+
test-integration:
11+
sudo supervisorctl stop supervisor-event-listener
12+
go build
513
sudo cp ./supervisor-event-listener /usr/local/bin/
6-
sudo supervisorctl start alert
14+
sudo cp ./tests/supervisor-app.ini /etc/supervisor.d/
15+
sudo supervisorctl start supervisor-event-listener
16+
sudo supervisorctl update
17+
sudo supervisorctl start sleep-then-exit
18+
19+
20+
clean:
21+
rm -fr $(BUILD_DIR)
22+
23+
24+
release:
25+
GOOS=linux GOARCH=amd64 go build -ldflags $(LDFLAGS)
26+
rm -fr $(BUILD_DIR)/$(PROJECT_NAME)/
27+
mkdir -p $(BUILD_DIR)/$(PROJECT_NAME)/
28+
mv ./supervisor-event-listener $(BUILD_DIR)/$(PROJECT_NAME)/
29+
cp ./supervisor-event-listener.ini $(BUILD_DIR)/$(PROJECT_NAME)/
30+
cd $(BUILD_DIR) && tar -zcvf $(PROJECT_NAME)-$(VERSION).tar.gz $(PROJECT_NAME)
31+
@echo ...done.
32+
733

8-
test:
9-
sudo supervisorctl start test
34+
log:
35+
tmux new-session -d -s dev
36+
tmux split-window -t "dev:0"
37+
tmux split-window -t "dev:0.0" -h
38+
tmux split-window -t "dev:0.2" -h
39+
tmux send-keys -t "dev:0.0" "bash -c 'tail -f /tmp/supervisor-event-listener.log'" Enter
40+
tmux send-keys -t "dev:0.1" "bash -c 'sudo supervisorctl tail -f supervisor-event-listener'" Enter
41+
tmux set-option -g mouse on
42+
tmux attach -t dev
43+
tmux kill-session -t dev
1044

config/config.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package config
22

33
import (
4-
"flag"
54
"fmt"
65
"os"
76
"strings"
@@ -48,10 +47,7 @@ type MailUser struct {
4847
Email []string
4948
}
5049

51-
func ParseConfig() *Config {
52-
var configFile string
53-
flag.StringVar(&configFile, "c", "/etc/supervisor-event-listener.ini", "config file")
54-
flag.Parse()
50+
func ParseConfig(configFile string) *Config {
5551
configFile = strings.TrimSpace(configFile)
5652
if configFile == "" {
5753
Exit("请指定配置文件路径")

event/event.go

+47-2
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,68 @@
11
package event
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
6-
"github.com/ouqiang/supervisor-event-listener/utils"
77
"os"
88
"strconv"
99
"strings"
10+
"time"
11+
12+
"github.com/ouqiang/supervisor-event-listener/utils"
1013
)
1114

1215
// Message 消息格式
1316
type Message struct {
17+
TS time.Time
1418
Header *Header
1519
Payload *Payload
1620
}
1721

22+
func NewMessage(h *Header, p *Payload) Message {
23+
return Message{
24+
TS: time.Now(),
25+
Header: h,
26+
Payload: p,
27+
}
28+
}
29+
1830
func (msg *Message) String() string {
19-
return fmt.Sprintf("Host: %s\nProcess: %s\nPID: %d\nEXITED FROM state: %s", msg.Payload.Ip, msg.Payload.ProcessName, msg.Payload.Pid, msg.Payload.FromState)
31+
tmpl := `Host: %s
32+
Process: %s
33+
PID: %d
34+
EXITED FROM state: %s
35+
Date: %s`
36+
return fmt.Sprintf(tmpl,
37+
msg.Payload.Ip,
38+
msg.Payload.ProcessName,
39+
msg.Payload.Pid,
40+
msg.Payload.FromState,
41+
msg.TS.Format(time.RFC3339),
42+
)
43+
}
2044

45+
func (msg *Message) ToJson(indent ...int) string {
46+
realIndent := 0
47+
if len(indent) > 0 {
48+
realIndent = indent[0]
49+
}
50+
t := ""
51+
switch realIndent {
52+
case 0:
53+
case 1:
54+
t = " "
55+
case 2:
56+
t = " "
57+
case 3:
58+
t = " "
59+
case 4:
60+
t = " "
61+
default:
62+
t = " "
63+
}
64+
_bytes, _ := json.MarshalIndent(msg, "", t)
65+
return string(_bytes)
2166
}
2267

2368
// Header Supervisord触发事件时会先发送Header,根据Header中len字段去读取Payload

listener/listener.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@ import (
44
"bufio"
55
"errors"
66
"fmt"
7+
"log"
8+
"os"
9+
710
"github.com/ouqiang/supervisor-event-listener/event"
811
"github.com/ouqiang/supervisor-event-listener/listener/notify"
912
"github.com/ouqiang/supervisor-event-listener/utils/tmpfslog"
10-
"log"
11-
"os"
1213
)
1314

1415
var (
1516
ErrPayloadLength = errors.New("Header中len长度与实际读取长度不一致")
1617
)
1718

1819
func Start() {
19-
defer func() {
20-
if err := recover(); err != nil {
21-
log.Print("panic", err)
22-
}
23-
}()
24-
listen()
20+
for {
21+
defer func() {
22+
if err := recover(); err != nil {
23+
log.Print("panic", err)
24+
}
25+
}()
26+
listen()
27+
}
2528
}
2629

2730
// 监听事件, 从标准输入获取事件内容
@@ -30,13 +33,13 @@ func listen() {
3033
for {
3134
ready()
3235
header, err := readHeader(reader)
33-
tmpfslog.Info("header:%+v err:%+v", header, err)
36+
tmpfslog.Debug("header:%+v err:%+v", header, err)
3437
if err != nil {
3538
failure(err)
3639
continue
3740
}
3841
payload, err := readPayload(reader, header.Len)
39-
tmpfslog.Info("payloadL%+v err:%+v", payload, err)
42+
tmpfslog.Debug("payloadL%+v err:%+v", payload, err)
4043
if err != nil {
4144
failure(err)
4245
continue

listener/notify/bearychat.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func (this *BearyChat) Send(msg event.Message) error {
1616
timeout := Conf.BearyChat.Timeout
1717

1818
params := map[string]interface{}{
19-
"text": msg.String(),
19+
"text": this.format(msg),
2020
}
2121
if channel != "" {
2222
params["channel"] = channel
@@ -26,17 +26,15 @@ func (this *BearyChat) Send(msg event.Message) error {
2626
if err != nil {
2727
return err
2828
}
29-
tmpfslog.Info("url: %s", url)
30-
tmpfslog.Info("timeout: %d", timeout)
31-
tmpfslog.Info("params: %v", params)
32-
3329
resp := httpclient.PostJson(url, string(body), timeout)
3430
if !resp.IsOK() {
31+
tmpfslog.Error("params: %v err: %v", params, resp.Error())
3532
return resp.Error()
3633
}
3734
return nil
3835
}
3936

4037
func (this *BearyChat) format(msg event.Message) string {
41-
return ""
38+
// return msg.ToJson(4)
39+
return msg.String()
4240
}

listener/notify/notify.go renamed to listener/notify/init.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,31 @@ var (
1515
queue chan event.Message
1616
)
1717

18-
func init() {
19-
Conf = config.ParseConfig()
20-
21-
tmpfslog.Info("loading config: %+v\n", Conf)
18+
func Init(fpath string) error {
19+
tmpfslog.Info("loading config: %s", fpath)
20+
Conf = config.ParseConfig(fpath)
2221
queue = make(chan event.Message, 10)
23-
go start()
22+
return nil
2423
}
2524

2625
type Notifiable interface {
2726
Send(event.Message) error
2827
}
2928

3029
func Push(header *event.Header, payload *event.Payload) {
31-
queue <- event.Message{header, payload}
30+
queue <- event.NewMessage(header, payload)
31+
}
32+
33+
func Start() {
34+
go start()
3235
}
3336

3437
func start() {
3538
var message event.Message
3639
var notifyHandler Notifiable
3740
for {
3841
message = <-queue
39-
tmpfslog.Info("%+v\n", message)
42+
tmpfslog.Debug("message: %+v\n", message)
4043
switch Conf.NotifyType {
4144
case "mail":
4245
notifyHandler = &Mail{}

supervisor-event-listener.go

+28-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
11
package main
22

33
import (
4+
"flag"
5+
"log"
6+
"os"
7+
48
"github.com/ouqiang/supervisor-event-listener/listener"
9+
"github.com/ouqiang/supervisor-event-listener/listener/notify"
10+
"github.com/ouqiang/supervisor-event-listener/utils/tmpfslog"
511
)
612

713
func main() {
8-
for {
9-
listener.Start()
14+
defer func() {
15+
if err := recover(); err != nil {
16+
log.Print("panic", err)
17+
os.Exit(127)
18+
}
19+
}()
20+
21+
var configFile string
22+
var dryRun bool
23+
flag.StringVar(&configFile, "c", "/etc/supervisor-event-listener.ini", "config file")
24+
flag.BoolVar(&dryRun, "dryRun", false, "dry run, lint config file")
25+
flag.Parse()
26+
err := notify.Init(configFile)
27+
if err != nil {
28+
tmpfslog.Error("notify init failed. err: %+v", err)
29+
os.Exit(127)
1030
}
31+
if dryRun {
32+
return
33+
}
34+
35+
notify.Start()
36+
listener.Start()
1137
}

supervisor-event-listener.ini

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[default]
2-
# 通知类型 mail,slack,webhook 只能选择一种
2+
# 通知类型 mail,slack,webhook,bearychat 只能选择一种
33
notify_type = mail
44

55
# 邮件服务器配置
@@ -19,6 +19,6 @@ slack.channel = exception
1919
webhook_url = http://my.webhook.com
2020

2121
# BearyChat
22-
bearychat.webhook_url = https://xx/xx
23-
bearychat.channel =
22+
bearychat.webhook_url = https://hook.bearychat.com/=xxx/xxxxx/xxxx
23+
bearychat.channel = alert
2424
bearychat.timeout = 8

supervisor-event-listener.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ channel = "exception"
2020

2121
# Custom WebHook
2222
[webhook]
23-
url = "http://my.webhook.com"
23+
url = "https://my.webhook.com"
2424

2525

2626
# BearyChat

tests/supervisor-app.ini

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[eventlistener:supervisor-event-listener]
2+
command=/usr/local/bin/supervisor-event-listener
3+
-c /etc/supervisor-event-listener.ini
4+
events=
5+
PROCESS_STATE_EXITED,
6+
PROCESS_STATE_FATAL,
7+
PROCESS_STATE_STOPPED,
8+
PROCESS_STATE_RUNNING
9+
user=nobody
10+
group=nobody
11+
12+
[program:sleep-then-exit]
13+
command=sleep 3 && exit 1

0 commit comments

Comments
 (0)