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.persistence.ocfl.impl; 008 009import io.micrometer.core.instrument.Metrics; 010import io.micrometer.core.instrument.Timer; 011import org.fcrepo.common.metrics.MetricsHelper; 012import org.fcrepo.kernel.api.Transaction; 013import org.fcrepo.kernel.api.identifiers.FedoraId; 014import org.fcrepo.persistence.ocfl.api.FedoraOcflMappingNotFoundException; 015import org.fcrepo.persistence.ocfl.api.FedoraToOcflObjectIndex; 016import org.springframework.beans.factory.annotation.Autowired; 017import org.springframework.stereotype.Component; 018 019/** 020 * Wrapper for FedoraToOcflObjectIndex that adds metrics 021 * 022 * @author pwinckles 023 */ 024@Component("ocflIndex") 025public class FedoraToOcflObjectIndexMetrics implements FedoraToOcflObjectIndex { 026 027 private static final String METRIC_NAME = "fcrepo.db"; 028 private static final String DB = "db"; 029 private static final String OCFL = "ocfl"; 030 private static final String OPERATION = "operation"; 031 032 private static final Timer getMappingTimer = Metrics.timer(METRIC_NAME, 033 DB, OCFL, OPERATION, "getMapping"); 034 private static final Timer addMappingTimer = Metrics.timer(METRIC_NAME, 035 DB, OCFL, OPERATION, "addMapping"); 036 private static final Timer removeMappingTimer = Metrics.timer(METRIC_NAME, 037 DB, OCFL, OPERATION, "removeMapping"); 038 private static final Timer resetTimer = Metrics.timer(METRIC_NAME, 039 DB, OCFL, OPERATION, "reset"); 040 private static final Timer commitTimer = Metrics.timer(METRIC_NAME, 041 DB, OCFL, OPERATION, "commit"); 042 private static final Timer rollbackTimer = Metrics.timer(METRIC_NAME, 043 DB, OCFL, OPERATION, "rollback"); 044 private static final Timer clearAllTransactionsTimer = Metrics.timer(METRIC_NAME, 045 DB, OCFL, OPERATION, "clearAllTransactions"); 046 047 @Autowired 048 private FedoraToOcflObjectIndex ocflIndexImpl; 049 050 @Override 051 public FedoraOcflMapping getMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) 052 throws FedoraOcflMappingNotFoundException { 053 final var stopwatch = Timer.start(); 054 try { 055 return ocflIndexImpl.getMapping(session, fedoraResourceIdentifier); 056 } finally { 057 stopwatch.stop(getMappingTimer); 058 } 059 } 060 061 @Override 062 public FedoraOcflMapping addMapping(final Transaction session, 063 final FedoraId fedoraResourceIdentifier, 064 final FedoraId fedoraRootObjectIdentifier, 065 final String ocflObjectId) { 066 return MetricsHelper.time(addMappingTimer, () -> { 067 return ocflIndexImpl.addMapping(session, fedoraResourceIdentifier, 068 fedoraRootObjectIdentifier, ocflObjectId); 069 }); 070 } 071 072 @Override 073 public void removeMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) { 074 removeMappingTimer.record(() -> { 075 ocflIndexImpl.removeMapping(session, fedoraResourceIdentifier); 076 }); 077 } 078 079 @Override 080 public void reset() { 081 resetTimer.record(() -> { 082 ocflIndexImpl.reset(); 083 }); 084 } 085 086 @Override 087 public void commit(final Transaction session) { 088 commitTimer.record(() -> { 089 ocflIndexImpl.commit(session); 090 }); 091 } 092 093 @Override 094 public void rollback(final Transaction session) { 095 rollbackTimer.record(() -> { 096 ocflIndexImpl.rollback(session); 097 }); 098 } 099 100 @Override 101 public void clearAllTransactions() { 102 clearAllTransactionsTimer.record(() -> { 103 ocflIndexImpl.clearAllTransactions(); 104 }); 105 } 106 107}