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 --- src/main/java/org/traccar/MainEventHandler.java | 3 +- src/main/java/org/traccar/MainModule.java | 5 +- .../org/traccar/database/StatisticsManager.java | 79 ++++++++++++++-------- src/main/java/org/traccar/model/Statistics.java | 11 +++ 4 files changed, 67 insertions(+), 31 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/traccar/MainEventHandler.java b/src/main/java/org/traccar/MainEventHandler.java index 2309b1e70..285f6f57c 100644 --- a/src/main/java/org/traccar/MainEventHandler.java +++ b/src/main/java/org/traccar/MainEventHandler.java @@ -109,7 +109,8 @@ public class MainEventHandler extends ChannelInboundHandlerAdapter { } LOGGER.info(builder.toString()); - Main.getInjector().getInstance(StatisticsManager.class).registerMessageStored(position.getDeviceId()); + Main.getInjector().getInstance(StatisticsManager.class) + .registerMessageStored(position.getDeviceId(), position.getProtocol()); } } diff --git a/src/main/java/org/traccar/MainModule.java b/src/main/java/org/traccar/MainModule.java index 5e5ab2327..de6ec5b87 100644 --- a/src/main/java/org/traccar/MainModule.java +++ b/src/main/java/org/traccar/MainModule.java @@ -136,8 +136,9 @@ public class MainModule extends AbstractModule { @Singleton @Provides - public static StatisticsManager provideStatisticsManager(Config config, DataManager dataManager, Client client) { - return new StatisticsManager(config, dataManager, client); + public static StatisticsManager provideStatisticsManager( + Config config, DataManager dataManager, Client client, ObjectMapper objectMapper) { + return new StatisticsManager(config, dataManager, client, objectMapper); } @Singleton 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); } } diff --git a/src/main/java/org/traccar/model/Statistics.java b/src/main/java/org/traccar/model/Statistics.java index cb72c91dd..a9a117aef 100644 --- a/src/main/java/org/traccar/model/Statistics.java +++ b/src/main/java/org/traccar/model/Statistics.java @@ -16,6 +16,7 @@ package org.traccar.model; import java.util.Date; +import java.util.Map; public class Statistics extends ExtendedModel { @@ -119,4 +120,14 @@ public class Statistics extends ExtendedModel { this.geolocationRequests = geolocationRequests; } + private Map protocols; + + public Map getProtocols() { + return protocols; + } + + public void setProtocols(Map protocols) { + this.protocols = protocols; + } + } -- cgit v1.2.3