Skip to content

Commit

Permalink
Make start of statistics configurable as date. Make sure to always lo…
Browse files Browse the repository at this point in the history
…ad latest values for active apps.
  • Loading branch information
martinalig committed Sep 24, 2020
1 parent 68be225 commit ec6eb0d
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.security.cert.CertificateFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Duration;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -72,10 +73,10 @@ public abstract class WSBaseConfig implements WebMvcConfigurer {
@Value("${ws.statistics.splunk.positivetestcount.query:}")
String positiveTestCountQuery;

@Value("${ws.statistics.splunk.startdaysback: 60}")
Integer queryStartDaysBack;
@Value("#{T(java.time.LocalDate).parse('${ws.statistics.splunk.startdate:2020-06-01}')}")
LocalDate queryStartDate;

@Value("${ws.statistics.splunk.enddaysback: 3}")
@Value("${ws.statistics.splunk.enddaysback:0}")
Integer queryEndDaysBack;

@Value("${ws.statistics.cachecontrol:PT1H}")
Expand All @@ -95,7 +96,7 @@ public abstract class WSBaseConfig implements WebMvcConfigurer {
public SplunkStatisticClient splunkStatisticsClient() {
logger.info("Creating Splunk statistics client");
return new SplunkStatisticClient(splunkUrl, getSplunkUsername(), getSplunkpassword(), activeAppsQuery,
usedAuthCodeCountQuery, positiveTestCountQuery, queryStartDaysBack, queryEndDaysBack);
usedAuthCodeCountQuery, positiveTestCountQuery, queryStartDate, queryEndDaysBack);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
Expand Down Expand Up @@ -45,7 +47,7 @@ public class SplunkStatisticClient implements StatisticClient {
private final String activeAppsQuery;
private final String usedAuthCodeCountQuery;
private final String positiveTestCountQuery;
private final Integer queryStartDaysBack;
private final LocalDate queryStartDate;
private final Integer queryEndDaysBack;

private final RestTemplate rt;
Expand All @@ -56,14 +58,15 @@ public class SplunkStatisticClient implements StatisticClient {
private static final Logger logger = LoggerFactory.getLogger(SplunkStatisticClient.class);

public SplunkStatisticClient(String splunkUrl, String splunkUsername, String splunkpassword, String activeAppsQuery,
String usedAuthCodeCountQuery, String positiveTestCountQuery, Integer queryStartDaysBack, Integer queryEndDaysBack) {
String usedAuthCodeCountQuery, String positiveTestCountQuery, LocalDate queryStartDate,
Integer queryEndDaysBack) {
this.url = splunkUrl;
this.username = splunkUsername;
this.password = splunkpassword;
this.activeAppsQuery = activeAppsQuery;
this.usedAuthCodeCountQuery = usedAuthCodeCountQuery;
this.positiveTestCountQuery = positiveTestCountQuery;
this.queryStartDaysBack = queryStartDaysBack;
this.queryStartDate = queryStartDate;
this.queryEndDaysBack = queryEndDaysBack;

// Setup rest template for making http requests to Splunk. This configures a
Expand Down Expand Up @@ -111,7 +114,7 @@ public Statistics getStatistics() {
}

private void fillDays(LocalDate today, Statistics statistics) {
LocalDate dayDate = LocalDate.now().minusDays(queryStartDaysBack);
LocalDate dayDate = queryStartDate;
LocalDate endDate = today.minusDays(queryEndDaysBack);
logger.info("Setup statistics result history. Start: " + dayDate + " End: " + endDate);
while (dayDate.isBefore(endDate)) {
Expand All @@ -125,7 +128,8 @@ private void fillDays(LocalDate today, Statistics statistics) {
private void loadActiveApps(Statistics statistics) throws Exception {
logger.info("Loading active apps");
RequestEntity<MultiValueMap<String, String>> request = RequestEntity.post(new URI(url))
.accept(MediaType.APPLICATION_JSON).headers(createHeaders()).body(createRequestParams(activeAppsQuery));
.accept(MediaType.APPLICATION_JSON).headers(createHeaders())
.body(createRequestParamsForActiveApps(activeAppsQuery));
logger.debug("Request entity: " + request.toString());
ResponseEntity<String> response = rt.exchange(request, String.class);
logger.info("Result: Status: " + response.getStatusCode() + " Body: " + response.getBody());
Expand Down Expand Up @@ -192,12 +196,30 @@ private void loadPositiveTestCount(Statistics statistics) throws Exception {
private MultiValueMap<String, String> createRequestParams(String query) {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("search", query);
params.add("earliest_time", "-" + queryStartDaysBack + "d@d");
long daysBack = ChronoUnit.DAYS.between(queryStartDate, LocalDate.now());
params.add("earliest_time", "-" + daysBack + "d@d");
params.add("latest_time", "-" + queryEndDaysBack + "d@d");
params.add("output_mode", "json");
return params;
}

/**
* For the active apps, we always get the last 10 days, as we just need the most
* current value and no history.
*
* @param query
* @return
*/
private MultiValueMap<String, String> createRequestParamsForActiveApps(String query) {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("search", query);
int daysBack = 10;
params.add("earliest_time", "-" + daysBack + "d@d");
params.add("latest_time", "now");
params.add("output_mode", "json");
return params;
}

private HttpHeaders createHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
class TestSplunkResponse {

@Test
//@Ignore("for local testing")
@Ignore("for local testing")
void testResponseParsing() throws IOException {
String jsonString = Files.readString(Paths.get("/home/alig/work/local/swisscovid/active_apps.json"));
String jsonString = Files.readString(Paths.get(""));
List<SplunkResult> resultList = extractResultFromSplunkApiString(jsonString);
}

Expand Down

0 comments on commit ec6eb0d

Please sign in to comment.