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}