mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-25 06:58:39 +00:00
offer JMX metrics for leaderboard computation times, Prometheus-ready
Change-Id: Iffe9049808139aea314a0206a4e958efc39e580f
This commit is contained in:
@@ -19,5 +19,7 @@ public interface LeaderboardMXBean extends Named {
|
||||
String getType();
|
||||
long getDelayToLiveInMillis();
|
||||
String getBoatClass();
|
||||
ComputationTimeAverage[] getComputationTimeAverages();
|
||||
ComputationTimeAverage getComputationTimeAverageYoung();
|
||||
ComputationTimeAverage getComputationTimeAverageMedium();
|
||||
ComputationTimeAverage getComputationTimeAverageOld();
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.sap.sailing.server;
|
||||
import javax.management.MalformedObjectNameException;
|
||||
import javax.management.ObjectName;
|
||||
|
||||
import com.sap.sailing.server.LeaderboardMXBean.ComputationTimeAverage;
|
||||
import com.sap.sailing.server.interfaces.RacingEventService;
|
||||
|
||||
/**
|
||||
@@ -16,4 +17,7 @@ public interface RacingEventServiceMXBean {
|
||||
public long getNumberOfTrackedRacesToRestore();
|
||||
public int getNumberOfTrackedRacesRestored();
|
||||
ObjectName[] getLeaderboards() throws MalformedObjectNameException;
|
||||
ComputationTimeAverage getLeaderboardComputationStatisticsYoung();
|
||||
ComputationTimeAverage getLeaderboardComputationStatisticsMedium();
|
||||
ComputationTimeAverage getLeaderboardComputationStatisticsOld();
|
||||
}
|
||||
|
||||
+19
-8
@@ -1,7 +1,7 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.management.MalformedObjectNameException;
|
||||
import javax.management.ObjectName;
|
||||
@@ -96,15 +96,26 @@ public class LeaderboardMXBeanImpl implements LeaderboardMXBean {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage[] getComputationTimeAverages() {
|
||||
final Map<Duration, Pair<Duration, Integer>> computationTimeStatistics = getLeaderboard().getComputationTimeStatistics();
|
||||
final ComputationTimeAverage[] result = new ComputationTimeAverage[computationTimeStatistics.size()];
|
||||
int i=0;
|
||||
for (final Entry<Duration, Pair<Duration, Integer>> e : computationTimeStatistics.entrySet()) {
|
||||
result[i++] = new ComputationTimeAverageImpl(e.getKey().asMillis(),
|
||||
public ComputationTimeAverage getComputationTimeAverageYoung() {
|
||||
return getComputationTimeAverages(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage getComputationTimeAverageMedium() {
|
||||
return getComputationTimeAverages(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage getComputationTimeAverageOld() {
|
||||
return getComputationTimeAverages(2);
|
||||
}
|
||||
|
||||
private ComputationTimeAverage getComputationTimeAverages(int indexInStatsSortedByAscendingSampleDuration) {
|
||||
final TreeMap<Duration, Pair<Duration, Integer>> computationTimeStatistics = new TreeMap<>(getLeaderboard().getComputationTimeStatistics());
|
||||
final Entry<Duration, Pair<Duration, Integer>> e = Util.get(computationTimeStatistics.entrySet(), indexInStatsSortedByAscendingSampleDuration);
|
||||
final ComputationTimeAverage result = new ComputationTimeAverageImpl(e.getKey().asMillis(),
|
||||
e.getValue().getA()==null?-1:e.getValue().getA().asMillis(),
|
||||
e.getValue().getB());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
+50
@@ -1,13 +1,21 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import javax.management.MalformedObjectNameException;
|
||||
import javax.management.ObjectName;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.server.LeaderboardMXBean.ComputationTimeAverage;
|
||||
import com.sap.sailing.server.RacingEventServiceMXBean;
|
||||
import com.sap.sailing.server.impl.LeaderboardMXBeanImpl.ComputationTimeAverageImpl;
|
||||
import com.sap.sailing.server.interfaces.RacingEventService;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
|
||||
public class RacingEventServiceMXBeanImpl implements RacingEventServiceMXBean {
|
||||
private final RacingEventService racingEventService;
|
||||
@@ -45,4 +53,46 @@ public class RacingEventServiceMXBeanImpl implements RacingEventServiceMXBean {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage getLeaderboardComputationStatisticsYoung() {
|
||||
return getLeaderboardComputationStatistics(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage getLeaderboardComputationStatisticsMedium() {
|
||||
return getLeaderboardComputationStatistics(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComputationTimeAverage getLeaderboardComputationStatisticsOld() {
|
||||
return getLeaderboardComputationStatistics(2);
|
||||
}
|
||||
|
||||
private ComputationTimeAverage getLeaderboardComputationStatistics(int indexInStatsSortedByAscendingSampleDuration) {
|
||||
final TreeMap<Duration, Pair<AtomicLong, AtomicInteger>> computationDurationSumsInMillisPerSamplingDuration = new TreeMap<>();
|
||||
for (final Leaderboard leaderboard : getRacingEventService().getLeaderboards().values()) {
|
||||
for (final Entry<Duration, Pair<Duration, Integer>> leaderboardStats : leaderboard.getComputationTimeStatistics().entrySet()) {
|
||||
if (leaderboardStats.getValue().getA() != null) {
|
||||
final long computationTimeForLeaderboardInRangeInMillis = leaderboardStats.getValue().getA().asMillis() * leaderboardStats.getValue().getB();
|
||||
computationDurationSumsInMillisPerSamplingDuration.compute(leaderboardStats.getKey(),
|
||||
(final Duration key, final Pair<AtomicLong, AtomicInteger> oldComputationDurationSumAndCount)->{
|
||||
final Pair<AtomicLong, AtomicInteger> newValue;
|
||||
if (oldComputationDurationSumAndCount == null) {
|
||||
newValue = new Pair<>(new AtomicLong(computationTimeForLeaderboardInRangeInMillis), new AtomicInteger(leaderboardStats.getValue().getB()));
|
||||
} else {
|
||||
oldComputationDurationSumAndCount.getA().addAndGet(computationTimeForLeaderboardInRangeInMillis);
|
||||
oldComputationDurationSumAndCount.getB().addAndGet(leaderboardStats.getValue().getB());
|
||||
newValue = oldComputationDurationSumAndCount;
|
||||
}
|
||||
return newValue;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
final Entry<Duration, Pair<AtomicLong, AtomicInteger>> relevantEntry = Util.get(
|
||||
computationDurationSumsInMillisPerSamplingDuration.entrySet(), indexInStatsSortedByAscendingSampleDuration);
|
||||
return new ComputationTimeAverageImpl(relevantEntry.getKey().asMillis(),
|
||||
relevantEntry.getValue().getA().get() / relevantEntry.getValue().getB().get(), relevantEntry.getValue().getB().get());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ startDelaySeconds: 0
|
||||
ssl: false
|
||||
lowercaseOutputName: false
|
||||
lowercaseOutputLabelNames: false
|
||||
#whitelistObjectNames: ["com.sap.*:*", "sap.management:*"]
|
||||
whitelistObjectNames: ["com.sap.*:*", "sap.management:*"]
|
||||
#blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]
|
||||
#rules:
|
||||
# - pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)'
|
||||
|
||||
Reference in New Issue
Block a user