UlricQin 4 years ago
commit a11813f4b2

@ -139,4 +139,15 @@
- 使用etc/nginx.conf替换原来的nginx.conf - 使用etc/nginx.conf替换原来的nginx.conf
- n9e-prober替换旧的n9e-prober - n9e-prober替换旧的n9e-prober
- n9e-agentd替换n9e-agent - n9e-agentd替换n9e-agent
- n9e-server替换n9e-rdb、n9e-ams、n9e-job、n9e-monapi、n9e-transfer、n9e-judge - n9e-server替换n9e-rdb、n9e-ams、n9e-job、n9e-monapi、n9e-transfer、n9e-judge
4.0.1
升级内容:
- 修复消息通知的问题
重新安装:见 https://n9e.didiyun.com/docs/install/binary/
升级方法:
- 将 *.tpl 文件放到 etc/tpl 下
- 替换etc/server.yml
- 替换n9e-server

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# release version # release version
version=4.0.0 version=4.0.1
CWD=$(cd $(dirname $0)/; pwd) CWD=$(cd $(dirname $0)/; pwd)
cd $CWD cd $CWD
@ -206,9 +206,10 @@ exec()
params=${@:2} params=${@:2}
if [ ${#2} -gt 0 ]; then if [ ${#2} -gt 0 ]; then
for param in $params for mod in $params
do do
$1 $param mod=${mod#n9e-}
$1 $mod
if [ "x${mod}" = "xall" ]; then if [ "x${mod}" = "xall" ]; then
break break
fi fi

@ -43,8 +43,8 @@ report:
fields: fields:
cpu: cat /proc/cpuinfo | grep processor | wc -l cpu: cat /proc/cpuinfo | grep processor | wc -l
mem: cat /proc/meminfo | grep MemTotal | awk '{printf "%dGi", $2/1024/1024}' mem: cat /proc/meminfo | grep MemTotal | awk '{printf "%.1fGi", $2/1024/1024}'
disk: df -m | grep '/dev/' | grep -v '/var/lib' | grep -v tmpfs | awk '{sum += $2};END{printf "%dGi", sum/1024}' disk: df -m | grep '/dev/' | grep -v '/var/lib' | grep -v tmpfs | awk '{sum += $2};END{printf "%.1fGi", sum/1024}'
sys: sys:
# timeout in ms # timeout in ms

@ -61,33 +61,13 @@ http {
gzip_vary off; gzip_vary off;
gzip_disable "MSIE [1-6]\."; gzip_disable "MSIE [1-6]\.";
upstream n9e.rdb { upstream n9e.server {
server 127.0.0.1:8000;
keepalive 60;
}
upstream n9e.ams {
server 127.0.0.1:8000;
keepalive 60;
}
upstream n9e.job {
server 127.0.0.1:8000;
keepalive 60;
}
upstream n9e.monapi {
server 127.0.0.1:8000;
keepalive 60;
}
upstream n9e.transfer {
server 127.0.0.1:8000; server 127.0.0.1:8000;
keepalive 60; keepalive 60;
} }
upstream n9e.index { upstream n9e.index {
server 127.0.0.1:8000; server 127.0.0.1:8012;
keepalive 60; keepalive 60;
} }
@ -112,27 +92,27 @@ http {
} }
location /api/rdb { location /api/rdb {
proxy_pass http://n9e.rdb; proxy_pass http://n9e.server;
} }
location /api/ams { location /api/ams {
proxy_pass http://n9e.ams; proxy_pass http://n9e.server;
} }
location /api/job { location /api/job {
proxy_pass http://n9e.job; proxy_pass http://n9e.server;
} }
location /api/mon { location /api/mon {
proxy_pass http://n9e.monapi; proxy_pass http://n9e.server;
} }
location /api/index { location /api/index {
proxy_pass http://n9e.index; proxy_pass http://n9e.server;
} }
location /api/transfer { location /api/transfer {
proxy_pass http://n9e.transfer; proxy_pass http://n9e.server;
} }
} }

@ -19,6 +19,7 @@ http:
tokens: tokens:
- rdb-builtin-token - rdb-builtin-token
- ams-builtin-token
redis: redis:
# as queue # as queue
@ -120,9 +121,13 @@ transfer:
seriesLimit: 0 seriesLimit: 0
docsLimit: 0 docsLimit: 0
daysLimit: 7 # max query time daysLimit: 7 # max query time
# https://m3db.github.io/m3/m3db/architecture/consistencylevels/ # https://m3db.github.io/m3/m3db/architecture/consistencylevels/
writeConsistencyLevel: "majority" # one|majority|all writeConsistencyLevel: "majority" # one|majority|all
readConsistencyLevel: "unstrict_majority" # one|unstrict_majority|majority|all readConsistencyLevel: "unstrict_majority" # one|unstrict_majority|majority|all
writeTimeout: 5s
fetchTimeout: 5s
connectTimeout: 5s
config: config:
service: service:
# KV environment, zone, and service from which to write/read KV data (placement # KV environment, zone, and service from which to write/read KV data (placement
@ -195,4 +200,4 @@ judge:
wechat: wechat:
corp_id: "xxxxxxxxxxxxx" corp_id: "xxxxxxxxxxxxx"
agent_id: 1000000 agent_id: 1000000
secret: "xxxxxxxxxxxxxxxxx" secret: "xxxxxxxxxxxxxxxxx"

@ -17,5 +17,8 @@ Restart=always
RestartSec=1 RestartSec=1
StartLimitInterval=0 StartLimitInterval=0
# LimitNOFILE=60000
# LimitNPROC=10000
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

@ -58,7 +58,7 @@ func getConfigFile(name, ext string) (string, error) {
} }
func init() { func init() {
filename, err := getConfigFile("login-code-sms", "tpl") filename, err := getConfigFile("tpl/login-code-sms", "tpl")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -68,7 +68,7 @@ func init() {
log.Fatalf("open %s err: %s", filename, err) log.Fatalf("open %s err: %s", filename, err)
} }
filename, err = getConfigFile("login-code-email", "tpl") filename, err = getConfigFile("tpl/login-code-email", "tpl")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -77,7 +77,7 @@ func init() {
log.Fatalf("open %s err: %s", filename, err) log.Fatalf("open %s err: %s", filename, err)
} }
filename, err = getConfigFile("password-changed-email", "tpl") filename, err = getConfigFile("tpl/password-changed-email", "tpl")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

@ -54,6 +54,7 @@ func DoNotify(isUpgrade bool, events ...*models.Event) {
notifyTypes := config.Config.Monapi.Notify[prio] notifyTypes := config.Config.Monapi.Notify[prio]
for i := 0; i < len(notifyTypes); i++ { for i := 0; i < len(notifyTypes); i++ {
var err error
switch notifyTypes[i] { switch notifyTypes[i] {
case "voice": case "voice":
if events[0].EventType == models.ALERT { if events[0].EventType == models.ALERT {
@ -62,34 +63,36 @@ func DoNotify(isUpgrade bool, events ...*models.Event) {
tos = append(tos, users[j].Phone) tos = append(tos, users[j].Phone)
} }
send(slice.Set(tos), events[0].Sname, "", "voice") err = send(slice.Set(tos), events[0].Sname, "", "voice")
} }
case "sms": case "sms":
tos := []string{} tos := []string{}
for j := 0; j < len(users); j++ { for j := 0; j < len(users); j++ {
tos = append(tos, users[j].Phone) tos = append(tos, users[j].Phone)
} }
send(slice.Set(tos), content, "", "sms") err = send(slice.Set(tos), content, "", "sms")
case "mail": case "mail":
tos := []string{} tos := []string{}
for j := 0; j < len(users); j++ { for j := 0; j < len(users); j++ {
tos = append(tos, users[j].Email) tos = append(tos, users[j].Email)
} }
if err := send(slice.Set(tos), mailContent, subject, "mail"); err == nil { err = send(slice.Set(tos), mailContent, subject, "mail")
logger.Infof("sendMail: %+v", events[0])
}
case "im": case "im":
tos := []string{} tos := []string{}
for j := 0; j < len(users); j++ { for j := 0; j < len(users); j++ {
tos = append(tos, users[j].Im) tos = append(tos, users[j].Im)
} }
send(slice.Set(tos), content, "", "im") err = send(slice.Set(tos), content, "", "im")
default: default:
logger.Errorf("not support %s to send notify, events: %+v", notifyTypes[i], events) logger.Errorf("not support %s to send notify, events: %+v", notifyTypes[i], events)
} }
if err != nil {
logger.Errorf("send %s users:%+v content:%s err:%v", notifyTypes[i], users, content, err)
}
} }
} }
@ -179,7 +182,7 @@ func genContent(isUpgrade bool, events []*models.Event) (string, string) {
} }
// 生成告警邮件 // 生成告警邮件
fp := path.Join(file.SelfDir(), "etc", "mail.tpl") fp := path.Join(file.SelfDir(), "etc", "tpl", "mail.tpl")
t, err := template.ParseFiles(fp) t, err := template.ParseFiles(fp)
if err != nil { if err != nil {
logger.Errorf("InternalServerError: cannot parse %s %v", fp, err) logger.Errorf("InternalServerError: cannot parse %s %v", fp, err)
@ -196,7 +199,7 @@ func genContent(isUpgrade bool, events []*models.Event) (string, string) {
} }
// 生成告警短信短信和IM复用一个内容模板 // 生成告警短信短信和IM复用一个内容模板
fp = path.Join(file.SelfDir(), "etc", "sms.tpl") fp = path.Join(file.SelfDir(), "etc", "tpl", "sms.tpl")
t, err = template.New("sms.tpl").Funcs(template.FuncMap{ t, err = template.New("sms.tpl").Funcs(template.FuncMap{
"unescaped": func(str string) interface{} { return template.HTML(str) }, "unescaped": func(str string) interface{} { return template.HTML(str) },
"urlconvert": func(str string) interface{} { return template.URL(str) }, "urlconvert": func(str string) interface{} { return template.URL(str) },
@ -411,13 +414,14 @@ func send(tos []string, content, subject, notifyType string) error {
return fmt.Errorf("tos is empty") return fmt.Errorf("tos is empty")
} }
message.Tos = tos
message.Content = strings.TrimSpace(content) message.Content = strings.TrimSpace(content)
if message.Content == "" { if message.Content == "" {
return fmt.Errorf("content is blank") return fmt.Errorf("content is blank")
} }
if notifyType == "email" { if notifyType == "mail" {
message.Subject = strings.TrimSpace(message.Subject) message.Subject = strings.TrimSpace(subject)
if message.Subject == "" { if message.Subject == "" {
return fmt.Errorf("subject is blank") return fmt.Errorf("subject is blank")
} }
@ -428,12 +432,14 @@ func send(tos []string, content, subject, notifyType string) error {
redisc.Write(&message, cron.VOICE_QUEUE_NAME) redisc.Write(&message, cron.VOICE_QUEUE_NAME)
case "sms": case "sms":
redisc.Write(&message, cron.SMS_QUEUE_NAME) redisc.Write(&message, cron.SMS_QUEUE_NAME)
case "email": case "mail":
redisc.Write(&message, cron.MAIL_QUEUE_NAME) redisc.Write(&message, cron.MAIL_QUEUE_NAME)
case "im": case "im":
redisc.Write(&message, cron.IM_QUEUE_NAME) redisc.Write(&message, cron.IM_QUEUE_NAME)
} }
logger.Infof("write %s message:%+v", message, notifyType)
return nil return nil
} }

Loading…
Cancel
Save