Skip to content

Commit 57a3ad9

Browse files
committed
Refactor TPS metrics handling and introduce API
1 parent b5aa3cd commit 57a3ad9

File tree

3 files changed

+145
-5
lines changed

3 files changed

+145
-5
lines changed

fabric/src/main/java/it/renvins/serverpulse/fabric/ServerPulseFabric.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,69 @@
22

33
import java.util.logging.Logger;
44

5+
import it.renvins.serverpulse.api.ServerPulseProvider;
6+
import it.renvins.serverpulse.api.metrics.IDiskRetriever;
7+
import it.renvins.serverpulse.api.metrics.IPingRetriever;
8+
import it.renvins.serverpulse.api.metrics.ITPSRetriever;
9+
import it.renvins.serverpulse.api.service.IDatabaseService;
10+
import it.renvins.serverpulse.api.service.IMetricsService;
11+
import it.renvins.serverpulse.common.DatabaseService;
12+
import it.renvins.serverpulse.common.MetricsService;
13+
import it.renvins.serverpulse.common.config.DatabaseConfiguration;
14+
import it.renvins.serverpulse.common.config.MetricsConfiguration;
15+
import it.renvins.serverpulse.common.logger.PulseLogger;
16+
import it.renvins.serverpulse.common.metrics.DiskRetriever;
17+
import it.renvins.serverpulse.common.platform.Platform;
18+
import it.renvins.serverpulse.common.scheduler.TaskScheduler;
19+
import it.renvins.serverpulse.fabric.config.FabricConfiguration;
20+
import it.renvins.serverpulse.fabric.config.FabricDatabaseConfiguration;
21+
import it.renvins.serverpulse.fabric.config.FabricMetricsConfiguration;
22+
import it.renvins.serverpulse.fabric.logger.FabricLogger;
23+
import it.renvins.serverpulse.fabric.metrics.FabricPingRetriever;
24+
import it.renvins.serverpulse.fabric.metrics.FabricTPSRetriever;
25+
import it.renvins.serverpulse.fabric.platform.FabricPlatform;
26+
import it.renvins.serverpulse.fabric.task.FabricScheduler;
527
import lombok.Getter;
628
import net.fabricmc.api.ModInitializer;
729
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
30+
import net.fabricmc.loader.api.FabricLoader;
831
import net.minecraft.server.MinecraftServer;
932

1033
public class ServerPulseFabric implements ModInitializer {
1134

1235
public static final String MOD_ID = "serverpulse";
1336
public static final Logger LOGGER = Logger.getLogger(MOD_ID);
1437

38+
private final FabricConfiguration config;
39+
40+
private final Platform platform;
41+
42+
private final IDatabaseService databaseService;
43+
private final IMetricsService metricsService;
44+
45+
private final ITPSRetriever tpsRetriever;
46+
private final IDiskRetriever diskRetriever;
47+
private final IPingRetriever pingRetriever;
48+
49+
public ServerPulseFabric() {
50+
this.config = new FabricConfiguration(FabricLoader.getInstance().getConfigDir(), "config.yml");
51+
52+
PulseLogger logger = new FabricLogger();
53+
54+
this.platform = new FabricPlatform(this);
55+
TaskScheduler scheduler = new FabricScheduler();
56+
57+
DatabaseConfiguration dbConfig = new FabricDatabaseConfiguration(config);
58+
MetricsConfiguration metricsConfig = new FabricMetricsConfiguration(config);
59+
60+
this.databaseService = new DatabaseService(logger, platform, dbConfig, scheduler);
61+
this.metricsService = new MetricsService(logger, platform, metricsConfig, scheduler);
62+
63+
this.tpsRetriever = new FabricTPSRetriever(scheduler);
64+
this.diskRetriever = new DiskRetriever(FabricLoader.getInstance().getGameDir().toFile());
65+
this.pingRetriever = new FabricPingRetriever(this);
66+
}
67+
1568
@Getter private MinecraftServer server;
1669

1770
@Override
@@ -25,10 +78,28 @@ public void onInitialize() {
2578
private void onServerStarting(MinecraftServer server) {
2679
LOGGER.info("ServerPulse is starting...");
2780
this.server = server;
81+
82+
config.load();
83+
84+
ServerPulseProvider.register(new ServerPulseFabricAPI(databaseService, metricsService, tpsRetriever, diskRetriever, pingRetriever));
85+
86+
databaseService.load();
87+
if (!platform.isEnabled()) {
88+
return;
89+
}
90+
metricsService.load();
91+
92+
LOGGER.info("Starting tick monitoring task...");
93+
((FabricTPSRetriever) tpsRetriever).startTickMonitor();
2894
}
2995

3096
private void onServerStopped(MinecraftServer server) {
3197
LOGGER.info("ServerPulse is stopping...");
98+
99+
databaseService.unload();
100+
metricsService.unload();
101+
102+
ServerPulseProvider.unregister();
32103
this.server = null;
33104
}
34105
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package it.renvins.serverpulse.fabric;
2+
3+
import it.renvins.serverpulse.api.ServerPulseAPI;
4+
import it.renvins.serverpulse.api.metrics.IDiskRetriever;
5+
import it.renvins.serverpulse.api.metrics.IPingRetriever;
6+
import it.renvins.serverpulse.api.metrics.ITPSRetriever;
7+
import it.renvins.serverpulse.api.service.IDatabaseService;
8+
import it.renvins.serverpulse.api.service.IMetricsService;
9+
import lombok.RequiredArgsConstructor;
10+
11+
@RequiredArgsConstructor
12+
public class ServerPulseFabricAPI implements ServerPulseAPI {
13+
14+
private final IDatabaseService databaseService;
15+
private final IMetricsService metricsService;
16+
private final ITPSRetriever tpsRetriever;
17+
private final IDiskRetriever diskRetriever;
18+
private final IPingRetriever pingRetriever;
19+
20+
@Override
21+
public IDatabaseService getDatabaseService() {
22+
return databaseService;
23+
}
24+
25+
@Override
26+
public IMetricsService getMetricsService() {
27+
return metricsService;
28+
}
29+
30+
@Override
31+
public ITPSRetriever getTPSRetriever() {
32+
return tpsRetriever;
33+
}
34+
35+
@Override
36+
public IDiskRetriever getDiskRetriever() {
37+
return diskRetriever;
38+
}
39+
40+
@Override
41+
public IPingRetriever getPingRetriever() {
42+
return pingRetriever;
43+
}
44+
}

fabric/src/main/java/it/renvins/serverpulse/fabric/metrics/FabricTPSRetriever.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import java.util.Queue;
55

66
import it.renvins.serverpulse.api.metrics.ITPSRetriever;
7-
import it.renvins.serverpulse.fabric.task.FabricScheduler;
8-
import it.renvins.serverpulse.fabric.task.FabricTask;
7+
import it.renvins.serverpulse.common.scheduler.TaskScheduler;
98
import lombok.RequiredArgsConstructor;
109

1110
@RequiredArgsConstructor
@@ -20,7 +19,7 @@ public class FabricTPSRetriever implements ITPSRetriever {
2019

2120
private final Queue<Long> tickHistory = new LinkedList<>();
2221

23-
private final FabricScheduler scheduler;
22+
private final TaskScheduler scheduler;
2423

2524
private long lastTickTimeNano = -1;
2625

@@ -30,7 +29,8 @@ public class FabricTPSRetriever implements ITPSRetriever {
3029

3130
@Override
3231
public double[] getTPS() {
33-
return new double[0];
32+
calculateAverages();
33+
return new double[]{tps1m, tps5m, tps15m};
3434
}
3535

3636
public void startTickMonitor() {
@@ -49,7 +49,32 @@ public void startTickMonitor() {
4949
}
5050

5151
public void calculateAverages() {
52-
// Calculate TPS for 1m, 5m, and 15m
52+
long sum1m = 0, sum5m = 0, sum15m = 0;
53+
int count1m = 0, count5m = 0, count15m = 0;
54+
55+
Object[] durations = tickHistory.toArray();
56+
for (int i = durations.length - 1; i >= 0; i--) {
57+
if (!(durations[i] instanceof Long)) continue;
58+
long durationNano = (Long) durations[i];
59+
if (i < TICK_PER_MIN) {
60+
sum1m += durationNano;
61+
count1m++;
62+
}
63+
if (i < TICK_FIVE_MIN) {
64+
sum5m += durationNano;
65+
count5m++;
66+
}
67+
if (i < TICK_FIFTEEN_MIN) {
68+
sum15m += durationNano;
69+
count15m++;
70+
} else {
71+
break;
72+
}
73+
}
74+
75+
tps1m = calculateTPSFromAvgNano(sum1m, count1m);
76+
tps5m = calculateTPSFromAvgNano(sum5m, count5m);
77+
tps15m = calculateTPSFromAvgNano(sum15m, count15m);
5378
}
5479

5580
public double calculateTPSFromAvgNano(long totalNano, int count) {

0 commit comments

Comments
 (0)