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(),

Reply via email to