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}