diff --git a/src/main/java/com/prometheus/spigot/PrometheusSpigotPlugin.java b/src/main/java/com/prometheus/spigot/PrometheusSpigotPlugin.java index 6d0cb98..7a1cc3d 100644 --- a/src/main/java/com/prometheus/spigot/PrometheusSpigotPlugin.java +++ b/src/main/java/com/prometheus/spigot/PrometheusSpigotPlugin.java @@ -9,6 +9,7 @@ import com.prometheus.spigot.listeners.CommandListener; import com.prometheus.spigot.listeners.ConnectionListener; import com.prometheus.spigot.listeners.CraftListener; import com.prometheus.spigot.listeners.DeathListener; +import com.prometheus.spigot.listeners.EntityKillListener; import com.prometheus.spigot.listeners.MoveListener; import com.prometheus.spigot.listeners.PluginListener; import com.prometheus.spigot.metrics.MetricsRegistry; @@ -82,6 +83,7 @@ public final class PrometheusSpigotPlugin extends JavaPlugin { pluginManager.registerEvents(new ChunkListener(metricsRegistry), this); pluginManager.registerEvents(new PluginListener(metricsRegistry), this); pluginManager.registerEvents(new CraftListener(metricsRegistry), this); + pluginManager.registerEvents(new EntityKillListener(metricsRegistry), this); } private void startHttpServer() { diff --git a/src/main/java/com/prometheus/spigot/listeners/EntityKillListener.java b/src/main/java/com/prometheus/spigot/listeners/EntityKillListener.java new file mode 100644 index 0000000..40797cb --- /dev/null +++ b/src/main/java/com/prometheus/spigot/listeners/EntityKillListener.java @@ -0,0 +1,22 @@ +package com.prometheus.spigot.listeners; + +import com.prometheus.spigot.metrics.MetricsRegistry; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; + +public final class EntityKillListener implements Listener { + private final MetricsRegistry registry; + + public EntityKillListener(MetricsRegistry registry) { + this.registry = registry; + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent event) { + Player killer = event.getEntity().getKiller(); + String killerLabel = killer != null ? killer.getName() : "null"; + registry.incrementEntityKill(event.getEntity().getType(), killerLabel); + } +} diff --git a/src/main/java/com/prometheus/spigot/metrics/MetricsRegistry.java b/src/main/java/com/prometheus/spigot/metrics/MetricsRegistry.java index 693f73b..14e1b24 100644 --- a/src/main/java/com/prometheus/spigot/metrics/MetricsRegistry.java +++ b/src/main/java/com/prometheus/spigot/metrics/MetricsRegistry.java @@ -51,6 +51,7 @@ public final class MetricsRegistry { private final ConcurrentHashMap commandsBlocked = new ConcurrentHashMap<>(); private final ConcurrentHashMap commandsExecuted = new ConcurrentHashMap<>(); private final ConcurrentHashMap itemsCraftedByMaterial = new ConcurrentHashMap<>(); + private final ConcurrentHashMap entityKills = new ConcurrentHashMap<>(); public MetricsRegistry(Server server, boolean enableJvm, boolean enableProcess) { this.server = server; @@ -133,6 +134,12 @@ public final class MetricsRegistry { incrementLabeledCounter(itemsCraftedByMaterial, material.name()); } + public void incrementEntityKill(EntityType entityType, String killer) { + String normalizedEntity = normalizeLabel(entityType.name()); + String normalizedKiller = normalizeLabel(killer); + entityKills.computeIfAbsent(new LabelPair(normalizedEntity, normalizedKiller), key -> new LongAdder()).increment(); + } + public void refreshEntitySnapshots() { Map entityCounts = new HashMap<>(); Map tileCounts = new HashMap<>(); @@ -184,6 +191,7 @@ public final class MetricsRegistry { appendLabeledCounterAdder(builder, "spigot_commands_blocked_total", "Blocked commands by name", "command", commandsBlocked); appendLabeledCounterAdder(builder, "spigot_commands_executed_total", "Commands executed by source", "command", "source", commandsExecuted); appendLabeledCounterAdder(builder, "spigot_items_crafted_total", "Items crafted by material", "material", itemsCraftedByMaterial); + appendLabeledCounterAdder(builder, "spigot_entities_killed_total", "Entities killed by player", "entity", "killer", entityKills); appendGauge(builder, "spigot_players_online", "Online player count", server.getOnlinePlayers().size()); appendGauge(builder, "spigot_players_max", "Max player slots", server.getMaxPlayers());