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
045    @Autowired
046    private FedoraToOcflObjectIndex ocflIndexImpl;
047
048    @Override
049    public FedoraOcflMapping getMapping(final Transaction session, final FedoraId fedoraResourceIdentifier)
050            throws FedoraOcflMappingNotFoundException {
051        final var stopwatch = Timer.start();
052        try  {
053            return ocflIndexImpl.getMapping(session, fedoraResourceIdentifier);
054        } finally {
055            stopwatch.stop(getMappingTimer);
056        }
057    }
058
059    @Override
060    public FedoraOcflMapping addMapping(final Transaction session,
061                                        final FedoraId fedoraResourceIdentifier,
062                                        final FedoraId fedoraRootObjectIdentifier,
063                                        final String ocflObjectId) {
064        return MetricsHelper.time(addMappingTimer, () -> {
065            return ocflIndexImpl.addMapping(session, fedoraResourceIdentifier,
066                    fedoraRootObjectIdentifier, ocflObjectId);
067        });
068    }
069
070    @Override
071    public void removeMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) {
072        removeMappingTimer.record(() -> {
073            ocflIndexImpl.removeMapping(session, fedoraResourceIdentifier);
074        });
075    }
076
077    @Override
078    public void reset() {
079        resetTimer.record(() -> {
080            ocflIndexImpl.reset();
081        });
082    }
083
084    @Override
085    public void commit(final Transaction session) {
086        commitTimer.record(() -> {
087            ocflIndexImpl.commit(session);
088        });
089    }
090
091    @Override
092    public void rollback(final Transaction session) {
093        rollbackTimer.record(() -> {
094            ocflIndexImpl.rollback(session);
095        });
096    }
097
098}