001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006 007package org.fcrepo.persistence.ocfl.impl; 008 009import java.io.InputStream; 010import java.time.Instant; 011import java.util.List; 012 013import org.fcrepo.common.metrics.MetricsHelper; 014import org.fcrepo.kernel.api.RdfStream; 015import org.fcrepo.kernel.api.identifiers.FedoraId; 016import org.fcrepo.kernel.api.models.ResourceHeaders; 017import org.fcrepo.kernel.api.operations.ResourceOperation; 018import org.fcrepo.persistence.api.PersistentStorageSession; 019import org.fcrepo.persistence.api.exceptions.PersistentStorageException; 020 021import io.micrometer.core.instrument.Metrics; 022import io.micrometer.core.instrument.Timer; 023 024/** 025 * PersistentStorageSession wrapper for collecting metrics 026 * 027 * @author pwinckles 028 */ 029public class OcflPersistentStorageSessionMetrics implements PersistentStorageSession { 030 031 private static final String METRIC_NAME = "fcrepo.storage.ocfl.session"; 032 private static final String OPERATION = "operation"; 033 private static final Timer persistTimer = Metrics.timer(METRIC_NAME, OPERATION, "persist"); 034 private static final Timer getHeadersTimer = Metrics.timer(METRIC_NAME, OPERATION, "getHeaders"); 035 private static final Timer getTriplesTimer = Metrics.timer(METRIC_NAME, OPERATION, "getTriples"); 036 private static final Timer listVersionsTimer = Metrics.timer(METRIC_NAME, OPERATION, "listVersions"); 037 private static final Timer getContentTimer = Metrics.timer(METRIC_NAME, OPERATION, "getContent"); 038 private static final Timer getRangeTimer = Metrics.timer(METRIC_NAME, OPERATION, "getRange"); 039 private static final Timer prepareTimer = Metrics.timer(METRIC_NAME, OPERATION, "prepare"); 040 private static final Timer commitTimer = Metrics.timer(METRIC_NAME, OPERATION, "commit"); 041 private static final Timer rollbackTimer = Metrics.timer(METRIC_NAME, OPERATION, "rollback"); 042 043 private final PersistentStorageSession delegate; 044 045 public OcflPersistentStorageSessionMetrics(final PersistentStorageSession delegate) { 046 this.delegate = delegate; 047 } 048 049 @Override 050 public String getId() { 051 return delegate.getId(); 052 } 053 054 @Override 055 public void persist(final ResourceOperation operation) throws PersistentStorageException { 056 persistTimer.record(() -> { 057 delegate.persist(operation); 058 }); 059 } 060 061 @Override 062 public ResourceHeaders getHeaders(final FedoraId identifier, final Instant version) 063 throws PersistentStorageException { 064 return MetricsHelper.time(getHeadersTimer, () -> { 065 return delegate.getHeaders(identifier, version); 066 }); 067 } 068 069 @Override 070 public RdfStream getTriples(final FedoraId identifier, final Instant version) throws PersistentStorageException { 071 return MetricsHelper.time(getTriplesTimer, () -> { 072 return delegate.getTriples(identifier, version); 073 }); 074 } 075 076 @Override 077 public InputStream getBinaryContent(final FedoraId identifier, final Instant version) 078 throws PersistentStorageException { 079 return MetricsHelper.time(getContentTimer, () -> { 080 return delegate.getBinaryContent(identifier, version); 081 }); 082 } 083 084 @Override 085 public InputStream getBinaryRange(final FedoraId identifier, final Instant version, 086 final long start, final long end) throws PersistentStorageException { 087 return MetricsHelper.time(getRangeTimer, () -> { 088 return delegate.getBinaryRange(identifier, version, start, end); 089 }); 090 } 091 092 @Override 093 public List<Instant> listVersions(final FedoraId identifier) throws PersistentStorageException { 094 return MetricsHelper.time(listVersionsTimer, () -> { 095 return delegate.listVersions(identifier); 096 }); 097 } 098 099 @Override 100 public void prepare() throws PersistentStorageException { 101 prepareTimer.record(delegate::prepare); 102 } 103 104 @Override 105 public void commit() throws PersistentStorageException { 106 commitTimer.record(delegate::commit); 107 } 108 109 @Override 110 public void rollback() throws PersistentStorageException { 111 rollbackTimer.record(delegate::rollback); 112 } 113 114}