package org.jvalue.ods.pegelalarm; import com.codahale.metrics.health.HealthCheck; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Sets; import org.jvalue.ods.api.sources.DataSource; import org.jvalue.ods.data.DataSourceManager; import org.jvalue.ods.db.DataRepository; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Set; import javax.inject.Inject; /** * Asserts that for a set of 5 measuring stations that the average update timestamp is not older than 24 hours. */ public class DataHealthCheck extends HealthCheck implements Constants { private static final Set<String> stationIds = Sets.newHashSet("10046105", "10062000", "24300304", "26100100", "26400550"); private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); private final DataSourceManager dataSourceManager; @Inject DataHealthCheck(DataSourceManager dataSourceManager) { this.dataSourceManager = dataSourceManager; } @Override protected Result check() throws Exception { final DataSource source = dataSourceManager.findBySourceId(DATA_SOURCE_ID); final DataRepository dataRepository = dataSourceManager.getDataRepository(source); long averageTimestamp = 0; for (final String stationId : stationIds) { final JsonNode data = dataRepository.findByDomainId(stationId); if (data == null) return Result.unhealthy("on station with id " + stationId); averageTimestamp += dateFormat.parse(data.get("currentMeasurement").get("timestamp").asText()).getTime(); } averageTimestamp /= stationIds.size(); long yesterday = System.currentTimeMillis() - 86400000; // minus 1 day in ms if (averageTimestamp <= yesterday) return Result.unhealthy("average timestamp is older than 24 hours"); return Result.healthy(); } }