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 prepareTimer = Metrics.timer(METRIC_NAME, OPERATION, "prepare"); 039 private static final Timer commitTimer = Metrics.timer(METRIC_NAME, OPERATION, "commit"); 040 private static final Timer rollbackTimer = Metrics.timer(METRIC_NAME, OPERATION, "rollback"); 041 042 private final PersistentStorageSession delegate; 043 044 public OcflPersistentStorageSessionMetrics(final PersistentStorageSession delegate) { 045 this.delegate = delegate; 046 } 047 048 @Override 049 public String getId() { 050 return delegate.getId(); 051 } 052 053 @Override 054 public void persist(final ResourceOperation operation) throws PersistentStorageException { 055 persistTimer.record(() -> { 056 delegate.persist(operation); 057 }); 058 } 059 060 @Override 061 public ResourceHeaders getHeaders(final FedoraId identifier, final Instant version) 062 throws PersistentStorageException { 063 return MetricsHelper.time(getHeadersTimer, () -> { 064 return delegate.getHeaders(identifier, version); 065 }); 066 } 067 068 @Override 069 public RdfStream getTriples(final FedoraId identifier, final Instant version) throws PersistentStorageException { 070 return MetricsHelper.time(getTriplesTimer, () -> { 071 return delegate.getTriples(identifier, version); 072 }); 073 } 074 075 @Override 076 public InputStream getBinaryContent(final FedoraId identifier, final Instant version) 077 throws PersistentStorageException { 078 return MetricsHelper.time(getContentTimer, () -> { 079 return delegate.getBinaryContent(identifier, version); 080 }); 081 } 082 083 @Override 084 public List<Instant> listVersions(final FedoraId identifier) throws PersistentStorageException { 085 return MetricsHelper.time(listVersionsTimer, () -> { 086 return delegate.listVersions(identifier); 087 }); 088 } 089 090 @Override 091 public void prepare() throws PersistentStorageException { 092 prepareTimer.record(delegate::prepare); 093 } 094 095 @Override 096 public void commit() throws PersistentStorageException { 097 commitTimer.record(delegate::commit); 098 } 099 100 @Override 101 public void rollback() throws PersistentStorageException { 102 rollbackTimer.record(delegate::rollback); 103 } 104 105}