Skip to content

Commit

Permalink
add nodeName link & pretty final output text
Browse files Browse the repository at this point in the history
  • Loading branch information
zeusro committed Feb 21, 2020
1 parent d830a7a commit ca1ca09
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 29 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
kube-eventer
.git
coverage.txt
.DS_Store
9 changes: 3 additions & 6 deletions sinks/dingtalk/dingtalk.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
"time"

"github.com/AliyunContainerService/kube-eventer/core"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/klog"
)

Expand Down Expand Up @@ -188,9 +188,8 @@ func createMsgFromEvent(d *DingTalkSink, event *v1.Event) *DingTalkMsg {
//https://open-doc.dingtalk.com/microapp/serverapi2/ye8tup#-6
case MARKDOWN_MSG_TYPE:
markdownCreator := NewMarkdownMsgBuilder(d.ClusterID, d.Region, event)
if d.Labels != nil && len(d.Labels) > 0 {
markdownCreator.AddLabels(d.Labels)
}
markdownCreator.AddNodeName(event.Source.Host)
markdownCreator.AddLabels(d.Labels)
msg.Markdown = DingTalkMarkdown{
//title 加不加其实没所谓,最终不会显示
Title: fmt.Sprintf("Kubernetes(ID:%s) Event", d.ClusterID),
Expand All @@ -199,15 +198,13 @@ func createMsgFromEvent(d *DingTalkSink, event *v1.Event) *DingTalkMsg {
break

default:

//默认按文本模式推送
template := MSG_TEMPLATE
if len(d.Labels) > 0 {
for _, label := range d.Labels {
template = fmt.Sprintf(LABE_TEMPLATE, label) + template
}
}

msg.Text = DingTalkText{
Content: fmt.Sprintf(template, event.Type, event.InvolvedObject.Kind, event.Namespace, event.Name, event.Reason, event.LastTimestamp.Format(TIME_FORMAT), event.Message),
}
Expand Down
17 changes: 12 additions & 5 deletions sinks/dingtalk/dingtalk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import (
"testing"

"github.com/stretchr/testify/assert"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"

// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
//"github.com/olekukonko/tablewriter"
//"os"
Expand All @@ -23,16 +24,20 @@ func TestGetLevel(t *testing.T) {
}

func TestCreateMsgFromEvent(t *testing.T) {
// now := time.Now()
labels := make([]string, 2)
labels[0] = "abcd"
labels[1] = "defg"
event := createTestEvent()
event.Source.Host = TEST_NODENAME
event.InvolvedObject.Kind = TEST_RESOURCE_TYPE
event.Name = TEST_DEPLOY_NAME
event.Namespace = TEST_NAMESPACE
u, _ := url.Parse("dingtalk:https://oapi.dingtalk.com/robot/send?access_token=<access_token>&label=<label>&level=Normal")
d, _ := NewDingTalkSink(u)
d.Labels = labels
msg := createMsgFromEvent(d, event)
text, _ := json.Marshal(msg)
t.Log(string(text))
t.Log("\n" + string(text))
// t.Log(msg.Text)
assert.True(t, msg != nil)
}
Expand All @@ -42,14 +47,16 @@ func TestCreateMsgFromEvent_Markdown(t *testing.T) {
labels[0] = "abcd"
labels[1] = "defg"
event := createTestEvent()
event.InvolvedObject.Kind = "Deployment"
event.Source.Host = TEST_NODENAME
event.InvolvedObject.Kind = TEST_RESOURCE_TYPE
event.Name = TEST_DEPLOY_NAME
event.Namespace = TEST_NAMESPACE
u, _ := url.Parse("dingtalk:https://oapi.dingtalk.com/robot/send?access_token=<access_token>&label=<label>&level=Normal" + "&msg_type=markdown&cluster_id=" + TEST_CLUSTERID + "&region=" + TEST_REGION)
d, _ := NewDingTalkSink(u)
d.Labels = labels
msg := createMsgFromEvent(d, event)
text, _ := json.Marshal(msg)
t.Log(string(text))
t.Log("\n" + string(text))
// t.Log(msg.Text)
assert.True(t, msg != nil)
}
Expand Down
29 changes: 24 additions & 5 deletions sinks/dingtalk/markdownMsgBuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ package dingtalk

import (
"fmt"
"k8s.io/api/core/v1"
"strings"

v1 "k8s.io/api/core/v1"
)

const (
MARKDOWN_MSG_TYPE = "markdown"
MARKDOWN_TEMPLATE = "Level:%s \n\nKind:%s \n\nNamespace:%s \n\nName:%s \n\nReason:%s \n\nTimestamp:%s \n\nMessage:%s"
MARKDOWN_TEMPLATE = "Level: %s \n\nKind: %s \n\nNamespace: %s \n\nName: %s \n\nReason: %s \n\nTimestamp: %s \n\nMessage: %s"
MARKDOWN_LINK_TEMPLATE = "[%s](%s)"
MARKDOWN_TEXT_BOLD = "**%s**"
MARKDOWN_NEW_LINE = "\n\n"

URL_ALIYUN_K8S_CONSULE = "https://cs.console.aliyun.com/#/k8s"
//阿里云 kubernetes 管理控制台, Deployment,StatefulSet,DaemonSet 有同样的URL规律
Expand All @@ -19,6 +21,7 @@ const (
URL_ALIYUN_CROBJOB_TEMPLATE = URL_ALIYUN_K8S_CONSULE + "/cronjob/detail/%s/%s/%s/%s/jobs"
URL_ALIYUN_SVC_TEMPLATE = URL_ALIYUN_K8S_CONSULE + "/service/detail/%s/%s/%s/%s"
URL_ALIYUN_NAMESPACE_TEMPLATE = URL_ALIYUN_K8S_CONSULE + "/namespace"
URL_ALIYUN_ECS_TEMPLATE = "https://ecs.console.aliyun.com/#/server/%s/detail?regionId=%s"
)

type MarkdownMsgBuilder struct {
Expand Down Expand Up @@ -84,7 +87,7 @@ func NewMarkdownMsgBuilder(clusterID, region string, event *v1.Event) *MarkdownM

}

// removeDotContent 每个事件由 <resource>.<hash> 组成,需要去掉.后面的部分,得到 <resource>
// removeDotContent 每个 Event 由 <resource>.<UnixNano> 组成,需要去掉.后面的部分,得到 <resource>
func removeDotContent(s string) string {
if dotPosition := strings.Index(s, "."); dotPosition > -1 {
s = s[:dotPosition]
Expand All @@ -93,12 +96,28 @@ func removeDotContent(s string) string {
}

func (m *MarkdownMsgBuilder) AddLabels(labels []string) {
if len(labels) > 0 {
if labels != nil && len(labels) > 0 {
for i := len(labels) - 1; i >= 0; i-- {
m.OutputText = fmt.Sprintf("label[%d]:**%s**\n\n", i, labels[i]) + m.OutputText
if label := strings.TrimSpace(labels[i]); len(label) > 0 {
m.OutputText = fmt.Sprintf("label[%d]: **%s**"+MARKDOWN_NEW_LINE, i, labels[i]) + m.OutputText
}
}
}
}

func (m *MarkdownMsgBuilder) AddNodeName(nodeName string) {
if len(nodeName) < 1 {
return
}
ecsInfo := strings.Split(nodeName, ".")
var nodeInfo string
if len(ecsInfo) > 1 {
ecsURL := fmt.Sprintf(URL_ALIYUN_ECS_TEMPLATE, ecsInfo[1], ecsInfo[0])
nodeInfo = fmt.Sprintf("Node: "+MARKDOWN_LINK_TEMPLATE+" "+MARKDOWN_NEW_LINE, nodeName, ecsURL)
} else {
nodeInfo = fmt.Sprintf("Node: "+MARKDOWN_TEXT_BOLD+" "+MARKDOWN_NEW_LINE, nodeName)
}
m.OutputText = nodeInfo + m.OutputText
}

func (m *MarkdownMsgBuilder) Build() string {
Expand Down
39 changes: 26 additions & 13 deletions sinks/dingtalk/markdownMsgBuilder_test.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
package dingtalk

import (
"github.com/stretchr/testify/assert"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"strings"
"testing"
"time"

"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var (
TEST_CLUSTERID = ""
TEST_REGION = ""
TEST_DEPLOY_NAME = ""
TEST_POD_NAME = ""
TEST_STATEFULSET_NAME = ""
TEST_DAEMONSET_NAME = ""
TEST_SERVICE_NAME = ""
TEST_CROBJOB = ""
TEST_NAMESPACE = ""
const (
TEST_CLUSTERID = "abcdefghijklmnopqrstuvwxyz"
TEST_REGION = "cn-shenzhen"
TEST_NODENAME = "cn-shenzhen.i-xxxxxxxxx"
TEST_DEPLOY_NAME = "testdeploy"
TEST_POD_NAME = "testpod"
TEST_STATEFULSET_NAME = "testss"
TEST_DAEMONSET_NAME = "testds"
TEST_SERVICE_NAME = "testservice"
TEST_CROBJOB = "logs-cleaner"
TEST_NAMESPACE = "default"
TEST_RESOURCE_TYPE = "Deployment"
)

func TestNewMarkdownMsgBuilder_Deployment(t *testing.T) {
Expand Down Expand Up @@ -98,6 +101,16 @@ func TestRemoveDotContent(t *testing.T) {
assert.True(t, !strings.ContainsAny(s, "."))
}

func TestAddNodeName(t *testing.T) {
e := createTestEvent()
e.Name = TEST_SERVICE_NAME
e.InvolvedObject.Kind = "Service"
e.Namespace = TEST_NAMESPACE
m := NewMarkdownMsgBuilder(TEST_CLUSTERID, TEST_REGION, e)
m.AddNodeName(TEST_NODENAME)
t.Log(m.OutputText)
}

func createTestEvent() *v1.Event {
now := time.Now()
event := &v1.Event{
Expand Down

0 comments on commit ca1ca09

Please sign in to comment.