diff --git a/alert/consumer/consumer.go b/alert/consumer/consumer.go index 20d5519..fd12922 100644 --- a/alert/consumer/consumer.go +++ b/alert/consumer/consumer.go @@ -289,6 +289,7 @@ func (ec *Consume) handleAlert(rule models.AlertRule, alerts []models.AlertCurEv noticeData, _ := ec.ctx.DB.Notice().Get(r) alert.DutyUser = process.GetDutyUser(ec.ctx, noticeData) + alert.DutyUserPhoneNumber = process.GetDutyUserPhoneNumber(ec.ctx, noticeData) mp := mute.MuteParams{ EffectiveTime: alert.EffectiveTime, @@ -308,6 +309,16 @@ func (ec *Consume) handleAlert(rule models.AlertRule, alerts []models.AlertCurEv } else { content = templates.NewTemplate(ec.ctx, alert, noticeData).CardContentMsg } + + phoneNumber := func() []string { + if len(alert.DutyUserPhoneNumber) > 0 { + return alert.DutyUserPhoneNumber + } + if len(noticeData.PhoneNumber) > 0 { + return noticeData.PhoneNumber + } + return []string{} + }() err := sender.Sender(ec.ctx, sender.SendParams{ TenantId: alert.TenantId, RuleName: alert.RuleName, @@ -320,6 +331,7 @@ func (ec *Consume) handleAlert(rule models.AlertRule, alerts []models.AlertCurEv Email: noticeData.Email, Content: content, Event: nil, + PhoneNumber: phoneNumber, }) if err != nil { logc.Errorf(ec.ctx.Ctx, err.Error()) diff --git a/alert/process/process.go b/alert/process/process.go index 07f3824..6987369 100644 --- a/alert/process/process.go +++ b/alert/process/process.go @@ -176,6 +176,20 @@ func GetDutyUser(ctx *ctx.Context, noticeData models.AlertNotice) string { return "暂无" } +// GetDutyUserPhoneNumber 获取当班人员手机号 +func GetDutyUserPhoneNumber(ctx *ctx.Context, noticeData models.AlertNotice) []string { + user, ok := ctx.DB.DutyCalendar().GetDutyUserInfo(noticeData.DutyId, time.Now().Format("2006-1-2")) + if ok { + switch noticeData.NoticeType { + case "PhoneCall": + if len(user.DutyUserId) > 1 { + return []string{user.Phone} + } + } + } + return []string{} +} + // RecordAlertHisEvent 记录历史告警 func RecordAlertHisEvent(ctx *ctx.Context, alert models.AlertCurEvent) error { hisData := models.AlertHisEvent{ diff --git a/go.mod b/go.mod index 1eddcd3..9cfbc78 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,11 @@ module watchAlert go 1.21 require ( - github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 + github.com/alibabacloud-go/dyvmsapi-intl-20211015/v2 v2.2.0 github.com/alibabacloud-go/sls-20201230/v6 v6.0.0 github.com/alibabacloud-go/tea v1.2.2 - github.com/alibabacloud-go/tea-utils/v2 v2.0.4 + github.com/alibabacloud-go/tea-utils/v2 v2.0.6 github.com/aws/aws-sdk-go-v2 v1.27.1 github.com/aws/aws-sdk-go-v2/config v1.27.17 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.38.5 @@ -25,6 +26,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/viper v1.16.0 github.com/zeromicro/go-zero v1.7.3 + go.uber.org/multierr v1.9.0 golang.org/x/net v0.30.0 golang.org/x/sync v0.8.0 gopkg.in/ldap.v2 v2.5.1 @@ -39,17 +41,17 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/alibabacloud-go/alibabacloud-gateway-sls v0.0.6 // indirect github.com/alibabacloud-go/alibabacloud-gateway-sls-util v0.0.1 // indirect - github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect + github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect github.com/alibabacloud-go/darabonba-array v0.1.0 // indirect github.com/alibabacloud-go/darabonba-encode-util v0.0.2 // indirect github.com/alibabacloud-go/darabonba-map v0.0.2 // indirect github.com/alibabacloud-go/darabonba-signature-util v0.0.7 // indirect github.com/alibabacloud-go/darabonba-string v1.0.2 // indirect - github.com/alibabacloud-go/debug v1.0.0 // indirect - github.com/alibabacloud-go/openapi-util v0.1.0 // indirect - github.com/alibabacloud-go/tea-utils v1.3.1 // indirect + github.com/alibabacloud-go/debug v1.0.1 // indirect + github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect + github.com/alibabacloud-go/openapi-util v0.1.1 // indirect github.com/alibabacloud-go/tea-xml v1.1.3 // indirect - github.com/aliyun/credentials-go v1.3.1 // indirect + github.com/aliyun/credentials-go v1.3.10 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.17 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.4 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8 // indirect @@ -119,6 +121,7 @@ require ( github.com/ugorji/go/codec v1.2.12 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.10.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/crypto v0.28.0 // indirect diff --git a/go.sum b/go.sum index 97898f0..2e10dea 100644 --- a/go.sum +++ b/go.sum @@ -2,29 +2,39 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo= github.com/alibabacloud-go/alibabacloud-gateway-sls v0.0.6 h1:LmBsV3DRJJyGP7GhP+OZONFuyvYPI9t3yvEj8dXVkOM= github.com/alibabacloud-go/alibabacloud-gateway-sls v0.0.6/go.mod h1:w1LdOGxFI7W3KSG8j2zruZUCknYZw8zW4QRpi+V4lOQ= github.com/alibabacloud-go/alibabacloud-gateway-sls-util v0.0.1 h1:l2sAkhQvmgEqXSZsC0ILaYvPpktFNhj5i6St/UVSPrE= github.com/alibabacloud-go/alibabacloud-gateway-sls-util v0.0.1/go.mod h1:RApLor4bnK0iUCxFMKsXodwDJ+9z8ZETHdC9xPwYhdA= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g= github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8= github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc= github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5 h1:yyolbgHfV2Tp91vMjO/CF5aOxKG+UgdVAeUoloEQI3E= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.5/go.mod h1:kUe8JqFmoVU7lfBauaDD5taFaW7mBI+xVsyHutYtabg= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 h1:GEYkMApgpKEVDn6z12DcH1EGYpDYRB8JxsazM4Rywak= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10/go.mod h1:26a14FGhZVELuz2cc2AolvW4RHmIO3/HRwsdHhaIPDE= github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= github.com/alibabacloud-go/darabonba-string v1.0.2/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA= github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= -github.com/alibabacloud-go/debug v1.0.0 h1:3eIEQWfay1fB24PQIEzXAswlVJtdQok8f3EVN5VrBnA= github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= -github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= +github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= +github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/dyvmsapi-intl-20211015/v2 v2.2.0 h1:AVNDzkrWzounkTQtgQmAWBM9/xXFTktt9TTmiLB69Nc= +github.com/alibabacloud-go/dyvmsapi-intl-20211015/v2 v2.2.0/go.mod h1:gDF8Eoi0ALsE2hioib4gTnm38P0SxcsA0d+v4p5zVgc= +github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= +github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4DjrVw4m04HsS28= +github.com/alibabacloud-go/openapi-util v0.1.1/go.mod h1:/UehBSE2cf1gYT43GV4E+RxTdLRzURImCYY0aRmlXpw= github.com/alibabacloud-go/sls-20201230/v6 v6.0.0 h1:fWAJ6hHJb/XBlm5jgt6SWfffSlqsnibo7uNTnv8p9ag= github.com/alibabacloud-go/sls-20201230/v6 v6.0.0/go.mod h1:2k0WWbqGcQN1E6376E9sUToKWGxZTaub5wTb0QjhJ6g= github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= @@ -33,19 +43,23 @@ github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeG github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= github.com/alibabacloud-go/tea v1.2.1/go.mod h1:qbzof29bM/IFhLMtJPrgTGK3eauV5J2wSyEUo4OEmnA= github.com/alibabacloud-go/tea v1.2.2 h1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU= github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= -github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= -github.com/alibabacloud-go/tea-utils/v2 v2.0.4 h1:SoFgjJuO7pze88j9RBJNbKb7AgTS52O+J5ITxc00lCs= github.com/alibabacloud-go/tea-utils/v2 v2.0.4/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ= +github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.6 h1:ZkmUlhlQbaDC+Eba/GARMPy6hKdCLiSke5RsN5LcyQ0= +github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0= github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/aliyun/credentials-go v1.3.1 h1:uq/0v7kWrxmoLGpqjx7vtQ/s03f0zR//0br/xWDTE28= github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0= +github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM= +github.com/aliyun/credentials-go v1.3.10 h1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA= +github.com/aliyun/credentials-go v1.3.10/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/aws/aws-sdk-go-v2 v1.27.1 h1:xypCL2owhog46iFxBKKpBcw+bPTX/RJzwNj8uSilENw= github.com/aws/aws-sdk-go-v2 v1.27.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/config v1.27.17 h1:L0JZN7Gh7pT6u5CJReKsLhGKparqNKui+mcpxMXjDZc= @@ -349,8 +363,12 @@ go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucg go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= @@ -362,7 +380,10 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -392,7 +413,10 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -431,7 +455,10 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -439,7 +466,10 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -449,6 +479,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= diff --git a/internal/models/alert_current_event.go b/internal/models/alert_current_event.go index ee4941a..88b911f 100644 --- a/internal/models/alert_current_event.go +++ b/internal/models/alert_current_event.go @@ -29,6 +29,7 @@ type AlertCurEvent struct { RecoverTime int64 `json:"recover_time" gorm:"-"` // 恢复时间 RecoverTimeFormat string `json:"recover_time_format" gorm:"-"` DutyUser string `json:"duty_user" gorm:"-"` + DutyUserPhoneNumber []string `json:"duty_user_phone_number" gorm:"-"` EffectiveTime EffectiveTime `json:"effectiveTime" gorm:"effectiveTime;serializer:json"` RecoverNotify *bool `json:"recoverNotify"` AlarmAggregation *bool `json:"alarmAggregation"` diff --git a/internal/models/notice.go b/internal/models/notice.go index 16c2eee..3049c9d 100644 --- a/internal/models/notice.go +++ b/internal/models/notice.go @@ -5,14 +5,15 @@ import ( ) type AlertNotice struct { - TenantId string `json:"tenantId"` - Uuid string `json:"uuid"` - Name string `json:"name"` - DutyId string `json:"dutyId"` - NoticeType string `json:"noticeType"` - NoticeTmplId string `json:"noticeTmplId"` - Hook string `json:"hook"` - Email Email `json:"email" gorm:"email;serializer:json"` + TenantId string `json:"tenantId"` + Uuid string `json:"uuid"` + Name string `json:"name"` + DutyId string `json:"dutyId"` + NoticeType string `json:"noticeType"` + NoticeTmplId string `json:"noticeTmplId"` + Hook string `json:"hook"` + Email Email `json:"email" gorm:"email;serializer:json"` + PhoneNumber []string `json:"phoneNumber" gorm:"email;serializer:json"` } type Email struct { diff --git a/internal/models/settings.go b/internal/models/settings.go index d20e07b..f838e7d 100644 --- a/internal/models/settings.go +++ b/internal/models/settings.go @@ -3,10 +3,11 @@ package models import "watchAlert/config" type Settings struct { - IsInit int `json:"isInit"` - AlarmConfig config.AlarmConfig `json:"alarmConfig" gorm:"alarmConfig;serializer:json"` - EmailConfig emailConfig `json:"emailConfig" gorm:"emailConfig;serializer:json"` - AppVersion string `json:"appVersion" gorm:"-"` + IsInit int `json:"isInit"` + AlarmConfig config.AlarmConfig `json:"alarmConfig" gorm:"alarmConfig;serializer:json"` + EmailConfig emailConfig `json:"emailConfig" gorm:"emailConfig;serializer:json"` + AppVersion string `json:"appVersion" gorm:"-"` + PhoneCallConfig phoneCallConfig `json:"phoneCallConfig" gorm:"phoneCallConfig;serializer:json"` } type emailConfig struct { @@ -15,3 +16,11 @@ type emailConfig struct { Email string `json:"email"` Token string `json:"token"` } + +type phoneCallConfig struct { + Provider string `json:"provider"` + Endpoint string `json:"endpoint"` + AccessKeyId string `json:"accessKeyId"` + AccessKeySecret string `json:"accessKeySecret"` + TtsCode string `json:"ttsCode"` +} diff --git a/pkg/provider/aliyun/phonecall.go b/pkg/provider/aliyun/phonecall.go new file mode 100644 index 0000000..1730d52 --- /dev/null +++ b/pkg/provider/aliyun/phonecall.go @@ -0,0 +1,62 @@ +package aliyun + +import ( + "errors" + "fmt" + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + dyvmsapi "github.com/alibabacloud-go/dyvmsapi-intl-20211015/v2/client" + "github.com/alibabacloud-go/tea/tea" + "github.com/zeromicro/go-zero/core/logc" + "go.uber.org/multierr" + "watchAlert/pkg/ctx" +) + +type PhoneCall struct { + Endpoint string `json:"endpoint,omitempty"` + AccessKeyId string `json:"accessKeyId,omitempty"` + AccessKeySecret string `json:"accessKeySecret,omitempty"` + TtsCode string `json:"ttsCode,omitempty"` + Client *dyvmsapi.Client +} + +func (p *PhoneCall) CreateClient() error { + config := &openapi.Config{ + AccessKeyId: tea.String(p.AccessKeyId), + AccessKeySecret: tea.String(p.AccessKeySecret), + Endpoint: tea.String(p.Endpoint), + } + client, err := dyvmsapi.NewClient(config) + if err != nil { + return err + } + p.Client = client + return nil +} + +func (p *PhoneCall) Call(message string, phoneNumbers []string) error { + var resultError error + for _, phoneNumber := range phoneNumbers { + request := &dyvmsapi.VoiceSingleCallRequest{ + // 接收语音通知的手机号码 + CalledNumber: tea.String(phoneNumber), + CallerIdNumber: nil, + // 语音播报次数 + PlayTimes: tea.Int64(2), + TtsCode: tea.String(p.TtsCode), + TtsParam: tea.String(message), + } + response, err := p.Client.VoiceSingleCall(request) + if err != nil { + //log.Errorf("呼叫失败,号码:%s,内容:%s\n", phoneNumber, message) + resultError = multierr.Append(resultError, err) + continue + } + if response.Body.Success != tea.Bool(true) { + //log.Errorf("呼叫失败,号码:%s,内容:%s,原因:%s", phoneNumber, message, response.Body.String()) + resultError = multierr.Append(resultError, errors.New(*response.Body.AccessDeniedDetail)) + continue + } + logc.Info(ctx.Ctx, fmt.Sprintf("呼叫成功,号码:%s,内容:%s\n", phoneNumber, message)) + } + return resultError +} diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go new file mode 100644 index 0000000..0f7bc1b --- /dev/null +++ b/pkg/provider/provider.go @@ -0,0 +1,9 @@ +package provider + +const ( + PROVIDER_ALIYUN = "aliyun" +) + +type PhoneCall interface { + Call(message string, phoneNumbers []string) error +} diff --git a/pkg/sender/entry.go b/pkg/sender/entry.go index 29d6e6c..9388266 100644 --- a/pkg/sender/entry.go +++ b/pkg/sender/entry.go @@ -29,6 +29,8 @@ type ( Content string // 事件 Event interface{} + // 电话号码 + PhoneNumber []string } // SendInter 发送通知的接口 @@ -70,6 +72,8 @@ func senderFactory(noticeType string) (SendInter, error) { return NewWeChatSender(), nil case "CustomHook": return NewWebHookSender(), nil + case "PhoneCall": + return NewPhoneCallSender(), nil default: return nil, fmt.Errorf("无效的通知类型: %s", noticeType) } diff --git a/pkg/sender/phoneCall.go b/pkg/sender/phoneCall.go new file mode 100644 index 0000000..a2b6d5a --- /dev/null +++ b/pkg/sender/phoneCall.go @@ -0,0 +1,45 @@ +package sender + +import ( + "errors" + "fmt" + "watchAlert/pkg/ctx" + "watchAlert/pkg/provider" + "watchAlert/pkg/provider/aliyun" +) + +// PhoneCallSender 邮件发送策略 +type PhoneCallSender struct{} + +func NewPhoneCallSender() SendInter { + return &PhoneCallSender{} +} + +func (e *PhoneCallSender) Send(params SendParams) error { + setting, err := ctx.DB.Setting().Get() + if err != nil { + return errors.New("获取系统配置失败: " + err.Error()) + } + + var phoneCall provider.PhoneCall + switch setting.PhoneCallConfig.Provider { + case provider.PROVIDER_ALIYUN: + aliyunPhoneCall := &aliyun.PhoneCall{ + Endpoint: setting.PhoneCallConfig.Endpoint, + AccessKeyId: setting.PhoneCallConfig.AccessKeyId, + AccessKeySecret: setting.PhoneCallConfig.AccessKeySecret, + } + err := aliyunPhoneCall.CreateClient() + if err != nil { + return fmt.Errorf("创建%s语音服务客户端失败: %v\n", setting.PhoneCallConfig.Provider, err) + } + phoneCall = aliyunPhoneCall + } + + err = phoneCall.Call(params.Content, params.PhoneNumber) + if err != nil { + return errors.New("语音通知 类型报警发送失败" + err.Error()) + } + + return nil +} diff --git a/pkg/templates/new.go b/pkg/templates/new.go index 135503a..fc6d6df 100644 --- a/pkg/templates/new.go +++ b/pkg/templates/new.go @@ -20,6 +20,8 @@ func NewTemplate(ctx *ctx.Context, alert models.AlertCurEvent, notice models.Ale return Template{CardContentMsg: emailTemplate(alert, noticeTmpl)} case "WeChat": return Template{CardContentMsg: wechatTemplate(alert, noticeTmpl)} + case "PhoneCall": + return Template{CardContentMsg: phoneCallTemplate(alert, noticeTmpl)} } return Template{} diff --git a/pkg/templates/phoneCall.go b/pkg/templates/phoneCall.go new file mode 100644 index 0000000..b332486 --- /dev/null +++ b/pkg/templates/phoneCall.go @@ -0,0 +1,7 @@ +package templates + +import "watchAlert/internal/models" + +func phoneCallTemplate(alert models.AlertCurEvent, noticeTmpl models.NoticeTemplateExample) string { + return ParserTemplate("Event", alert, noticeTmpl.Template) +}