From 692a52be1c5b2c1f08d04f5eed1b73b31a9539e0 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 13 Jul 2020 23:28:11 -0700 Subject: Collect protocol statistics --- .../org/traccar/database/StatisticsManager.java | 79 ++++++++++++++-------- 1 file changed, 51 insertions(+), 28 deletions(-) (limited to 'src/main/java/org/traccar/database') diff --git a/src/main/java/org/traccar/database/StatisticsManager.java b/src/main/java/org/traccar/database/StatisticsManager.java index e59f8e767..21b59540e 100644 --- a/src/main/java/org/traccar/database/StatisticsManager.java +++ b/src/main/java/org/traccar/database/StatisticsManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 - 2019 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2020 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ package org.traccar.database; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.traccar.config.Config; @@ -29,7 +31,9 @@ import javax.ws.rs.core.Form; import java.sql.SQLException; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @@ -37,16 +41,17 @@ public class StatisticsManager { private static final Logger LOGGER = LoggerFactory.getLogger(StatisticsManager.class); - private static final int SPLIT_MODE = Calendar.DAY_OF_MONTH; + private static final int SPLIT_MODE = Calendar.MINUTE; private final Config config; private final DataManager dataManager; private final Client client; + private final ObjectMapper objectMapper; - private AtomicInteger lastUpdate = new AtomicInteger(Calendar.getInstance().get(SPLIT_MODE)); + private final AtomicInteger lastUpdate = new AtomicInteger(Calendar.getInstance().get(SPLIT_MODE)); - private Set users = new HashSet<>(); - private Set devices = new HashSet<>(); + private final Set users = new HashSet<>(); + private final Map deviceProtocols = new HashMap<>(); private int requests; private int messagesReceived; @@ -57,26 +62,47 @@ public class StatisticsManager { private int geolocationRequests; @Inject - public StatisticsManager(Config config, DataManager dataManager, Client client) { + public StatisticsManager(Config config, DataManager dataManager, Client client, ObjectMapper objectMapper) { this.config = config; this.dataManager = dataManager; this.client = client; + this.objectMapper = objectMapper; } private void checkSplit() { int currentUpdate = Calendar.getInstance().get(SPLIT_MODE); if (lastUpdate.getAndSet(currentUpdate) != currentUpdate) { Statistics statistics = new Statistics(); - statistics.setCaptureTime(new Date()); - statistics.setActiveUsers(users.size()); - statistics.setActiveDevices(devices.size()); - statistics.setRequests(requests); - statistics.setMessagesReceived(messagesReceived); - statistics.setMessagesStored(messagesStored); - statistics.setMailSent(mailSent); - statistics.setSmsSent(smsSent); - statistics.setGeocoderRequests(geocoderRequests); - statistics.setGeolocationRequests(geolocationRequests); + + synchronized (this) { + statistics.setCaptureTime(new Date()); + statistics.setActiveUsers(users.size()); + statistics.setActiveDevices(deviceProtocols.size()); + statistics.setRequests(requests); + statistics.setMessagesReceived(messagesReceived); + statistics.setMessagesStored(messagesStored); + statistics.setMailSent(mailSent); + statistics.setSmsSent(smsSent); + statistics.setGeocoderRequests(geocoderRequests); + statistics.setGeolocationRequests(geolocationRequests); + if (!deviceProtocols.isEmpty()) { + Map protocols = new HashMap<>(); + for (String protocol : deviceProtocols.values()) { + protocols.compute(protocol, (key, count) -> count != null ? count += 1 : 1); + } + statistics.setProtocols(protocols); + } + + users.clear(); + deviceProtocols.clear(); + requests = 0; + messagesReceived = 0; + messagesStored = 0; + mailSent = 0; + smsSent = 0; + geocoderRequests = 0; + geolocationRequests = 0; + } try { dataManager.addObject(statistics); @@ -100,19 +126,16 @@ public class StatisticsManager { form.param("smsSent", String.valueOf(statistics.getSmsSent())); form.param("geocoderRequests", String.valueOf(statistics.getGeocoderRequests())); form.param("geolocationRequests", String.valueOf(statistics.getGeolocationRequests())); + if (statistics.getProtocols() != null) { + try { + form.param("protocols", objectMapper.writeValueAsString(statistics.getProtocols())); + } catch (JsonProcessingException e) { + LOGGER.warn("Failed to serialize protocols", e); + } + } client.target(url).request().async().post(Entity.form(form)); } - - users.clear(); - devices.clear(); - requests = 0; - messagesReceived = 0; - messagesStored = 0; - mailSent = 0; - smsSent = 0; - geocoderRequests = 0; - geolocationRequests = 0; } } @@ -129,11 +152,11 @@ public class StatisticsManager { messagesReceived += 1; } - public synchronized void registerMessageStored(long deviceId) { + public synchronized void registerMessageStored(long deviceId, String protocol) { checkSplit(); messagesStored += 1; if (deviceId != 0) { - devices.add(deviceId); + deviceProtocols.put(deviceId, protocol); } } -- cgit v1.2.3