1 package com.atlassian.vcache.internal.core.metrics;
2
3 import com.atlassian.marshalling.api.Marshaller;
4 import com.atlassian.marshalling.api.MarshallingException;
5
6 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_BYTES_MARSHALLED;
7 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_FAILED_MARSHALL;
8 import static com.atlassian.vcache.internal.MetricLabel.TIMED_MARSHALL_CALL;
9 import static com.atlassian.vcache.internal.core.metrics.CacheType.EXTERNAL;
10 import static java.util.Objects.requireNonNull;
11
12
13
14
15
16
17
18 class TimedMarshaller<T> implements Marshaller<T> {
19 private final Marshaller<T> delegate;
20 private final MetricsRecorder metricsRecorder;
21 private final String cacheName;
22
23 TimedMarshaller(Marshaller<T> delegate, MetricsRecorder metricsRecorder, String cacheName) {
24 this.delegate = requireNonNull(delegate);
25 this.metricsRecorder = requireNonNull(metricsRecorder);
26 this.cacheName = requireNonNull(cacheName);
27 }
28
29 @Override
30 public byte[] marshallToBytes(T obj) throws MarshallingException {
31 try (ElapsedTimer ignored = new ElapsedTimer(
32 t -> metricsRecorder.record(cacheName, EXTERNAL, TIMED_MARSHALL_CALL, t))) {
33 final byte[] result = delegate.marshallToBytes(obj);
34 metricsRecorder.record(cacheName, EXTERNAL, NUMBER_OF_BYTES_MARSHALLED, result.length);
35 return result;
36 } catch (MarshallingException me) {
37 metricsRecorder.record(cacheName, EXTERNAL, NUMBER_OF_FAILED_MARSHALL, 1);
38 throw me;
39 }
40 }
41 }