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.search.impl;
008
009import io.micrometer.core.instrument.Metrics;
010import io.micrometer.core.instrument.Timer;
011
012import org.fcrepo.kernel.api.Transaction;
013import org.fcrepo.kernel.api.identifiers.FedoraId;
014import org.fcrepo.kernel.api.models.ResourceHeaders;
015import org.fcrepo.search.api.InvalidQueryException;
016import org.fcrepo.search.api.SearchIndex;
017import org.fcrepo.search.api.SearchParameters;
018import org.fcrepo.search.api.SearchResult;
019import org.springframework.beans.factory.annotation.Autowired;
020import org.springframework.beans.factory.annotation.Qualifier;
021import org.springframework.stereotype.Component;
022
023/**
024 * SearchIndex wrapper for collecting metrics
025 *
026 * @author pwinckles
027 */
028@Component("searchIndex")
029public class SearchIndexMetrics implements SearchIndex {
030
031    private static final String METRIC_NAME = "fcrepo.db";
032    private static final String DB = "db";
033    private static final String SEARCH = "search";
034    private static final String OPERATION = "operation";
035
036    private static final Timer addUpdateIndexTimer = Metrics.timer(METRIC_NAME,
037            DB, SEARCH, OPERATION, "addUpdateIndex");
038    private static final Timer removeFromIndexTimer = Metrics.timer(METRIC_NAME,
039            DB, SEARCH, OPERATION, "removeFromIndex");
040    private static final Timer doSearchTimer = Metrics.timer(METRIC_NAME,
041            DB, SEARCH, OPERATION, "doSearch");
042    private static final Timer resetTimer = Metrics.timer(METRIC_NAME,
043            DB, SEARCH, OPERATION, "reset");
044    private static final Timer commitTransactionTimer = Metrics.timer(METRIC_NAME,
045            DB, SEARCH, OPERATION, "commitTransaction");
046    private static final Timer rollbackTransactionTimer = Metrics.timer(METRIC_NAME,
047            DB, SEARCH, OPERATION, "rollbackTransaction");
048
049    @Autowired
050    @Qualifier("searchIndexImpl")
051    private SearchIndex searchIndexImpl;
052
053    @Override
054    public void addUpdateIndex(final Transaction transaction, final ResourceHeaders resourceHeaders) {
055        addUpdateIndexTimer.record(() -> {
056            searchIndexImpl.addUpdateIndex(transaction, resourceHeaders);
057        });
058    }
059
060    @Override
061    public void removeFromIndex(final Transaction transaction, final FedoraId fedoraId) {
062        removeFromIndexTimer.record(() -> {
063            searchIndexImpl.removeFromIndex(transaction, fedoraId);
064        });
065    }
066
067    @Override
068    public SearchResult doSearch(final SearchParameters parameters) throws InvalidQueryException {
069        final var stopwatch = Timer.start();
070        try {
071            return searchIndexImpl.doSearch(parameters);
072        } finally {
073            stopwatch.stop(doSearchTimer);
074        }
075    }
076
077    @Override
078    public void reset() {
079        resetTimer.record(() -> {
080            searchIndexImpl.reset();
081        });
082    }
083
084    @Override
085    public void commitTransaction(final Transaction tx) {
086        commitTransactionTimer.record(() -> {
087            searchIndexImpl.commitTransaction(tx);
088        });
089    }
090
091    @Override
092    public void rollbackTransaction(final Transaction tx) {
093        rollbackTransactionTimer.record(() -> {
094            searchIndexImpl.rollbackTransaction(tx);
095        });
096    }
097}