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 045 @Autowired 046 private FedoraToOcflObjectIndex ocflIndexImpl; 047 048 @Override 049 public FedoraOcflMapping getMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) 050 throws FedoraOcflMappingNotFoundException { 051 final var stopwatch = Timer.start(); 052 try { 053 return ocflIndexImpl.getMapping(session, fedoraResourceIdentifier); 054 } finally { 055 stopwatch.stop(getMappingTimer); 056 } 057 } 058 059 @Override 060 public FedoraOcflMapping addMapping(final Transaction session, 061 final FedoraId fedoraResourceIdentifier, 062 final FedoraId fedoraRootObjectIdentifier, 063 final String ocflObjectId) { 064 return MetricsHelper.time(addMappingTimer, () -> { 065 return ocflIndexImpl.addMapping(session, fedoraResourceIdentifier, 066 fedoraRootObjectIdentifier, ocflObjectId); 067 }); 068 } 069 070 @Override 071 public void removeMapping(final Transaction session, final FedoraId fedoraResourceIdentifier) { 072 removeMappingTimer.record(() -> { 073 ocflIndexImpl.removeMapping(session, fedoraResourceIdentifier); 074 }); 075 } 076 077 @Override 078 public void reset() { 079 resetTimer.record(() -> { 080 ocflIndexImpl.reset(); 081 }); 082 } 083 084 @Override 085 public void commit(final Transaction session) { 086 commitTimer.record(() -> { 087 ocflIndexImpl.commit(session); 088 }); 089 } 090 091 @Override 092 public void rollback(final Transaction session) { 093 rollbackTimer.record(() -> { 094 ocflIndexImpl.rollback(session); 095 }); 096 } 097 098}