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.kernel.impl.services;
008
009import io.micrometer.core.instrument.Metrics;
010import io.micrometer.core.instrument.Timer;
011import org.fcrepo.common.metrics.MetricsHelper;
012import org.fcrepo.kernel.api.RdfStream;
013import org.fcrepo.kernel.api.Transaction;
014import org.fcrepo.kernel.api.identifiers.FedoraId;
015import org.fcrepo.kernel.api.models.FedoraResource;
016import org.fcrepo.kernel.api.services.ReferenceService;
017import org.springframework.beans.factory.annotation.Autowired;
018import org.springframework.beans.factory.annotation.Qualifier;
019import org.springframework.stereotype.Component;
020
021/**
022 * ReferenceService wrapper for collecting metrics
023 *
024 * @author pwinckles
025 */
026@Component("referenceService")
027public class ReferenceServiceMetrics implements ReferenceService {
028
029    private static final String METRIC_NAME = "fcrepo.db";
030    private static final String DB = "db";
031    private static final String REFERENCE = "reference";
032    private static final String OPERATION = "operation";
033
034    private static final Timer getInboundReferences = Metrics.timer(METRIC_NAME,
035            DB, REFERENCE, OPERATION, "getInboundReferences");
036    private static final Timer deleteAllReferencesTimer = Metrics.timer(METRIC_NAME,
037            DB, REFERENCE, OPERATION, "deleteAllReferences");
038    private static final Timer updateReferencesTimer = Metrics.timer(METRIC_NAME,
039            DB, REFERENCE, OPERATION, "updateReferences");
040    private static final Timer commitTransactionTimer = Metrics.timer(METRIC_NAME,
041            DB, REFERENCE, OPERATION, "commitTransaction");
042    private static final Timer rollbackTransactionTimer = Metrics.timer(METRIC_NAME,
043            DB, REFERENCE, OPERATION, "rollbackTransaction");
044    private static final Timer resetTimer = Metrics.timer(METRIC_NAME,
045            DB, REFERENCE, OPERATION, "reset");
046    private static final Timer clearAllTransactionsTimer = Metrics.timer(METRIC_NAME,
047            DB, REFERENCE, OPERATION, "clearAllTransactions");
048
049    @Autowired
050    @Qualifier("referenceServiceImpl")
051    private ReferenceService referenceServiceImpl;
052
053    @Override
054    public RdfStream getInboundReferences(final Transaction tx, final FedoraResource resource) {
055        return MetricsHelper.time(getInboundReferences, () -> {
056            return referenceServiceImpl.getInboundReferences(tx, resource);
057        });
058    }
059
060    @Override
061    public void deleteAllReferences(final Transaction tx, final FedoraId resourceId) {
062        deleteAllReferencesTimer.record(() -> {
063            referenceServiceImpl.deleteAllReferences(tx, resourceId);
064        });
065    }
066
067    @Override
068    public void updateReferences(final Transaction tx,
069                                 final FedoraId resourceId,
070                                 final String userPrincipal,
071                                 final RdfStream rdfStream) {
072        updateReferencesTimer.record(() -> {
073            referenceServiceImpl.updateReferences(tx, resourceId, userPrincipal, rdfStream);
074        });
075    }
076
077    @Override
078    public void commitTransaction(final Transaction tx) {
079        commitTransactionTimer.record(() -> {
080            referenceServiceImpl.commitTransaction(tx);
081        });
082    }
083
084    @Override
085    public void rollbackTransaction(final Transaction tx) {
086        rollbackTransactionTimer.record(() -> {
087            referenceServiceImpl.rollbackTransaction(tx);
088        });
089    }
090
091    @Override
092    public void clearAllTransactions() {
093        clearAllTransactionsTimer.record(() -> {
094            referenceServiceImpl.clearAllTransactions();
095        });
096    }
097
098    @Override
099    public void reset() {
100        resetTimer.record(() -> {
101            referenceServiceImpl.reset();
102        });
103    }
104
105}