Browse Source

added encode/decode time stats and refactoring

pull/9708/head
YevhenBondarenko 3 years ago
parent
commit
8ac80476ad
  1. 4
      common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java
  2. 4
      common/data/src/main/java/org/thingsboard/server/common/data/FstStatsService.java
  3. 8
      common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java
  4. 20
      common/stats/src/main/java/org/thingsboard/server/common/stats/FstStatsServiceImpl.java

4
common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java

@ -84,8 +84,10 @@ public abstract class RedisTbTransactionalCache<K extends Serializable, V extend
} else if (Arrays.equals(rawValue, BINARY_NULL_VALUE)) {
return SimpleTbCacheValueWrapper.empty();
} else {
long startTime = System.nanoTime();
V value = valueSerializer.deserialize(key, rawValue);
if (value != null) {
fstStatsService.recordDecodeTime(value.getClass(), startTime);
fstStatsService.incrementDecode(value.getClass());
}
return SimpleTbCacheValueWrapper.wrap(value);
@ -198,7 +200,9 @@ public abstract class RedisTbTransactionalCache<K extends Serializable, V extend
return BINARY_NULL_VALUE;
} else {
try {
long startTime = System.nanoTime();
var bytes = valueSerializer.serialize(value);
fstStatsService.recordEncodeTime(value.getClass(), startTime);
fstStatsService.incrementEncode(value.getClass());
return bytes;
} catch (Exception e) {

4
common/data/src/main/java/org/thingsboard/server/common/data/FstStatsService.java

@ -21,4 +21,8 @@ public interface FstStatsService {
void incrementDecode(Class<?> clazz);
void recordEncodeTime(Class<?> clazz, long startTime);
void recordDecodeTime(Class<?> clazz, long startTime);
}

8
common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java

@ -36,8 +36,12 @@ public class ProtoWithFSTService implements DataDecodingEncodingService {
@Override
public <T> Optional<T> decode(byte[] byteArray) {
try {
long startTime = System.nanoTime();
Optional<T> optional = Optional.ofNullable(FSTUtils.decode(byteArray));
optional.ifPresent(obj -> fstStatsService.incrementDecode(obj.getClass()));
optional.ifPresent(obj -> {
fstStatsService.recordDecodeTime(obj.getClass(), startTime);
fstStatsService.incrementDecode(obj.getClass());
});
return optional;
} catch (IllegalArgumentException e) {
log.error("Error during deserialization message, [{}]", e.getMessage());
@ -48,7 +52,9 @@ public class ProtoWithFSTService implements DataDecodingEncodingService {
@Override
public <T> byte[] encode(T msq) {
long startTime = System.nanoTime();
var bytes = FSTUtils.encode(msq);
fstStatsService.recordEncodeTime(msq.getClass(), startTime);
fstStatsService.incrementEncode(msq.getClass());
return bytes;
}

20
common/stats/src/main/java/org/thingsboard/server/common/stats/FstStatsServiceImpl.java

@ -15,28 +15,44 @@
*/
package org.thingsboard.server.common.stats;
import io.micrometer.core.instrument.Timer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.FstStatsService;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@Service
public class FstStatsServiceImpl implements FstStatsService {
private final ConcurrentHashMap<String, StatsCounter> encodeCounters = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, StatsCounter> decodeCounters = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Timer> encodeTimers = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Timer> decodeTimer = new ConcurrentHashMap<>();
@Autowired
private StatsFactory statsFactory;
@Override
public void incrementEncode(Class<?> clazz) {
encodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fstEncode", key)).increment();
encodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fst_encode", key)).increment();
}
@Override
public void incrementDecode(Class<?> clazz) {
decodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fstDecode", key)).increment();
decodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fst_decode", key)).increment();
}
@Override
public void recordEncodeTime(Class<?> clazz, long startTime) {
encodeTimers.computeIfAbsent(clazz.getSimpleName(),
key -> statsFactory.createTimer("fst_encode_time", "statsName", key)).record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
}
@Override
public void recordDecodeTime(Class<?> clazz, long startTime) {
decodeTimer.computeIfAbsent(clazz.getSimpleName(),
key -> statsFactory.createTimer("fst_decode_time", "statsName", key)).record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
}
}

Loading…
Cancel
Save