View Javadoc

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   * Wrapper for a {@link Unmarshaller} that records metrics.
14   *
15   * @param <T> the value type
16   * @since 1.0.0
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  }