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}