This is an automated email from the ASF dual-hosted git repository. joerghoh pushed a commit to branch SLING-12262-metric-for-failures in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-repoinit.git
commit b6150664f5f69a13ca890ad71b2cd6e864adaa73 Author: Joerg Hoh <[email protected]> AuthorDate: Sat Mar 9 17:37:13 2024 +0100 SLING-12262 use a metric to indicate repoinit failures --- pom.xml | 12 +++++++++++ .../impl/RepositoryInitializerFactory.java | 21 +++++++++++++++++++- .../impl/RepositoryInitializerFactoryTest.java | 23 ++++++++++++++++++++-- .../sling/jcr/repoinit/it/RepoInitTestSupport.java | 2 ++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b40e3f8..4ff1122 100644 --- a/pom.xml +++ b/pom.xml @@ -174,6 +174,12 @@ <version>4.3.1</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.commons.metrics</artifactId> + <version>1.2.12</version> + <scope></scope> + </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.framework</artifactId> @@ -311,5 +317,11 @@ <version>4.2.0</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.13.0</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/src/main/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactory.java b/src/main/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactory.java index 447d7bb..67d40c5 100644 --- a/src/main/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactory.java +++ b/src/main/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactory.java @@ -24,6 +24,7 @@ import javax.jcr.InvalidItemStateException; import javax.jcr.RepositoryException; import javax.jcr.Session; +import org.apache.sling.commons.metrics.MetricsService; import org.apache.sling.jcr.api.SlingRepository; import org.apache.sling.jcr.api.SlingRepositoryInitializer; import org.apache.sling.jcr.repoinit.JcrRepoInitOpsProcessor; @@ -76,19 +77,28 @@ public class RepositoryInitializerFactory implements SlingRepositoryInitializer private final Logger log = LoggerFactory.getLogger(getClass()); + private static final String METRIC_REPOINIT_FAILED = RepositoryInitializerFactory.class.getName() + ".failed"; @Reference private RepoInitParser parser; @Reference private JcrRepoInitOpsProcessor processor; + + @Reference + MetricsService metrics; private RepositoryInitializerFactory.Config config; + + // assume that repoinit succeeds ... and just this to true if it fails + private boolean aRepoInitStatementFailed = false; + @Activate public void activate(final RepositoryInitializerFactory.Config config) { this.config = config; log.debug("Activated: {}", this); + metrics.gauge(METRIC_REPOINIT_FAILED, this::failureStateAsMetric); } @Override @@ -152,12 +162,12 @@ public class RepositoryInitializerFactory implements SlingRepositoryInitializer * @throws Exception if the application fails despite the retry */ protected void applyOperations(Session session, List<Operation> ops, String logMessage) throws RepositoryException { - RetryableOperation retry = new RetryableOperation.Builder().withBackoffBaseMsec(1000).withMaxRetries(3).build(); RetryableOperation.RetryableOperationResult result = applyOperationInternal(session, ops, logMessage, retry); if (!result.isSuccessful()) { String msg = String.format("Applying repoinit operation failed despite retry; set loglevel to DEBUG to see all exceptions. " + "Last exception message was: %s", result.getFailureTrace().getMessage()); + aRepoInitStatementFailed = true; throw new RepositoryException(msg, result.getFailureTrace()); } } @@ -197,6 +207,15 @@ public class RepositoryInitializerFactory implements SlingRepositoryInitializer } }, logMessage); } + + /** + * + * @return + */ + protected int failureStateAsMetric() { + return aRepoInitStatementFailed ? 1 : 0; + } + } diff --git a/src/test/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactoryTest.java b/src/test/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactoryTest.java index 7505195..1662185 100644 --- a/src/test/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactoryTest.java +++ b/src/test/java/org/apache/sling/jcr/repoinit/impl/RepositoryInitializerFactoryTest.java @@ -16,6 +16,7 @@ */ package org.apache.sling.jcr.repoinit.impl; +import org.apache.sling.commons.metrics.MetricsService; import org.apache.sling.jcr.repoinit.JcrRepoInitOpsProcessor; import org.apache.sling.jcr.repoinit.impl.RetryableOperation.RetryableOperationResult; import org.apache.sling.repoinit.parser.RepoInitParser; @@ -31,6 +32,7 @@ import javax.jcr.Session; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.fail; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -48,16 +50,33 @@ public class RepositoryInitializerFactoryTest { context.registerService(RepoInitParser.class, parser); processor = mock(JcrRepoInitOpsProcessor.class); context.registerService(JcrRepoInitOpsProcessor.class, processor); + MetricsService metrics = mock(MetricsService.class); + context.registerService(MetricsService.class, metrics); sut = new RepositoryInitializerFactory(); context.registerInjectActivateService(sut); } + + + @Test + public void successfulRun() throws RepositoryException { + // doing nothing is also considered successful ... + sut.applyOperations(mock(Session.class), null, null); + assertEquals(0,sut.failureStateAsMetric()); + } - @Test(expected = RepositoryException.class) + @Test public void handleUncheckedErrorsInOperations() throws RepositoryException { doThrow(new RepoInitException("some op failed", new Exception("root cause"))) .when(processor).apply(ArgumentMatchers.any(), ArgumentMatchers.any()); - sut.applyOperations(mock(Session.class), null, null); + try { + sut.applyOperations(mock(Session.class), null, null); + } catch (RepositoryException re) { + // expected + } catch (Exception e) { + fail(); + } + assertEquals(1,sut.failureStateAsMetric()); } // https://issues.apache.org/jira/browse/SLING-11276 diff --git a/src/test/java/org/apache/sling/jcr/repoinit/it/RepoInitTestSupport.java b/src/test/java/org/apache/sling/jcr/repoinit/it/RepoInitTestSupport.java index 026cbad..6c10e5e 100644 --- a/src/test/java/org/apache/sling/jcr/repoinit/it/RepoInitTestSupport.java +++ b/src/test/java/org/apache/sling/jcr/repoinit/it/RepoInitTestSupport.java @@ -55,6 +55,8 @@ public abstract class RepoInitTestSupport extends TestSupport { public Option[] configuration() { SlingOptions.versionResolver.setVersionFromProject("org.apache.jackrabbit", "jackrabbit-api"); SlingOptions.versionResolver.setVersionFromProject("org.apache.sling", "org.apache.sling.repoinit.parser"); + SlingOptions.versionResolver.setVersionFromProject("org.apache.sling", "org.apache.sling.commons.metrics"); + SlingOptions.versionResolver.setVersionFromProject("org.apache.commons","commons-lang3"); // for the metrics return options( composite( super.baseConfiguration(),
