1 package com.atlassian.vcache.internal.core.metrics;
2
3 import com.atlassian.marshalling.api.MarshallingException;
4 import com.atlassian.marshalling.api.Unmarshaller;
5
6 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_BYTES_UNMARSHALLED;
7 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_FAILED_UNMARSHALL;
8 import static com.atlassian.vcache.internal.MetricLabel.TIMED_UNMARSHALL_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 TimedUnmarshaller<T> implements Unmarshaller<T> {
19 private final Unmarshaller<T> delegate;
20 private final MetricsRecorder metricsRecorder;
21 private final String cacheName;
22
23 TimedUnmarshaller(Unmarshaller<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 T unmarshallFrom(byte[] raw) throws MarshallingException {
31 metricsRecorder.record(cacheName, EXTERNAL, NUMBER_OF_BYTES_UNMARSHALLED, raw.length);
32 try (ElapsedTimer ignored = new ElapsedTimer(
33 t -> metricsRecorder.record(cacheName, EXTERNAL, TIMED_UNMARSHALL_CALL, t))) {
34 return delegate.unmarshallFrom(raw);
35 } catch (MarshallingException me) {
36 metricsRecorder.record(cacheName, EXTERNAL, NUMBER_OF_FAILED_UNMARSHALL, 1);
37 throw me;
38 }
39 }
40 }