Skip to content

Commit e4db978

Browse files
Additional Tags for repository initialisation metrics.
Add the interface type name the repository is created for, query executors, as well as the number of fragments and measurements about potential post processors.
1 parent 4bdd92c commit e4db978

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

src/main/java/org/springframework/data/repository/core/support/RepositoryComposition.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ public BiFunction<Method, Object[], Object[]> getArgumentConverter() {
364364
* Value object representing an ordered list of {@link RepositoryFragment fragments}.
365365
*
366366
* @author Mark Paluch
367+
* @author Christoph Strobl
367368
*/
368369
public static class RepositoryFragments implements Streamable<RepositoryFragment<?>> {
369370

@@ -550,6 +551,16 @@ private static Method findMethod(InvokedMethod invokedMethod, MethodLookup looku
550551
return null;
551552
}
552553

554+
/**
555+
* Returns the number of {@link RepositoryFragment fragments} available.
556+
*
557+
* @return the number of {@link RepositoryFragment fragments}.
558+
* @since 2.5
559+
*/
560+
public int size() {
561+
return fragments.size();
562+
}
563+
553564
/*
554565
* (non-Javadoc)
555566
* @see java.lang.Object#toString()

src/main/java/org/springframework/data/repository/core/support/RepositoryFactorySupport.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.List;
2323
import java.util.Map;
2424
import java.util.Optional;
25-
import java.util.function.Consumer;
2625
import java.util.stream.Collectors;
2726

2827
import org.aopalliance.intercept.MethodInterceptor;
@@ -37,7 +36,6 @@
3736
import org.springframework.beans.factory.BeanFactory;
3837
import org.springframework.beans.factory.BeanFactoryAware;
3938
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
40-
import org.springframework.context.ApplicationContext;
4139
import org.springframework.core.convert.support.DefaultConversionService;
4240
import org.springframework.core.convert.support.GenericConversionService;
4341
import org.springframework.core.log.LogMessage;
@@ -280,12 +278,15 @@ public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fra
280278
ApplicationStartup applicationStartup = getStartup();
281279

282280
StartupStep repositoryInit = applicationStartup.start("spring.data.repository.init");
281+
repositoryInit.tag("repository", () -> repositoryInterface.getName());
283282

284283
StartupStep repositoryMetadataStep = applicationStartup.start("spring.data.repository.metadata");
285284
RepositoryMetadata metadata = getRepositoryMetadata(repositoryInterface);
286285
repositoryMetadataStep.end();
287286

288287
StartupStep repositoryCompositionStep = applicationStartup.start("spring.data.repository.composition");
288+
repositoryCompositionStep.tag("fragment.count", () -> String.valueOf(fragments.size()));
289+
289290
RepositoryComposition composition = getRepositoryComposition(metadata, fragments);
290291
RepositoryInformation information = getRepositoryInformation(metadata, composition);
291292
repositoryCompositionStep.end();
@@ -309,45 +310,51 @@ public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fra
309310
result.addAdvisor(ExposeInvocationInterceptor.ADVISOR);
310311

311312
StartupStep repositoryPostprocessorsStep = applicationStartup.start("spring.data.repository.postprocessors");
312-
postProcessors.forEach(processor -> processor.postProcess(result, information));
313+
postProcessors.forEach(processor -> {
314+
315+
StartupStep singlePostProcessor = applicationStartup.start("spring.data.repository.postprocessor");
316+
singlePostProcessor.tag("type", processor.getClass().getName());
317+
processor.postProcess(result, information);
318+
singlePostProcessor.end();
319+
});
313320
repositoryPostprocessorsStep.end();
314321

315322
if (DefaultMethodInvokingMethodInterceptor.hasDefaultMethods(repositoryInterface)) {
316323
result.addAdvice(new DefaultMethodInvokingMethodInterceptor());
317324
}
318325

326+
StartupStep queryExecutorsStep = applicationStartup.start("spring.data.repository.queryexecutors");
319327
ProjectionFactory projectionFactory = getProjectionFactory(classLoader, beanFactory);
320328
Optional<QueryLookupStrategy> queryLookupStrategy = getQueryLookupStrategy(queryLookupStrategyKey,
321329
evaluationContextProvider);
322330
result.addAdvice(new QueryExecutorMethodInterceptor(information, projectionFactory, queryLookupStrategy,
323331
namedQueries, queryPostProcessors, methodInvocationListeners));
332+
queryExecutorsStep.end();
324333

325334
composition = composition.append(RepositoryFragment.implemented(target));
326335
result.addAdvice(new ImplementationMethodExecutionInterceptor(information, composition, methodInvocationListeners));
327336

328337
T repository = (T) result.getProxy(classLoader);
329338
repositoryProxyStep.end();
339+
repositoryInit.end();
330340

331341
if (logger.isDebugEnabled()) {
332342
logger.debug(LogMessage.format("Finished creation of repository instance for {}.",
333343
repositoryInterface.getName()));
334344
}
335345

336-
repositoryInit.end();
337346
return repository;
338347
}
339348

340349
ApplicationStartup getStartup() {
341350

342351
try {
343352

344-
ApplicationStartup applicationStartup = beanFactory != null
345-
? beanFactory.getBean(ApplicationStartup.class)
346-
: ApplicationStartup.DEFAULT;
353+
ApplicationStartup applicationStartup = beanFactory != null ? beanFactory.getBean(ApplicationStartup.class)
354+
: ApplicationStartup.DEFAULT;
347355

348356
return applicationStartup != null ? applicationStartup : ApplicationStartup.DEFAULT;
349-
}
350-
catch (NoSuchBeanDefinitionException e) {
357+
} catch (NoSuchBeanDefinitionException e) {
351358
return ApplicationStartup.DEFAULT;
352359
}
353360
}

src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@
3535
import org.junit.jupiter.api.Test;
3636
import org.junit.jupiter.api.extension.ExtendWith;
3737
import org.mockito.ArgumentCaptor;
38+
import org.mockito.InOrder;
3839
import org.mockito.Mock;
3940
import org.mockito.Mockito;
4041
import org.mockito.junit.jupiter.MockitoExtension;
4142
import org.mockito.junit.jupiter.MockitoSettings;
4243
import org.mockito.quality.Strictness;
4344
import org.springframework.aop.framework.ProxyFactory;
4445
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
46+
import org.springframework.core.metrics.ApplicationStartup;
4547
import org.springframework.dao.EmptyResultDataAccessException;
4648
import org.springframework.data.domain.Page;
4749
import org.springframework.data.domain.PageImpl;
@@ -406,10 +408,19 @@ void considersNullabilityForKotlinInterfaceProperties() {
406408
}
407409

408410
@Test // DATACMNS-1832
409-
void callsApplicationStartupOnRepositoryIntialization() {
411+
void callsApplicationStartupOnRepositoryInitialization() {
410412

411413
factory.getRepository(ObjectRepository.class, backingRepo);
412-
verify(factory.getApplicationStartup()).start("spring.data.repository.init");
414+
415+
ApplicationStartup startup = factory.getApplicationStartup();
416+
417+
InOrder orderedInvocation = Mockito.inOrder(startup);
418+
orderedInvocation.verify(startup).start("spring.data.repository.init");
419+
orderedInvocation.verify(startup).start("spring.data.repository.metadata");
420+
orderedInvocation.verify(startup).start("spring.data.repository.composition");
421+
orderedInvocation.verify(startup).start("spring.data.repository.target");
422+
orderedInvocation.verify(startup).start("spring.data.repository.proxy");
423+
orderedInvocation.verify(startup).start("spring.data.repository.postprocessors");
413424
}
414425

415426
private ConvertingRepository prepareConvertingRepository(final Object expectedValue) {

0 commit comments

Comments
 (0)