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}