diff --git a/src/main/java/in/projecteka/monitor/Constants.java b/src/main/java/in/projecteka/monitor/Constants.java index f9986c7..45846bf 100644 --- a/src/main/java/in/projecteka/monitor/Constants.java +++ b/src/main/java/in/projecteka/monitor/Constants.java @@ -6,6 +6,7 @@ public class Constants { public static final String CURRENT_VERSION = "/" + API_VERSION; public static final String PATH_HEARTBEAT = CURRENT_VERSION + "/heartbeat"; - + public static final String PATH_READINESS = CURRENT_VERSION + "/readiness"; + private Constants() {} } diff --git a/src/main/java/in/projecteka/monitor/Metric.java b/src/main/java/in/projecteka/monitor/Metric.java index c85c11a..6970839 100644 --- a/src/main/java/in/projecteka/monitor/Metric.java +++ b/src/main/java/in/projecteka/monitor/Metric.java @@ -24,15 +24,16 @@ public class Metric { private final MetricServiceClient metricServiceClient; private static final HashMap gaugeMap = new HashMap<>(); - public void processRequests() { + public void processRequests(Boolean isReadiness) { Service service = metricServiceClient.getService(); - process(service.getBridgeProperties()); - process(service.getConsentManagerProperties()); + process(service.getBridgeProperties(), isReadiness); + process(service.getConsentManagerProperties(), isReadiness); } - private void process(List properties) { + private void process(List properties, Boolean isReadiness) { properties.forEach(property -> { - String path = String.format("%s%s", property.getUrl(), Constants.PATH_HEARTBEAT); + String path = isReadiness ? String.format("%s%s", property.getUrl(), Constants.PATH_READINESS) + : String.format("%s%s", property.getUrl(), Constants.PATH_HEARTBEAT); HeartbeatResponse heartbeatResponse = metricServiceClient.getHeartbeat(path); if (!gaugeMap.containsKey(PROJECT_EKA_METRICS + property.getType())) { Gauge gaugeStatus = Gauge.build() @@ -41,18 +42,19 @@ private void process(List properties) { .help("Heartbeat Status") .register(); gaugeMap.put(PROJECT_EKA_METRICS + property.getType(), gaugeStatus); - appendToStatus(property, path, heartbeatResponse, gaugeStatus); + appendToStatus(property, path, heartbeatResponse, gaugeStatus, isReadiness); } else { - appendToStatus(property, path, heartbeatResponse, gaugeMap.get(PROJECT_EKA_METRICS + property.getType())); + appendToStatus(property, path, heartbeatResponse, gaugeMap.get(PROJECT_EKA_METRICS + property.getType()), isReadiness); } }); } private void appendToStatus(ServiceProperties property, String path, HeartbeatResponse heartbeatResponse, - Gauge status) { + Gauge status, + Boolean isReadiness) { if (heartbeatResponse.getStatus().equals(DOWN)) { - String lastUpTime = metricRepository.getIfPresent(path).block(); + String lastUpTime = metricRepository.getIfPresent(path, isReadiness).block(); status.labels(property.getName(), property.getId(), path, @@ -60,11 +62,11 @@ private void appendToStatus(ServiceProperties property, String path, lastUpTime).set(0); } else { LocalDateTime lastUpTime = LocalDateTime.now(UTC); - Boolean isPresent = isEntryPresent(path).block(); + Boolean isPresent = isEntryPresent(path, isReadiness).block(); if (isPresent) { - metricRepository.update(lastUpTime, path).block(); + metricRepository.update(lastUpTime, path, isReadiness).block(); } else { - metricRepository.insert(path, Status.UP.toString(), lastUpTime).block(); + metricRepository.insert(path, Status.UP.toString(), lastUpTime, isReadiness).block(); } status.labels(property.getName(), property.getId(), @@ -74,8 +76,8 @@ private void appendToStatus(ServiceProperties property, String path, } } - private Mono isEntryPresent(String path) { - return metricRepository.getIfPresent(path) + private Mono isEntryPresent(String path, Boolean isReadiness) { + return metricRepository.getIfPresent(path, isReadiness) .map(entry -> !entry.equals("")) .switchIfEmpty(defer(() -> just(false))); } diff --git a/src/main/java/in/projecteka/monitor/MetricController.java b/src/main/java/in/projecteka/monitor/MetricController.java index 1631371..7950de7 100644 --- a/src/main/java/in/projecteka/monitor/MetricController.java +++ b/src/main/java/in/projecteka/monitor/MetricController.java @@ -17,7 +17,14 @@ public class MetricController { @GetMapping(path = "/metrics") public void metrics(Writer responseWriter) throws IOException { - metric.processRequests(); + metric.processRequests(false); + TextFormat.write004(responseWriter, CollectorRegistry.defaultRegistry.metricFamilySamples()); + responseWriter.close(); + } + + @GetMapping(path = "/readiness") + public void readiness(Writer responseWriter) throws IOException { + metric.processRequests(true); TextFormat.write004(responseWriter, CollectorRegistry.defaultRegistry.metricFamilySamples()); responseWriter.close(); } diff --git a/src/main/java/in/projecteka/monitor/MetricRepository.java b/src/main/java/in/projecteka/monitor/MetricRepository.java index d1e8a47..229787a 100644 --- a/src/main/java/in/projecteka/monitor/MetricRepository.java +++ b/src/main/java/in/projecteka/monitor/MetricRepository.java @@ -13,16 +13,21 @@ public class MetricRepository { private static final String INSERT_TO_METRICS = "INSERT INTO metrics " + "(path, status, last_up_time) VALUES ($1, $2, $3)"; private static final String UPDATE_TO_METRICS = "UPDATE metrics SET last_up_time = $1 WHERE path = $2"; - private static final String SELECT_LAST_UP_TIME = "SELECT last_up_time FROM metrics WHERE path=$1"; + private static final String SELECT_LAST_UP_TIME_FOR_METRICS = "SELECT last_up_time FROM metrics WHERE path=$1"; + private static final String INSERT_TO_READINESS = "INSERT INTO readiness " + + "(path, status, last_up_time) VALUES ($1, $2, $3)"; + private static final String UPDATE_TO_READINESS = "UPDATE readiness SET last_up_time = $1 WHERE path = $2"; + private static final String SELECT_LAST_UP_TIME_FOR_READINESS = "SELECT last_up_time FROM readiness WHERE path=$1"; private final PgPool dbClient; public MetricRepository(PgPool dbClient) { this.dbClient = dbClient; } - public Mono insert(String path, String status, LocalDateTime lastUpTime) { + public Mono insert(String path, String status, LocalDateTime lastUpTime, Boolean isReadiness) { + var query = isReadiness ? INSERT_TO_READINESS : INSERT_TO_METRICS; return Mono.create(monoSink -> - dbClient.preparedQuery(INSERT_TO_METRICS) + dbClient.preparedQuery(query) .execute(Tuple.of(path, status, lastUpTime), handler -> { if (handler.failed()) { @@ -34,9 +39,10 @@ public Mono insert(String path, String status, LocalDateTime lastUpTime) { })); } - public Mono update(LocalDateTime lastUpTime, String path) { + public Mono update(LocalDateTime lastUpTime, String path,Boolean isReadiness) { + var query = isReadiness ? UPDATE_TO_READINESS : UPDATE_TO_METRICS; return Mono.create(monoSink -> - dbClient.preparedQuery(UPDATE_TO_METRICS) + dbClient.preparedQuery(query) .execute(Tuple.of(lastUpTime, path), handler -> { if (handler.failed()) { @@ -48,9 +54,10 @@ public Mono update(LocalDateTime lastUpTime, String path) { })); } - public Mono getIfPresent(String path) { + public Mono getIfPresent(String path, Boolean isReadiness) { + var query = isReadiness ? SELECT_LAST_UP_TIME_FOR_READINESS : SELECT_LAST_UP_TIME_FOR_METRICS; return Mono.create(monoSink -> - dbClient.preparedQuery(SELECT_LAST_UP_TIME) + dbClient.preparedQuery(query) .execute(Tuple.of(path), handler -> { if (handler.failed()) {