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
047    @Autowired
048    @Qualifier("referenceServiceImpl")
049    private ReferenceService referenceServiceImpl;
050
051    @Override
052    public RdfStream getInboundReferences(final Transaction tx, final FedoraResource resource) {
053        return MetricsHelper.time(getInboundReferences, () -> {
054            return referenceServiceImpl.getInboundReferences(tx, resource);
055        });
056    }
057
058    @Override
059    public void deleteAllReferences(final Transaction tx, final FedoraId resourceId) {
060        deleteAllReferencesTimer.record(() -> {
061            referenceServiceImpl.deleteAllReferences(tx, resourceId);
062        });
063    }
064
065    @Override
066    public void updateReferences(final Transaction tx,
067                                 final FedoraId resourceId,
068                                 final String userPrincipal,
069                                 final RdfStream rdfStream) {
070        updateReferencesTimer.record(() -> {
071            referenceServiceImpl.updateReferences(tx, resourceId, userPrincipal, rdfStream);
072        });
073    }
074
075    @Override
076    public void commitTransaction(final Transaction tx) {
077        commitTransactionTimer.record(() -> {
078            referenceServiceImpl.commitTransaction(tx);
079        });
080    }
081
082    @Override
083    public void rollbackTransaction(final Transaction tx) {
084        rollbackTransactionTimer.record(() -> {
085            referenceServiceImpl.rollbackTransaction(tx);
086        });
087    }
088
089    @Override
090    public void reset() {
091        resetTimer.record(() -> {
092            referenceServiceImpl.reset();
093        });
094    }
095
096}