View Javadoc

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