• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

trydofor / professional-wings / #125

31 Aug 2024 04:46AM UTC coverage: 63.579% (+0.7%) from 62.919%
#125

push

web-flow
Merge pull request #290 from trydofor/develop

3.2.130

1428 of 2191 new or added lines in 106 files covered. (65.18%)

41 existing lines in 24 files now uncovered.

12923 of 20326 relevant lines covered (63.58%)

0.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

80.95
/wings/slardar/src/main/java/pro/fessional/wings/slardar/monitor/report/DingTalkReport.java
1
package pro.fessional.wings.slardar.monitor.report;
2

3
import lombok.Getter;
4
import lombok.Setter;
5
import lombok.extern.slf4j.Slf4j;
6
import org.apache.commons.lang3.StringUtils;
7
import pro.fessional.wings.slardar.context.Now;
8
import pro.fessional.wings.slardar.monitor.WarnMetric;
9
import pro.fessional.wings.slardar.monitor.WarnReport;
10
import pro.fessional.wings.slardar.notice.DingTalkConf;
11
import pro.fessional.wings.slardar.notice.DingTalkNotice;
12

13
import java.util.List;
14
import java.util.Map;
15
import java.util.concurrent.atomic.AtomicLong;
16
import java.util.function.Consumer;
17

18
import static pro.fessional.wings.silencer.datetime.DateTimePattern.FMT_FULL_19Z;
19

20
/**
21
 * <a href="https://developers.dingtalk.com/document/app/custom-robot-access">Dingtalk robot</a>
22
 *
23
 * @author trydofor
24
 * @since 2021-07-14
25
 */
26
@Slf4j
1✔
27
@Getter @Setter
28
public class DingTalkReport implements WarnReport {
29

30
    private final String dingConfig;
31
    private final DingTalkNotice dingTalkNotice;
32
    private final AtomicLong counter = new AtomicLong(1);
1✔
33

34
    protected String gitInfo = null;
1✔
35

36
    public DingTalkReport(DingTalkNotice notice, String config) {
1✔
37
        this.dingTalkNotice = notice;
1✔
38
        this.dingConfig = config;
1✔
39
    }
1✔
40

41
    /**
42
     * report warn to dingtalk robot
43
     *
44
     * @param appName app name as subject
45
     * @param jvmName jvm name to track
46
     * @param warn    warn details
47
     */
48
    @Override
49
    public Sts report(String appName, String jvmName, Map<String, List<WarnMetric.Warn>> warn) {
50
        final DingTalkConf conf = dingTalkNotice.provideConfig(dingConfig, true);
1✔
51
        final String host = conf.getValidWebhook();
1✔
52
        if (host == null) {
1✔
53
            log.debug("bad webhook, skip");
1✔
54
            return Sts.Skip;
1✔
55
        }
56

57
        if (host.contains("${")) {
1✔
58
            log.debug("accessToken has placeholder, skip");
×
59
            return Sts.Skip;
×
60
        }
61

62
        if (warn.isEmpty()) {
1✔
UNCOV
63
            log.debug("warning is empty, skip");
×
UNCOV
64
            return Sts.Skip;
×
65
        }
66

67
        String text = buildMkContent(appName, jvmName, sb -> {
1✔
68
            for (Map.Entry<String, List<WarnMetric.Warn>> entry : warn.entrySet()) {
1✔
69
                mkTitleH2(sb, entry.getKey());
1✔
70
                for (WarnMetric.Warn w : entry.getValue()) {
1✔
71
                    if (w.getType() == WarnMetric.Type.Link) {
1✔
72
                        mkItemLink(sb, w);
×
73
                    }
74
                    else {
75
                        mkItemText(sb, w);
1✔
76
                    }
77
                }
1✔
78
            }
1✔
79
        });
1✔
80

81
        String subject = appName;
1✔
82
        if (StringUtils.isNotEmpty(conf.getNoticeKeyword())) {
1✔
83
            subject = subject + " " + conf.getNoticeKeyword();
1✔
84
        }
85

86
        final boolean rst = dingTalkNotice.send(conf, subject + " #" + counter.getAndIncrement(), text);
1✔
87
        return rst ? Sts.Done : Sts.Fail;
1✔
88
    }
89

90
    public String buildMkContent(String app, String jvm, Consumer<StringBuilder> builder) {
91
        StringBuilder sb = new StringBuilder();
1✔
92
        mkTitleH2(sb, app);
1✔
93
        mkItemText(sb, jvm, "jvm-name");
1✔
94
        mkItemText(sb, gitInfo, "git-info");
1✔
95
        mkItemText(sb, FMT_FULL_19Z.format(Now.zonedDateTime()), "rpt-time");
1✔
96
        builder.accept(sb);
1✔
97
        return sb.toString();
1✔
98
    }
99

100
    protected void mkTitleH2(StringBuilder sb, String str) {
101
        if (str == null) return;
1✔
102
        sb.append("\n\n## ■ ")
1✔
103
          .append(str);
1✔
104
    }
1✔
105

106
    protected void mkItemText(StringBuilder sb, String value, String key) {
107
        if (value == null) return;
1✔
108
        sb.append("\n- ")
1✔
109
          .append(value)
1✔
110
          .append(" | ")
1✔
111
          .append(key);
1✔
112
    }
1✔
113

114
    protected void mkItemText(StringBuilder sb, WarnMetric.Warn warn) {
115
        sb.append("\n- ")
1✔
116
          .append("**").append(warn.getWarn()).append("** | ")
1✔
117
          .append(warn.getRule())
1✔
118
          .append(" | ")
1✔
119
          .append(warn.getKey());
1✔
120
    }
1✔
121

122
    protected void mkItemLink(StringBuilder sb, WarnMetric.Warn warn) {
123
        sb.append("\n- [")
×
124
          .append(warn.getRule())
×
125
          .append("](")
×
126
          .append(warn.getWarn())
×
127
          .append(") | ")
×
128
          .append(warn.getKey());
×
129
    }
×
130
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc