offer JMX metrics for leaderboard computation times, Prometheus-ready

Change-Id: Iffe9049808139aea314a0206a4e958efc39e580f
This commit is contained in:
Axel Uhl
2019-07-26 11:28:38 +02:00
parent 3fb868ee55
commit f22aebc7e6
5 changed files with 77 additions and 10 deletions
@@ -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();
}
@@ -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;
}
}
@@ -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());
}
}
+1 -1
View File
@@ -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+)'