This is an automated email from the ASF dual-hosted git repository.
joerghoh pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-repoinit.git
The following commit(s) were added to refs/heads/master by this push:
new 47423a3 SLING-12262 use a metric to indicate repoinit failures (#51)
47423a3 is described below
commit 47423a3525575265f366ba306bb7dd4870abf36a
Author: Jörg Hoh <[email protected]>
AuthorDate: Wed Jun 5 13:05:18 2024 +0200
SLING-12262 use a metric to indicate repoinit failures (#51)
* 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, 56 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 4e22bf5..6623777 100644
--- a/pom.xml
+++ b/pom.xml
@@ -158,6 +158,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>provided</scope>
+ </dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.framework</artifactId>
@@ -284,5 +290,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 f076dc9..7e40464 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
@@ -20,11 +20,13 @@ import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
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;
@@ -78,14 +80,22 @@ 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 AtomicBoolean aRepoInitStatementFailed = new AtomicBoolean(false);
+
private String componentId;
@@ -94,6 +104,7 @@ public class RepositoryInitializerFactory implements
SlingRepositoryInitializer
this.config = config;
this.componentId =
properties.getOrDefault(ComponentConstants.COMPONENT_ID, "").toString();
log.debug("Activated: {}", this);
+ metrics.gauge(METRIC_REPOINIT_FAILED, this::failureStateAsMetric);
}
@Override
@@ -167,6 +178,7 @@ public class RepositoryInitializerFactory implements
SlingRepositoryInitializer
if (!result.isSuccessful()) {
String msg = String.format("Applying repoinit operation failed
despite retry; set loglevel to DEBUG to see all exceptions. "
+ "Last exception message from \"%s\" was: %s",
result.getReference(), result.getFailureTrace().getMessage());
+ aRepoInitStatementFailed.set(true);
throw new RepositoryException(msg, result.getFailureTrace());
}
}
@@ -207,6 +219,15 @@ public class RepositoryInitializerFactory implements
SlingRepositoryInitializer
}
}, logMessage);
}
+
+ /**
+ * return the state of the repoinit execution usable for a simple gauge
metric
+ * @return 1 if repoinit did not finish successfully, 0 otherwise
+ */
+ protected int failureStateAsMetric() {
+ return aRepoInitStatementFailed.get() ? 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 9bdbd44..da43299 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, 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, null);
+ try {
+ sut.applyOperations(mock(Session.class), null, 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(),