Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
mylxsw committed Dec 1, 2020
1 parent ca24db5 commit 437d80b
Show file tree
Hide file tree
Showing 12 changed files with 430 additions and 64 deletions.
20 changes: 20 additions & 0 deletions cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,21 @@ func main() {
Name: "log_path",
Usage: "日志文件输出目录(非文件名),默认为空,输出到标准输出",
}))
app.AddFlags(altsrc.NewStringFlag(cli.StringFlag{
Name: "jira_url",
EnvVar: "ADANOS_JIRA_URL",
Usage: "Jira 服务器地址,如 http://127.0.0.1:8080",
}))
app.AddFlags(altsrc.NewStringFlag(cli.StringFlag{
Name: "jira_username",
EnvVar: "ADANOS_JIRA_USERNAME",
Usage: "Jira 连接账号",
}))
app.AddFlags(altsrc.NewStringFlag(cli.StringFlag{
Name: "jira_password",
EnvVar: "ADANOS_JIRA_PASSWORD",
Usage: "Jira 连接密码",
}))

app.WithHttpServer(listener.FlagContext("listen"))

Expand Down Expand Up @@ -250,6 +265,11 @@ func main() {
TTSTemplateVarName: c.String("aliyun_voice_tts_param"),
CalledShowNumber: c.String("aliyun_voice_called_show_number"),
},
Jira: configs.Jira{
BaseURL: c.String("jira_url"),
Username: c.String("jira_username"),
Password: c.String("jira_password"),
},
}
})

Expand Down
8 changes: 8 additions & 0 deletions configs/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ type Config struct {

Migrate bool `json:"migrate"`
ReMigrate bool `json:"re_migrate"`

AliyunVoiceCall AliyunVoiceCall `json:"aliyun_voice_call"`
EmailSMTP EmailSMTP `json:"email_smtp"`
Jira Jira `json:"jira"`
}

type EmailSMTP struct {
Expand All @@ -50,6 +52,12 @@ type AliyunVoiceCall struct {
BaseURI string `json:"base_uri"`
}

type Jira struct {
BaseURL string `json:"base_url"`
Username string `json:"username"`
Password string `json:"-"`
}

func (conf *Config) Serialize() string {
rs, _ := json.Marshal(conf)
return string(rs)
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@ require (
github.com/PuerkitoBio/goquery v1.6.0
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/andygrunwald/go-jira v1.13.0 // indirect
github.com/antonmedv/expr v1.8.2
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
github.com/buger/jsonparser v1.0.0
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/go-chi/chi v3.3.2+incompatible // indirect
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/golang/protobuf v1.4.2
github.com/golang/snappy v0.0.1 // indirect
github.com/google/go-querystring v1.0.0 // indirect
github.com/gorilla/mux v1.8.0
github.com/gorilla/schema v1.2.0 // indirect
github.com/gorilla/sessions v1.2.1 // indirect
Expand Down Expand Up @@ -42,6 +45,7 @@ require (
github.com/swaggo/http-swagger v0.0.0-20190614090009-c2865af9083e
github.com/swaggo/swag v1.6.2
github.com/tidwall/pretty v1.0.0 // indirect
github.com/trivago/tgo v1.0.7 // indirect
github.com/urfave/cli v1.22.2
github.com/vjeantet/grok v1.0.0
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect
Expand Down
16 changes: 16 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGn
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/andygrunwald/go-jira v1.13.0 h1:vvIImGgX32bHfoiyUwkNo+/YrPnRczNarvhLOncP6dE=
github.com/andygrunwald/go-jira v1.13.0/go.mod h1:jYi4kFDbRPZTJdJOVJO4mpMMIwdB+rcZwSO58DzPd2I=
github.com/antonmedv/expr v1.8.2 h1:BfkVHGudYqq7jp3Ji33kTn+qZ9D19t/Mndg0ag/Ycq4=
github.com/antonmedv/expr v1.8.2/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8=
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
Expand Down Expand Up @@ -60,13 +62,18 @@ github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/structs v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU=
github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
Expand Down Expand Up @@ -122,6 +129,10 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0=
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
Expand Down Expand Up @@ -312,6 +323,10 @@ github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112 h1:NBrpnvz0pDPf3+
github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/trivago/tgo v1.0.1 h1:bxatjJIXNIpV18bucU4Uk/LaoxvxuOlp/oowRHyncLQ=
github.com/trivago/tgo v1.0.1/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc=
github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM=
github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc=
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.21.0 h1:wYSSj06510qPIzGSua9ZqsncMmWE3Zr55KBERygyrxE=
Expand Down Expand Up @@ -345,6 +360,7 @@ go.uber.org/zap v1.12.0 h1:dySoUQPFBGj6xwjmBzageVL8jGi8uxc6bEmJQjA06bw=
go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand Down
30 changes: 27 additions & 3 deletions internal/action/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/mylxsw/adanos-alert/configs"
"github.com/mylxsw/adanos-alert/internal/queue"
"github.com/mylxsw/adanos-alert/internal/repository"
"github.com/mylxsw/adanos-alert/internal/template"
"github.com/mylxsw/adanos-alert/pubsub"
"github.com/mylxsw/asteria/log"
"github.com/mylxsw/container"
Expand Down Expand Up @@ -140,7 +141,7 @@ func (payload *Payload) Events(limit int64) []repository.Event {
return payload.eventQuerier(payload.Group.ID, limit)
}

func CreateRepositoryMessageQuerier(msgRepo repository.EventRepo) func(groupID primitive.ObjectID, limit int64) []repository.Event {
func CreateRepositoryEventQuerier(msgRepo repository.EventRepo) func(groupID primitive.ObjectID, limit int64) []repository.Event {
return func(groupID primitive.ObjectID, limit int64) []repository.Event {
messages, _, err := msgRepo.Paginate(bson.M{"group_ids": groupID}, 0, limit)
if err != nil {
Expand Down Expand Up @@ -201,14 +202,14 @@ func (q *QueueAction) Handle(rule repository.Rule, trigger repository.Trigger, g
}

// CreatePayload 创建一个 Payload
func CreatePayload(conf *configs.Config, messageQuerier EventQuerier, action string, rule repository.Rule, trigger repository.Trigger, grp repository.EventGroup) *Payload {
func CreatePayload(conf *configs.Config, eventQuerier EventQuerier, action string, rule repository.Rule, trigger repository.Trigger, grp repository.EventGroup) *Payload {
payload := &Payload{
Action: action,
Rule: rule,
Trigger: trigger,
Group: grp,
}
payload.Init(messageQuerier)
payload.Init(eventQuerier)

if conf.PreviewURL != "" {
payload.PreviewURL = fmt.Sprintf(conf.PreviewURL, grp.ID.Hex())
Expand All @@ -219,3 +220,26 @@ func CreatePayload(conf *configs.Config, messageQuerier EventQuerier, action str

return payload
}

// createPayloadAndSummary 创建 Payload 并且生成 summary
func createPayloadAndSummary(cc template.SimpleContainer, actionName string, conf *configs.Config, evtRepo repository.EventRepo, rule repository.Rule, trigger repository.Trigger, grp repository.EventGroup) (*Payload, string) {
payload := CreatePayload(conf, CreateRepositoryEventQuerier(evtRepo), actionName, rule, trigger, grp)
payload.RuleTemplateParsed = parseTemplate(cc, rule.Template, payload)

return payload, payload.RuleTemplateParsed
}

// parseTemplate 模板解释
func parseTemplate(cc template.SimpleContainer, temp string, payload *Payload) string {
summary, err := template.Parse(cc, temp, payload)
if err != nil {
summary = fmt.Sprintf("<internal> template parse failed: %s", err)
log.WithFields(log.Fields{
"err": err.Error(),
"template": temp,
"payload": payload,
}).Errorf("<internal> template parse failed: %v", err)
}

return summary
}
31 changes: 5 additions & 26 deletions internal/action/dingding.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (

"github.com/mylxsw/adanos-alert/configs"
"github.com/mylxsw/adanos-alert/internal/repository"
"github.com/mylxsw/adanos-alert/internal/template"
"github.com/mylxsw/adanos-alert/pkg/messager/dingding"
"github.com/mylxsw/asteria/log"
"github.com/mylxsw/coll"
Expand Down Expand Up @@ -66,37 +65,17 @@ func (d DingdingAction) Handle(rule repository.Rule, trigger repository.Trigger,
return fmt.Errorf("query robot for id=%s failed: %v", meta.RobotID, err)
}

payload := CreatePayload(conf, CreateRepositoryMessageQuerier(msgRepo), "dingding", rule, trigger, grp)
ruleTemplateContent, err := template.Parse(d.manager, rule.Template, payload)
if err != nil {
ruleTemplateContent = fmt.Sprintf("<rule> template parse failed: %s", err)
log.WithFields(log.Fields{
"err": err.Error(),
"template": rule.Template,
"payload": payload,
}).Errorf("<rule> template parse failed: %v", err)
}

notifyContent := ruleTemplateContent
payload, summary := createPayloadAndSummary(d.manager, "dingding", conf, msgRepo, rule, trigger, grp)
if strings.TrimSpace(meta.Template) != "" {
payload.RuleTemplateParsed = ruleTemplateContent
notifyContent, err = template.Parse(d.manager, meta.Template, payload)
if err != nil {
notifyContent = fmt.Sprintf("<trigger> template parse failed: %s", err)
log.WithFields(log.Fields{
"err": err.Error(),
"template": rule.Template,
"payload": payload,
}).Errorf("<trigger> template parse failed: %v", err)
}
summary = parseTemplate(d.manager, meta.Template, payload)
}

mobiles := extractPhonesFromUserRefs(d.userRepo, trigger.UserRefs)
msg := dingding.NewMarkdownMessage(rule.Name, notifyContent, mobiles)
msg := dingding.NewMarkdownMessage(rule.Name, summary, mobiles)
if err := dingding.NewDingding(robot.Token, robot.Secret).Send(msg); err != nil {
log.WithFields(log.Fields{
"title": rule.Name,
"content": notifyContent,
"content": summary,
"mobiles": mobiles,
"err": err,
}).Errorf("send message to dingding failed: %v", err)
Expand All @@ -106,7 +85,7 @@ func (d DingdingAction) Handle(rule repository.Rule, trigger repository.Trigger,
if log.DebugEnabled() {
log.WithFields(log.Fields{
"title": rule.Name,
"content": notifyContent,
"content": summary,
"mobiles": mobiles,
}).Debug("send message to dingding succeed")
}
Expand Down
118 changes: 118 additions & 0 deletions internal/action/jira.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package action

import (
"context"
"encoding/json"
"errors"
"fmt"
"time"

"github.com/mylxsw/adanos-alert/configs"
"github.com/mylxsw/adanos-alert/internal/repository"
"github.com/mylxsw/adanos-alert/pkg/messager/jira"
"github.com/mylxsw/asteria/log"
)

type JiraAction struct {
manager Manager
}

func (act JiraAction) Validate(meta string, userRefs []string) error {
var jiraMeta JiraMeta
if err := json.Unmarshal([]byte(meta), &jiraMeta); err != nil {
return err
}

if len(userRefs) > 2 {
return errors.New("invalid users, only support one user")
}

return nil
}

func NewJiraAction(manager Manager) *JiraAction {
return &JiraAction{manager: manager}
}

type JiraMeta struct {
Issue jira.Issue `json:"issue"`
}

func (act JiraAction) Handle(rule repository.Rule, trigger repository.Trigger, grp repository.EventGroup) error {
var meta JiraMeta
if err := json.Unmarshal([]byte(trigger.Meta), &meta); err != nil {
return fmt.Errorf("parse jira meta failed: %v", err)
}

return act.manager.Resolve(func(conf *configs.Config, evtRepo repository.EventRepo, userRepo repository.UserRepo) error {
jiraClient, err := jira.NewClient(conf.Jira.BaseURL, conf.Jira.Username, conf.Jira.Password)
if err != nil {
return fmt.Errorf("create jira client failed: %w", err)
}

payload, description := createPayloadAndSummary(act.manager, "jira", conf, evtRepo, rule, trigger, grp)
if meta.Issue.Description != "" {
description = parseTemplate(act.manager, meta.Issue.Description, payload)
}

summary := rule.Name
if meta.Issue.Summary != "" {
summary = parseTemplate(act.manager, meta.Issue.Summary, payload)
}

customFields := make(map[string]interface{})
for k, v := range meta.Issue.CustomFields {
customFields[k] = parseTemplate(act.manager, fmt.Sprintf("%v", v), payload)
}

issue := jira.Issue{
CustomFields: customFields,
ProjectKey: meta.Issue.ProjectKey,
Summary: summary,
Description: description,
IssueType: meta.Issue.IssueType,
Priority: meta.Issue.Priority,
}

if len(trigger.UserRefs) > 0 && !trigger.UserRefs[0].IsZero() {
user, err := userRepo.Get(trigger.UserRefs[0])
if err != nil {
log.WithFields(log.Fields{
"user_id": trigger.UserRefs[0].Hex(),
"trigger_id": trigger.ID.Hex(),
"rule_id": rule.ID.Hex(),
}).Errorf("no such user")
} else {
jiraUser := user.Metas.Get("jira")
if jiraUser != "" {
issue.Assignee = jiraUser
}
}
}

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

issueID, err := jiraClient.CreateIssue(ctx, issue)
if err != nil {
log.WithFields(log.Fields{
"title": rule.Name,
"description": description,
"err": err,
"meta": meta,
}).Errorf("send message to jira failed: %v", err)
return err
}

if log.DebugEnabled() {
log.WithFields(log.Fields{
"title": rule.Name,
"description": description,
"meta": meta,
"issue_id": issueID,
}).Debug("send message to jira succeed")
}

return nil
})
}
1 change: 1 addition & 0 deletions internal/action/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func (s ServiceProvider) Boot(app infra.Glacier) {
manager.Register("phone_call_aliyun", NewPhoneCallAliyunAction(manager))
manager.Register("sms_aliyun", NewSmsAliyunAction(manager))
manager.Register("sms_yunxin", NewSmsYunxinAction(manager))
manager.Register("jira", NewJiraAction(manager))

queueManager.RegisterHandler("action", func(item repository.QueueJob) error {
var payload Payload
Expand Down
Loading

0 comments on commit 437d80b

Please sign in to comment.