Skip to content

Commit b556a98

Browse files
committed
Changed threads structure
1 parent 75042b8 commit b556a98

File tree

11 files changed

+151
-91
lines changed

11 files changed

+151
-91
lines changed

src/main/java/dev/vality/alerting/tg/bot/dao/ProviderTerminalThreadDao.java

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.vality.alerting.tg.bot.dao;
2+
3+
import dev.vality.alerting.tg.bot.pojo.ProviderThread;
4+
import dev.vality.dao.impl.AbstractGenericDao;
5+
import dev.vality.mapper.RecordRowMapper;
6+
import org.springframework.jdbc.core.RowMapper;
7+
import org.springframework.stereotype.Component;
8+
9+
import javax.sql.DataSource;
10+
import java.util.Optional;
11+
12+
import static dev.vality.alerting.tg.bot.domain.Tables.PROVIDER_THREAD;
13+
14+
@Component
15+
public class ProviderThreadDao extends AbstractGenericDao {
16+
17+
private final RowMapper<ProviderThread> rowMapper;
18+
19+
public ProviderThreadDao(DataSource dataSource) {
20+
super(dataSource);
21+
this.rowMapper = new RecordRowMapper<>(PROVIDER_THREAD, ProviderThread.class);
22+
}
23+
24+
public Optional<ProviderThread> findByProvider(String providerId) {
25+
var query = getDslContext()
26+
.selectFrom(PROVIDER_THREAD)
27+
.where(PROVIDER_THREAD.PROVIDER_ID.eq(providerId));
28+
29+
return Optional.ofNullable(fetchOne(query, rowMapper));
30+
}
31+
32+
public int insert(ProviderThread thread) {
33+
var record = getDslContext().newRecord(PROVIDER_THREAD, thread);
34+
var query = getDslContext()
35+
.insertInto(PROVIDER_THREAD)
36+
.set(record);
37+
38+
return execute(query);
39+
}
40+
41+
public int upsert(ProviderThread thread) {
42+
var query = getDslContext()
43+
.insertInto(PROVIDER_THREAD)
44+
.set(PROVIDER_THREAD.PROVIDER_ID, thread.getProviderId())
45+
.set(PROVIDER_THREAD.THREAD_ID, thread.getThreadId())
46+
.set(PROVIDER_THREAD.PROVIDER_NAME, thread.getProviderName())
47+
.set(PROVIDER_THREAD.NAME, thread.getName())
48+
.onConflict(PROVIDER_THREAD.PROVIDER_ID)
49+
.doUpdate()
50+
.set(PROVIDER_THREAD.THREAD_ID, thread.getThreadId())
51+
.set(PROVIDER_THREAD.PROVIDER_NAME, thread.getProviderName())
52+
.set(PROVIDER_THREAD.NAME, thread.getName());
53+
54+
return execute(query);
55+
}
56+
}

src/main/java/dev/vality/alerting/tg/bot/handler/alert/FailedMachinesAlertHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import dev.vality.alerting.tg.bot.config.properties.AlertBotProperties;
44
import dev.vality.alerting.tg.bot.model.Webhook;
5-
import dev.vality.alerting.tg.bot.service.FailedMachinesAlertService;
5+
import dev.vality.alerting.tg.bot.service.ProviderThreadService;
66
import dev.vality.alerting.tg.bot.service.TelegramApiService;
77
import lombok.RequiredArgsConstructor;
88
import lombok.extern.slf4j.Slf4j;
@@ -22,7 +22,7 @@
2222
public class FailedMachinesAlertHandler implements AlertHandler {
2323
private final AlertBotProperties properties;
2424
private final TelegramApiService telegramApiService;
25-
private final FailedMachinesAlertService service;
25+
private final ProviderThreadService service;
2626

2727
@Override
2828
public boolean filter(String alertName) {
@@ -34,15 +34,15 @@ public void handle(Webhook webhook, List<Webhook.Alert> alerts) {
3434
Map<Integer, List<Webhook.Alert>> threadIds = new HashMap<>();
3535

3636
for (Webhook.Alert alert : alerts) {
37-
Integer threadId = service.getOrCreateTopicIdForFailedMachinesAlert(alert);
37+
Integer threadId = service.getOrCreateTopicId(alert);
3838
threadIds.computeIfAbsent(threadId, key -> new ArrayList<>()).add(alert);
3939
}
4040

4141
threadIds.forEach((threadId, threadAlerts) -> {
4242
telegramApiService.sendMessage(
4343
properties.getChatId(),
4444
threadId,
45-
formatWebhook(webhook),
45+
formatWebhook(webhook, threadAlerts),
4646
"MarkdownV2"
4747
);
4848
});

src/main/java/dev/vality/alerting/tg/bot/pojo/ProviderTerminalThread.java renamed to src/main/java/dev/vality/alerting/tg/bot/pojo/ProviderThread.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@
1111
@AllArgsConstructor
1212
@EqualsAndHashCode
1313
@ToString
14-
public class ProviderTerminalThread implements Serializable {
14+
public class ProviderThread implements Serializable {
1515

1616
@Serial
1717
private static final long serialVersionUID = 1L;
1818

1919
private Long id;
2020
private Integer threadId;
2121
private String providerId;
22-
private String terminalId;
2322
private String providerName;
24-
private String terminalName;
2523
private String name;
2624
}

src/main/java/dev/vality/alerting/tg/bot/service/ProviderTerminalThreadService.java

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/main/java/dev/vality/alerting/tg/bot/service/FailedMachinesAlertService.java renamed to src/main/java/dev/vality/alerting/tg/bot/service/ProviderThreadService.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,33 @@
11
package dev.vality.alerting.tg.bot.service;
22

33
import dev.vality.alerting.tg.bot.config.properties.AlertBotProperties;
4-
import dev.vality.alerting.tg.bot.dao.ProviderTerminalThreadDao;
4+
import dev.vality.alerting.tg.bot.dao.ProviderThreadDao;
55
import dev.vality.alerting.tg.bot.exception.TelegramThreadCreationException;
66
import dev.vality.alerting.tg.bot.model.Webhook;
7-
import dev.vality.alerting.tg.bot.pojo.ProviderTerminalThread;
7+
import dev.vality.alerting.tg.bot.pojo.ProviderThread;
88
import lombok.RequiredArgsConstructor;
99
import lombok.extern.slf4j.Slf4j;
1010
import org.springframework.stereotype.Service;
1111

1212
@Slf4j
1313
@Service
1414
@RequiredArgsConstructor
15-
public class FailedMachinesAlertService {
16-
private final ProviderTerminalThreadDao providerTerminalThreadDao;
15+
public class ProviderThreadService {
16+
private final ProviderThreadDao providerThreadDao;
1717
private final TelegramApiService telegramApiService;
1818
private final AlertBotProperties properties;
1919

20-
public Integer getOrCreateTopicIdForFailedMachinesAlert(Webhook.Alert alert) {
20+
public Integer getOrCreateTopicId(Webhook.Alert alert) {
2121
var labels = alert.getLabels();
2222
String providerId = labels.getProviderId();
2323
String providerName = labels.getProviderName();
24-
String terminalId = labels.getTerminalId();
25-
String terminalName = labels.getTerminalName();
2624

27-
var existing = providerTerminalThreadDao.findByProviderAndTerminal(providerId, terminalId);
25+
var existing = providerThreadDao.findByProvider(providerId);
2826
if (existing.isPresent() && existing.get().getThreadId() != null) {
2927
return existing.get().getThreadId();
3028
}
3129

32-
String threadName = "(" + providerId + ") " + providerName + " - (" + terminalId + ") " + terminalName;
30+
String threadName = providerId + ": " + providerName;
3331
Integer threadId;
3432
try {
3533
threadId = telegramApiService.createTopicAndReturnThreadId(threadName);
@@ -39,16 +37,14 @@ public Integer getOrCreateTopicIdForFailedMachinesAlert(Webhook.Alert alert) {
3937
threadId = properties.getThreads().getCommands();
4038
}
4139

42-
var entity = new ProviderTerminalThread(
40+
var entity = new ProviderThread(
4341
null,
4442
threadId,
4543
providerId,
46-
terminalId,
4744
labels.getProviderName(),
48-
labels.getTerminalName(),
4945
threadName
5046
);
51-
providerTerminalThreadDao.upsert(entity);
47+
providerThreadDao.upsert(entity);
5248

5349
return threadId;
5450
}

src/main/java/dev/vality/alerting/tg/bot/util/WebhookUtil.java

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import dev.vality.alerting.tg.bot.model.Webhook;
44
import lombok.extern.slf4j.Slf4j;
55

6-
import java.util.Optional;
6+
import java.util.List;
7+
import java.util.Objects;
8+
import java.util.stream.Collectors;
79

810
@Slf4j
911
public final class WebhookUtil {
@@ -40,4 +42,64 @@ public static String formatWebhook(Webhook webhook) {
4042
throw new IllegalStateException("Отсутствует статус алерта: webhook.getStatus() is null");
4143
}
4244
}
45+
46+
public static String formatWebhook(Webhook webhook, List<Webhook.Alert> alerts) {
47+
if (alerts == null || alerts.isEmpty()) {
48+
log.error("Список алертов пуст. {}", webhook);
49+
throw new IllegalStateException("Список алертов пуст");
50+
}
51+
52+
List<Webhook.Alert> firingAlerts = alerts.stream()
53+
.filter(alert -> FIRING.equals(alert.getStatus()))
54+
.toList();
55+
56+
List<Webhook.Alert> resolvedAlerts = alerts.stream()
57+
.filter(alert -> RESOLVED.equals(alert.getStatus()))
58+
.toList();
59+
60+
StringBuilder messageBuilder = new StringBuilder();
61+
messageBuilder.append("```\n");
62+
63+
if (!firingAlerts.isEmpty()) {
64+
messageBuilder.append("АЛЕРТЫ СРАБОТАЛИ ❗\n\n");
65+
66+
String firingText = firingAlerts.stream()
67+
.map(Webhook.Alert::getAnnotations)
68+
.filter(Objects::nonNull)
69+
.map(Webhook.Annotation::getDescription)
70+
.filter(Objects::nonNull)
71+
.distinct()
72+
.collect(Collectors.joining("\n\n"));
73+
74+
messageBuilder.append(firingText);
75+
}
76+
77+
if (!firingAlerts.isEmpty() && !resolvedAlerts.isEmpty()) {
78+
messageBuilder.append("\n\n---\n\n");
79+
}
80+
81+
if (!resolvedAlerts.isEmpty()) {
82+
messageBuilder.append("Ситуации пришли в норму ✅\n\n");
83+
84+
String resolvedText = resolvedAlerts.stream()
85+
.map(Webhook.Alert::getAnnotations)
86+
.filter(Objects::nonNull)
87+
.map(Webhook.Annotation::getSummary)
88+
.filter(Objects::nonNull)
89+
.distinct()
90+
.collect(Collectors.joining("\n\n"));
91+
92+
messageBuilder.append(resolvedText);
93+
}
94+
95+
messageBuilder.append("\n```");
96+
String result = messageBuilder.toString();
97+
98+
if (result.isBlank()) {
99+
log.error("Не удалось сформировать текст алертов. {}", webhook);
100+
throw new IllegalStateException("Не удалось сформировать текст алертов");
101+
}
102+
103+
return result;
104+
}
43105
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
ALTER TABLE IF EXISTS alert_tg_bot.provider_terminal_thread
2+
RENAME TO provider_thread;
3+
4+
ALTER TABLE IF EXISTS alert_tg_bot.provider_thread
5+
DROP CONSTRAINT IF EXISTS provider_terminal_thread_provider_terminal_uk;
6+
7+
ALTER TABLE IF EXISTS alert_tg_bot.provider_thread
8+
DROP COLUMN IF EXISTS terminal_id,
9+
DROP COLUMN IF EXISTS terminal_name;
10+
11+
ALTER TABLE IF EXISTS alert_tg_bot.provider_thread
12+
ADD CONSTRAINT provider_thread_provider_uk UNIQUE (provider_id);

src/test/java/dev/vality/alerting/tg/bot/ApplicationContextTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.vality.alerting.tg.bot;
22

33
import dev.vality.alerting.tg.bot.config.PostgresqlSpringBootITest;
4-
import dev.vality.alerting.tg.bot.dao.ProviderTerminalThreadDao;
4+
import dev.vality.alerting.tg.bot.dao.ProviderThreadDao;
55
import org.junit.jupiter.api.Test;
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.context.ApplicationContext;
@@ -20,6 +20,6 @@ public class ApplicationContextTest {
2020
void startApplicationContextTest() {
2121
assertThat(applicationContext).isNotNull();
2222

23-
assertThat(applicationContext.getBean(ProviderTerminalThreadDao.class)).isNotNull();
23+
assertThat(applicationContext.getBean(ProviderThreadDao.class)).isNotNull();
2424
}
2525
}

src/test/java/dev/vality/alerting/tg/bot/WebhookControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import dev.vality.alerting.tg.bot.config.properties.AlertmanagerWebhookProperties;
66
import dev.vality.alerting.tg.bot.controller.WebhookController;
77
import dev.vality.alerting.tg.bot.model.Webhook;
8-
import dev.vality.alerting.tg.bot.pojo.ProviderTerminalThread;
8+
import dev.vality.alerting.tg.bot.pojo.ProviderThread;
99
import dev.vality.alerting.tg.bot.service.AlertBot;
1010
import lombok.val;
1111
import org.junit.jupiter.api.Test;
@@ -53,7 +53,7 @@ public class WebhookControllerTest {
5353
TelegramBotInitializer telegramBotInitializer;
5454

5555
@MockitoBean
56-
RowMapper<ProviderTerminalThread> rowMapper;
56+
RowMapper<ProviderThread> rowMapper;
5757

5858
String webhookJson = """
5959
{

0 commit comments

Comments
 (0)