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}