[AB-184] adding various metrics to the system, organizing imports, changing some transactional behaviour

adding okhttp metrics, split bot service into multiple services (guild, message), unified some places that services are used in order to interact with the api, and not directly the objects (this is to make it easier for metric to be accurate)
This commit is contained in:
Sheldan
2021-01-29 17:46:41 +01:00
parent 2a2a3aea70
commit b838678c15
362 changed files with 3045 additions and 1573 deletions

View File

@@ -47,6 +47,13 @@
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>dev.sheldan.abstracto.core</groupId>
<artifactId>metrics-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.statistic.emotes.converter;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel;
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResult;
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResultDisplay;
@@ -22,7 +22,7 @@ import java.util.List;
public class EmoteStatsConverter {
@Autowired
private BotService botService;
private GuildService guildService;
@Autowired
private TrackedEmoteManagementService trackedEmoteManagementService;
@@ -33,7 +33,7 @@ public class EmoteStatsConverter {
return EmoteStatsModel.builder().build();
}
// it is assumed all emotes are tracked in the same server
Guild relevantGuild = botService.getGuildById(resultList.get(0).getServerId());
Guild relevantGuild = guildService.getGuildById(resultList.get(0).getServerId());
EmoteStatsModel resultingModel = EmoteStatsModel.builder().build();
resultList.forEach(emoteStatsResult -> {
TrackedEmote trackedEmote = trackedEmoteManagementService.loadByEmoteId(emoteStatsResult.getEmoteId(), emoteStatsResult.getServerId());

View File

@@ -11,6 +11,7 @@ import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
@@ -35,7 +36,7 @@ public class EmotePersistingJob extends QuartzJobBean {
private TrackedEmoteService trackedEmoteService;
@Override
@Transactional
@Transactional(isolation = Isolation.SERIALIZABLE)
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// acquire the lock, because we are modifying
trackedEmoteRuntimeService.takeLock();

View File

@@ -4,7 +4,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncMessageReceivedListener;
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
import dev.sheldan.abstracto.statistic.emotes.service.TrackedEmoteService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,13 +25,13 @@ public class EmoteTrackingListener implements AsyncMessageReceivedListener {
private TrackedEmoteService trackedEmoteService;
@Autowired
private BotService botService;
private GuildService guildService;
@Override
public void execute(CachedMessage message) {
Map<Long, List<CachedEmote>> collect = message.getEmotes().stream().collect(Collectors.groupingBy(CachedEmote::getEmoteId));
collect.values().forEach(groupedEmotes ->
trackedEmoteService.addEmoteToRuntimeStorage(groupedEmotes.get(0), botService.getGuildById(message.getServerId()), (long) groupedEmotes.size())
trackedEmoteService.addEmoteToRuntimeStorage(groupedEmotes.get(0), guildService.getGuildById(message.getServerId()), (long) groupedEmotes.size())
);
}

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.statistic.emotes.service;
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -1,10 +1,12 @@
package dev.sheldan.abstracto.statistic.emotes.service;
import dev.sheldan.abstracto.core.metrics.service.CounterMetric;
import dev.sheldan.abstracto.core.metrics.service.MetricService;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.FeatureModeService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode;
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
@@ -21,9 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.time.Instant;
import java.util.Map;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Component
@@ -46,7 +49,18 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
private UsedEmoteManagementService usedEmoteManagementService;
@Autowired
private BotService botService;
private GuildService guildService;
@Autowired
private MetricService metricService;
public static final String EMOTE_USAGES_TRACKED_METRIC = "emote.usages";
private static final CounterMetric EMOTE_USAGES_TRACKED =
CounterMetric
.builder()
.name(EMOTE_USAGES_TRACKED_METRIC)
.build();
@Override
public void addEmoteToRuntimeStorage(List<CachedEmote> emotes, Guild guild) {
@@ -76,6 +90,7 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
boolean autoTrackExternalEmotes = featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, serverId, EmoteTrackingMode.AUTO_TRACK_EXTERNAL);
boolean trackExternalEmotes = featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, serverId, EmoteTrackingMode.EXTERNAL_EMOTES);
persistingEmotes.forEach(persistingEmote -> {
metricService.incrementCounter(EMOTE_USAGES_TRACKED);
Optional<TrackedEmote> emoteOptional = trackedEmoteManagementService.loadByEmoteIdOptional(persistingEmote.getEmoteId(), serverId);
emoteOptional.ifPresent(trackedEmote -> {
// only track the record, if its enabled
@@ -109,7 +124,7 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
* @param persistingEmote The {@link PersistingEmote} which contains all information necessary to create a {@link TrackedEmote}
*/
private void createNewTrackedEmote(Long serverId, PersistingEmote persistingEmote) {
Optional<Guild> guildOptional = botService.getGuildByIdOptional(serverId);
Optional<Guild> guildOptional = guildService.getGuildByIdOptional(serverId);
guildOptional.ifPresent(guild -> {
TrackedEmote newCreatedTrackedEmote = trackedEmoteManagementService.createExternalTrackedEmote(persistingEmote);
usedEmoteManagementService.createEmoteUsageForToday(newCreatedTrackedEmote, persistingEmote.getCount());
@@ -210,4 +225,8 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
trackedEmotes.forEach(trackedEmote -> trackedEmote.setTrackingEnabled(false));
}
@PostConstruct
public void postConstruct() {
metricService.registerCounter(EMOTE_USAGES_TRACKED, "Tracked emote usages stored");
}
}

View File

@@ -1,9 +1,9 @@
package dev.sheldan.abstracto.statistic.emotes.command;
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameterException;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.FeatureModeService;

View File

@@ -20,7 +20,6 @@ import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class TrackedEmoteParameterParameterHandlerTest {

View File

@@ -1,7 +1,7 @@
package dev.sheldan.abstracto.statistic.emotes.converter;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsModel;
import dev.sheldan.abstracto.statistic.emotes.model.EmoteStatsResult;
import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote;
@@ -27,7 +27,7 @@ public class EmoteStatsConverterTest {
private EmoteStatsConverter testUnit;
@Mock
private BotService botService;
private GuildService guildService;
@Mock
private TrackedEmoteManagementService trackedEmoteManagementService;
@@ -66,7 +66,7 @@ public class EmoteStatsConverterTest {
when(trackedEmote.getAnimated()).thenReturn(false);
when(trackedEmote2.getExternal()).thenReturn(true);
when(trackedEmote2.getAnimated()).thenReturn(true);
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
EmoteStatsModel result = testUnit.fromEmoteStatsResults(Arrays.asList(emoteStatsResult, emoteStatsResult2));
Assert.assertEquals(1, result.getStaticEmotes().size());
@@ -89,7 +89,7 @@ public class EmoteStatsConverterTest {
when(trackedEmote2.getAnimated()).thenReturn(true);
when(trackedEmote2.getDeleted()).thenReturn(false);
when(trackedEmote2.getTrackedEmoteId()).thenReturn(new ServerSpecificId(SERVER_ID, EMOTE_ID_2));
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
Emote emote1 = Mockito.mock(Emote.class);
when(guild.getEmoteById(EMOTE_ID)).thenReturn(emote1);
Emote emote2 = Mockito.mock(Emote.class);
@@ -114,7 +114,7 @@ public class EmoteStatsConverterTest {
when(trackedEmote2.getExternal()).thenReturn(false);
when(trackedEmote2.getAnimated()).thenReturn(true);
when(trackedEmote2.getDeleted()).thenReturn(true);
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
EmoteStatsModel result = testUnit.fromEmoteStatsResults(Arrays.asList(emoteStatsResult, emoteStatsResult2));
Assert.assertEquals(1, result.getStaticEmotes().size());

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.statistic.emotes.listener;
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
import dev.sheldan.abstracto.statistic.emotes.service.TrackedEmoteService;
import net.dv8tion.jda.api.entities.Guild;
@@ -28,7 +28,7 @@ public class EmoteTrackingListenerTest {
private TrackedEmoteService trackedEmoteService;
@Mock
private BotService botService;
private GuildService guildService;
@Mock
private CachedMessage message;
@@ -49,7 +49,7 @@ public class EmoteTrackingListenerTest {
public void testExecuteOneEmote() {
List<CachedEmote> emotesBag = new ArrayList<>();
emotesBag.add(emote1);
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
when(message.getServerId()).thenReturn(SERVER_ID);
when(message.getEmotes()).thenReturn(emotesBag);
testUnit.execute(message);
@@ -63,7 +63,7 @@ public class EmoteTrackingListenerTest {
when(emote2.getEmoteId()).thenReturn(EMOTE_ID);
emotesBag.add(emote1);
emotesBag.add(emote2);
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
when(message.getServerId()).thenReturn(SERVER_ID);
when(message.getEmotes()).thenReturn(emotesBag);
testUnit.execute(message);
@@ -77,7 +77,7 @@ public class EmoteTrackingListenerTest {
when(emote2.getEmoteId()).thenReturn(EMOTE_ID + 1);
emotesBag.add(emote1);
emotesBag.add(emote2);
when(botService.getGuildById(SERVER_ID)).thenReturn(guild);
when(guildService.getGuildById(SERVER_ID)).thenReturn(guild);
when(message.getServerId()).thenReturn(SERVER_ID);
when(message.getEmotes()).thenReturn(emotesBag);
testUnit.execute(message);

View File

@@ -1,10 +1,11 @@
package dev.sheldan.abstracto.statistic.emotes.service;
import dev.sheldan.abstracto.core.metrics.service.MetricService;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.cache.CachedEmote;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.FeatureModeService;
import dev.sheldan.abstracto.core.service.GuildService;
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
import dev.sheldan.abstracto.statistic.emotes.config.EmoteTrackingMode;
import dev.sheldan.abstracto.statistic.emotes.model.PersistingEmote;
@@ -53,7 +54,10 @@ public class TrackedEmoteServiceBeanTest {
private UsedEmoteManagementService usedEmoteManagementService;
@Mock
private BotService botService;
private GuildService guildService;
@Mock
private MetricService metricService;
@Mock
private CachedEmote emote;
@@ -298,6 +302,7 @@ public class TrackedEmoteServiceBeanTest {
HashMap<Long, List<PersistingEmote>> usagesToStore = new HashMap<>();
testUnit.storeEmoteStatistics(usagesToStore);
verify(featureModeService, times(0)).featureModeActive(eq(StatisticFeatures.EMOTE_TRACKING), anyLong(), eq(EmoteTrackingMode.AUTO_TRACK));
verify(metricService, times(0)).incrementCounter(any());
}
@Test
@@ -314,6 +319,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmote, times(1)).setAmount(2 * COUNT);
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -328,6 +334,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmote, times(0)).setAmount(anyLong());
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -343,6 +350,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(trackedEmote, COUNT);
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -355,6 +363,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmoteManagementService, times(0)).createEmoteUsageForToday(any(TrackedEmote.class), anyLong());
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -367,6 +376,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmoteManagementService, times(0)).createEmoteUsageForToday(any(TrackedEmote.class), anyLong());
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -374,7 +384,7 @@ public class TrackedEmoteServiceBeanTest {
HashMap<Long, List<PersistingEmote>> usagesToStore = new HashMap<>();
usagesToStore.put(SERVER_ID, Arrays.asList(persistingEmote));
when(persistingEmote.getEmoteId()).thenReturn(EMOTE_ID);
when(botService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
when(persistingEmote.getCount()).thenReturn(COUNT);
when(trackedEmoteManagementService.loadByEmoteIdOptional(EMOTE_ID, SERVER_ID)).thenReturn(Optional.empty());
when(trackedEmoteManagementService.createExternalTrackedEmote(persistingEmote)).thenReturn(trackedEmote);
@@ -382,6 +392,7 @@ public class TrackedEmoteServiceBeanTest {
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
testUnit.storeEmoteStatistics(usagesToStore);
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(trackedEmote, COUNT);
verify(metricService, times(1)).incrementCounter(any());
}
@Test
@@ -411,6 +422,7 @@ public class TrackedEmoteServiceBeanTest {
verify(usedEmoteManagementService, times(1)).createEmoteUsageForToday(eq(trackedEmote2), anyLong());
verify(usedEmote, times(1)).setAmount(2 * COUNT);
verify(metricService, times(2)).incrementCounter(any());
}
@Test

View File

@@ -8,8 +8,8 @@ import dev.sheldan.abstracto.statistic.emotes.model.database.TrackedEmote;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import java.util.Map;
import java.util.List;
import java.util.Map;
/**
* Service responsible to provide operations on {@link TrackedEmote}