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 io.micrometer.core.instrument.Metrics;
010import io.micrometer.core.instrument.Timer;
011import org.fcrepo.common.metrics.MetricsHelper;
012import org.fcrepo.kernel.api.Transaction;
013import org.fcrepo.kernel.api.identifiers.FedoraId;
014import org.fcrepo.persistence.ocfl.api.FedoraOcflMappingNotFoundException;
015import org.fcrepo.persistence.ocfl.api.FedoraToOcflObjectIndex;
016import org.springframework.beans.factory.annotation.Autowired;
017import org.springframework.stereotype.Component;
018
019/**
020 * Wrapper for FedoraToOcflObjectIndex that adds metrics
021 *
022 * @author pwinckles
023 */
024@Component("ocflIndex")
025public class FedoraToOcflObjectIndexMetrics implements FedoraToOcflObjectIndex {
026
027    private static final String METRIC_NAME = "fcrepo.db";
028    private static final String DB = "db";
029    private static final String OCFL = "ocfl";
030    private static final String OPERATION = "operation";
031
032    private static final Timer getMappingTimer = Metrics.timer(METRIC_NAME,
033            DB, OCFL, OPERATION, "getMapping");
034    private static final Timer addMappingTimer = Metrics.timer(METRIC_NAME,
035            DB, OCFL, OPERATION, "addMapping");
036    private static final Timer removeMappingTimer = Metrics.timer(METRIC_NAME,
037            DB, OCFL, OPERATION, "removeMapping");
038    private static final Timer resetTimer = Metrics.timer(METRIC_NAME,
039            DB, OCFL, OPERATION, "reset");
040    private static final Timer commitTimer = Metrics.timer(METRIC_NAME,
041            DB, OCFL, OPERATION, "commit");
042    private static final Timer rollbackTimer = Metrics.timer(METRIC_NAME,
043            DB, OCFL, OPERATION, "rollback");
044    private static final Timer clearAllTransactionsTimer = Metrics.timer(METRIC_NAME,
045            DB, OCFL, OPERATION, "clearAllTransactions");
046
047    @Autowired
048    private FedoraToOcflObjectIndex ocflIndexImpl;
049
050    @Override
051    public FedoraOcflMapping getMapping(final Transaction session, final FedoraId fedoraResourceIdentifier)
052            throws FedoraOcflMappingNotFoundException {
053        final var stopwatch = Timer.start();
054        try  {
055            return ocflIndexImpl.getMapping(session, fedoraResourceIdentifier);
056        } finally {
057            stopwatch.stop(getMappingTimer);
058        }
059    }
060
061    @Override
062    public FedoraOcflMapping addMapping(final Transaction session,
063                                        final FedoraId fedoraResourceIdentifier,
064                                        final FedoraId fedoraRootObjectIdentifier,
065                                        final String ocflObjectId) {
066        return MetricsHelper.time(addMappingTimer, () -> {
067            return ocflIndexImpl.addMapping(session, fedoraResourceIdentifier,
068                    fedoraRootObjectIdentifier, ocflObjectId);
069        });
070    }
071
072    @Override
073    public void removeMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) {
074        removeMappingTimer.record(() -> {
075            ocflIndexImpl.removeMapping(session, fedoraResourceIdentifier);
076        });
077    }
078
079    @Override
080    public void reset() {
081        resetTimer.record(() -> {
082            ocflIndexImpl.reset();
083        });
084    }
085
086    @Override
087    public void commit(final Transaction session) {
088        commitTimer.record(() -> {
089            ocflIndexImpl.commit(session);
090        });
091    }
092
093    @Override
094    public void rollback(final Transaction session) {
095        rollbackTimer.record(() -> {
096            ocflIndexImpl.rollback(session);
097        });
098    }
099
100    @Override
101    public void clearAllTransactions() {
102        clearAllTransactionsTimer.record(() -> {
103            ocflIndexImpl.clearAllTransactions();
104        });
105    }
106
107}