1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.starter.actuate;
20
21 import java.sql.Connection;
22 import java.util.concurrent.atomic.AtomicReference;
23 import org.apache.syncope.core.persistence.api.DomainHolder;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26 import org.springframework.boot.actuate.health.Health;
27 import org.springframework.boot.actuate.health.HealthIndicator;
28 import org.springframework.boot.actuate.health.Status;
29 import org.springframework.jdbc.datasource.DataSourceUtils;
30
31 public class DomainsHealthIndicator implements HealthIndicator {
32
33 protected static final Logger LOG = LoggerFactory.getLogger(DomainsHealthIndicator.class);
34
35 protected final DomainHolder domainHolder;
36
37 public DomainsHealthIndicator(final DomainHolder domainHolder) {
38 this.domainHolder = domainHolder;
39 }
40
41 @Override
42 public Health health() {
43 Health.Builder builder = new Health.Builder();
44
45 AtomicReference<Boolean> anyDown = new AtomicReference<>(Boolean.FALSE);
46
47 domainHolder.getDomains().forEach((key, ds) -> {
48 Status status;
49
50 Connection conn = null;
51 try {
52 conn = DataSourceUtils.getConnection(ds);
53 status = conn.isValid(0) ? Status.UP : Status.OUT_OF_SERVICE;
54 } catch (Exception e) {
55 status = Status.DOWN;
56 LOG.debug("When attempting to connect to Domain {}", key, e);
57 } finally {
58 if (conn != null) {
59 DataSourceUtils.releaseConnection(conn, ds);
60 }
61 }
62
63 builder.withDetail(key, status);
64 if (status != Status.UP) {
65 anyDown.set(true);
66 }
67 });
68
69 builder.status(anyDown.get() ? Status.DOWN : Status.UP);
70
71 return builder.build();
72 }
73 }