switch to unique player and server lookups not the total
Some checks failed
Deploy App / docker (ubuntu-latest, 2.44.0, 17, 3.8.5) (push) Failing after 26s

This commit is contained in:
Lee 2024-04-18 13:17:41 +01:00
parent b93c7f68fb
commit 4fd66dffd3
12 changed files with 94 additions and 40 deletions

@ -44,9 +44,8 @@ public class MetricService {
registerMetric(new RequestsPerRouteMetric()); registerMetric(new RequestsPerRouteMetric());
registerMetric(new MemoryMetric()); registerMetric(new MemoryMetric());
registerMetric(new CpuUsageMetric()); registerMetric(new CpuUsageMetric());
registerMetric(new TotalPlayerLookupsMetric());
registerMetric(new TotalServerLookupsMetric());
registerMetric(new ConnectedSocketsMetric()); registerMetric(new ConnectedSocketsMetric());
registerMetric(new UniquePlayerLookupsMetric());
// Load the metrics from Redis // Load the metrics from Redis
loadMetrics(); loadMetrics();
@ -88,8 +87,8 @@ public class MetricService {
*/ */
public void loadMetrics() { public void loadMetrics() {
log.info("Loading metrics"); log.info("Loading metrics");
for (Metric<?> metric : metricsRepository.findAll()) { for (Metric<?> metric : metrics.values()) {
metrics.put(metric.getClass(), metric); metricsRepository.findById(metric.getId()).ifPresent(loaded -> metrics.put(loaded.getClass(), loaded));
} }
log.info("Loaded {} metrics", metrics.size()); log.info("Loaded {} metrics", metrics.size());
} }
@ -120,7 +119,7 @@ public class MetricService {
List<Point> points = new ArrayList<>(); List<Point> points = new ArrayList<>();
for (Metric<?> metric : metrics.values()) { for (Metric<?> metric : metrics.values()) {
if (metric.isCollector()) { if (metric.isCollector()) {
metric.collect(); metric.collect(this);
} }
Point point = metric.toPoint(); Point point = metric.toPoint();
if (point != null) { if (point != null) {

@ -24,8 +24,7 @@ import xyz.mcutils.backend.model.token.MojangUsernameToUuidToken;
import xyz.mcutils.backend.repository.PlayerCacheRepository; import xyz.mcutils.backend.repository.PlayerCacheRepository;
import xyz.mcutils.backend.repository.PlayerNameCacheRepository; import xyz.mcutils.backend.repository.PlayerNameCacheRepository;
import xyz.mcutils.backend.repository.PlayerSkinPartCacheRepository; import xyz.mcutils.backend.repository.PlayerSkinPartCacheRepository;
import xyz.mcutils.backend.service.metric.metrics.TotalPlayerLookupsMetric; import xyz.mcutils.backend.service.metric.metrics.UniquePlayerLookupsMetric;
import xyz.mcutils.backend.service.metric.metrics.TotalServerLookupsMetric;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Optional; import java.util.Optional;
@ -65,7 +64,7 @@ public class PlayerService {
uuid = usernameToUuid(id).getUniqueId(); uuid = usernameToUuid(id).getUniqueId();
} }
((TotalPlayerLookupsMetric) metricService.getMetric(TotalPlayerLookupsMetric.class)).increment(); // Increment the total player lookups ((UniquePlayerLookupsMetric) metricService.getMetric(UniquePlayerLookupsMetric.class)).addLookup(id); // Add the lookup to the unique player lookups
Optional<CachedPlayer> cachedPlayer = playerCacheRepository.findById(uuid); Optional<CachedPlayer> cachedPlayer = playerCacheRepository.findById(uuid);
if (cachedPlayer.isPresent() && Config.INSTANCE.isProduction()) { // Return the cached player if it exists if (cachedPlayer.isPresent() && Config.INSTANCE.isProduction()) { // Return the cached player if it exists

@ -15,8 +15,7 @@ import xyz.mcutils.backend.model.dns.impl.SRVRecord;
import xyz.mcutils.backend.model.server.JavaMinecraftServer; import xyz.mcutils.backend.model.server.JavaMinecraftServer;
import xyz.mcutils.backend.model.server.MinecraftServer; import xyz.mcutils.backend.model.server.MinecraftServer;
import xyz.mcutils.backend.repository.MinecraftServerCacheRepository; import xyz.mcutils.backend.repository.MinecraftServerCacheRepository;
import xyz.mcutils.backend.service.metric.Metric; import xyz.mcutils.backend.service.metric.metrics.UniqueServerLookupsMetric;
import xyz.mcutils.backend.service.metric.metrics.TotalServerLookupsMetric;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.ArrayList; import java.util.ArrayList;
@ -66,7 +65,7 @@ public class ServerService {
String key = "%s-%s:%s".formatted(platformName, hostname, port); String key = "%s-%s:%s".formatted(platformName, hostname, port);
log.info("Getting server: {}:{}", hostname, port); log.info("Getting server: {}:{}", hostname, port);
((TotalServerLookupsMetric) metricService.getMetric(TotalServerLookupsMetric.class)).increment(); // Increment the total server lookups ((UniqueServerLookupsMetric) metricService.getMetric(UniqueServerLookupsMetric.class)).addLookup(key); // Add the server lookup to the unique server lookups
// Check if the server is cached // Check if the server is cached
Optional<CachedMinecraftServer> cached = serverCacheRepository.findById(key); Optional<CachedMinecraftServer> cached = serverCacheRepository.findById(key);

@ -8,6 +8,7 @@ import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.RedisHash;
import xyz.mcutils.backend.service.MetricService;
@AllArgsConstructor @AllArgsConstructor
@Getter @Setter @ToString @Getter @Setter @ToString
@ -33,7 +34,7 @@ public abstract class Metric<T> {
/** /**
* Collects the metric. * Collects the metric.
*/ */
public void collect() {} public void collect(MetricService metricService) {}
/** /**
* Gets this point as a {@link Point}. * Gets this point as a {@link Point}.

@ -1,5 +1,6 @@
package xyz.mcutils.backend.service.metric.metrics; package xyz.mcutils.backend.service.metric.metrics;
import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.impl.IntegerMetric; import xyz.mcutils.backend.service.metric.impl.IntegerMetric;
import xyz.mcutils.backend.websocket.MetricsWebSocketHandler; import xyz.mcutils.backend.websocket.MetricsWebSocketHandler;
@ -15,7 +16,7 @@ public class ConnectedSocketsMetric extends IntegerMetric {
} }
@Override @Override
public void collect() { public void collect(MetricService metricService) {
setValue(MetricsWebSocketHandler.SESSIONS.size()); setValue(MetricsWebSocketHandler.SESSIONS.size());
} }
} }

@ -1,10 +0,0 @@
package xyz.mcutils.backend.service.metric.metrics;
import xyz.mcutils.backend.service.metric.impl.IntegerMetric;
public class TotalPlayerLookupsMetric extends IntegerMetric {
public TotalPlayerLookupsMetric() {
super("total_player_lookups");
}
}

@ -1,10 +0,0 @@
package xyz.mcutils.backend.service.metric.metrics;
import xyz.mcutils.backend.service.metric.impl.IntegerMetric;
public class TotalServerLookupsMetric extends IntegerMetric {
public TotalServerLookupsMetric() {
super("total_server_lookups");
}
}

@ -0,0 +1,37 @@
package xyz.mcutils.backend.service.metric.metrics;
import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.impl.IntegerMetric;
import java.util.ArrayList;
import java.util.List;
public class UniquePlayerLookupsMetric extends IntegerMetric {
private List<String> uniqueLookups = new ArrayList<>();
public UniquePlayerLookupsMetric() {
super("unique_player_lookups");
}
@Override
public boolean isCollector() {
return true;
}
/**
* Adds a lookup to the list of unique lookups.
*
* @param lookup the query that was used to look up a player
*/
public void addLookup(String lookup) {
lookup = lookup.toLowerCase();
if (!uniqueLookups.contains(lookup)) {
uniqueLookups.add(lookup);
}
}
@Override
public void collect(MetricService metricService) {
setValue(uniqueLookups.size());
}
}

@ -0,0 +1,37 @@
package xyz.mcutils.backend.service.metric.metrics;
import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.impl.IntegerMetric;
import java.util.ArrayList;
import java.util.List;
public class UniqueServerLookupsMetric extends IntegerMetric {
private List<String> uniqueLookups = new ArrayList<>();
public UniqueServerLookupsMetric() {
super("unique_server_lookups");
}
@Override
public boolean isCollector() {
return true;
}
/**
* Adds a lookup to the list of unique lookups.
*
* @param lookup the query that was used to look up a player
*/
public void addLookup(String lookup) {
lookup = lookup.toLowerCase();
if (!uniqueLookups.contains(lookup)) {
uniqueLookups.add(lookup);
}
}
@Override
public void collect(MetricService metricService) {
setValue(uniqueLookups.size());
}
}

@ -1,6 +1,7 @@
package xyz.mcutils.backend.service.metric.metrics.process; package xyz.mcutils.backend.service.metric.metrics.process;
import com.sun.management.OperatingSystemMXBean; import com.sun.management.OperatingSystemMXBean;
import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.impl.DoubleMetric; import xyz.mcutils.backend.service.metric.impl.DoubleMetric;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
@ -21,7 +22,7 @@ public class CpuUsageMetric extends DoubleMetric {
} }
@Override @Override
public void collect() { public void collect(MetricService metricService) {
this.setValue(OS_BEAN.getProcessCpuLoad() * 100); this.setValue(OS_BEAN.getProcessCpuLoad() * 100);
} }
} }

@ -1,5 +1,6 @@
package xyz.mcutils.backend.service.metric.metrics.process; package xyz.mcutils.backend.service.metric.metrics.process;
import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.impl.MapMetric; import xyz.mcutils.backend.service.metric.impl.MapMetric;
public class MemoryMetric extends MapMetric<String, Long> { public class MemoryMetric extends MapMetric<String, Long> {
@ -14,7 +15,7 @@ public class MemoryMetric extends MapMetric<String, Long> {
} }
@Override @Override
public void collect() { public void collect(MetricService metricService) {
Runtime runtime = Runtime.getRuntime(); Runtime runtime = Runtime.getRuntime();
this.getValue().put("total", runtime.maxMemory()); this.getValue().put("total", runtime.maxMemory());

@ -8,11 +8,10 @@ import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.handler.TextWebSocketHandler;
import xyz.mcutils.backend.Main; import xyz.mcutils.backend.Main;
import xyz.mcutils.backend.common.Timer; import xyz.mcutils.backend.common.Timer;
import xyz.mcutils.backend.model.metric.WebsocketMetrics;
import xyz.mcutils.backend.service.MetricService; import xyz.mcutils.backend.service.MetricService;
import xyz.mcutils.backend.service.metric.metrics.TotalPlayerLookupsMetric;
import xyz.mcutils.backend.service.metric.metrics.TotalRequestsMetric; import xyz.mcutils.backend.service.metric.metrics.TotalRequestsMetric;
import xyz.mcutils.backend.service.metric.metrics.TotalServerLookupsMetric; import xyz.mcutils.backend.service.metric.metrics.UniquePlayerLookupsMetric;
import xyz.mcutils.backend.service.metric.metrics.UniqueServerLookupsMetric;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -44,8 +43,8 @@ public class MetricsWebSocketHandler extends TextWebSocketHandler {
try { try {
session.sendMessage(new TextMessage(Main.GSON.toJson(Map.of( session.sendMessage(new TextMessage(Main.GSON.toJson(Map.of(
"totalRequests", metricService.getMetric(TotalRequestsMetric.class).getValue(), "totalRequests", metricService.getMetric(TotalRequestsMetric.class).getValue(),
"totalServerLookups", metricService.getMetric(TotalServerLookupsMetric.class).getValue(), "uniqueServerLookups", metricService.getMetric(UniqueServerLookupsMetric.class).getValue(),
"totalPlayerLookups", metricService.getMetric(TotalPlayerLookupsMetric.class).getValue() "uniquePlayerLookups", metricService.getMetric(UniquePlayerLookupsMetric.class).getValue()
)))); ))));
} catch (Exception e) { } catch (Exception e) {
log.error("An error occurred while sending metrics to the client", e); log.error("An error occurred while sending metrics to the client", e);