diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2020-07-13 23:28:11 -0700 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2020-07-13 23:28:11 -0700 |
commit | 692a52be1c5b2c1f08d04f5eed1b73b31a9539e0 (patch) | |
tree | 128f48cb666bca89630847cfd446df9296698788 | |
parent | 47c35e66193d1dda4db5c326c9d39709aee3e2a6 (diff) | |
download | traccar-server-692a52be1c5b2c1f08d04f5eed1b73b31a9539e0.tar.gz traccar-server-692a52be1c5b2c1f08d04f5eed1b73b31a9539e0.tar.bz2 traccar-server-692a52be1c5b2c1f08d04f5eed1b73b31a9539e0.zip |
Collect protocol statistics
-rw-r--r-- | schema/changelog-4.10.xml | 17 | ||||
-rw-r--r-- | schema/changelog-master.xml | 1 | ||||
-rw-r--r-- | src/main/java/org/traccar/MainEventHandler.java | 3 | ||||
-rw-r--r-- | src/main/java/org/traccar/MainModule.java | 5 | ||||
-rw-r--r-- | src/main/java/org/traccar/database/StatisticsManager.java | 79 | ||||
-rw-r--r-- | src/main/java/org/traccar/model/Statistics.java | 11 |
6 files changed, 85 insertions, 31 deletions
diff --git a/schema/changelog-4.10.xml b/schema/changelog-4.10.xml new file mode 100644 index 000000000..d7b8b5c59 --- /dev/null +++ b/schema/changelog-4.10.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd" + logicalFilePath="changelog-4.10"> + + <changeSet author="author" id="changelog-4.10"> + + <addColumn tableName="tc_statistics"> + <column name="protocols" type="VARCHAR(4096)" /> + </addColumn> + + </changeSet> + +</databaseChangeLog> diff --git a/schema/changelog-master.xml b/schema/changelog-master.xml index 5626a594e..5e89e746b 100644 --- a/schema/changelog-master.xml +++ b/schema/changelog-master.xml @@ -25,5 +25,6 @@ <include file="changelog-4.1.xml" relativeToChangelogFile="true" /> <include file="changelog-4.7.xml" relativeToChangelogFile="true" /> <include file="changelog-4.9.xml" relativeToChangelogFile="true" /> + <include file="changelog-4.10.xml" relativeToChangelogFile="true" /> </databaseChangeLog> 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<Long> users = new HashSet<>(); - private Set<Long> devices = new HashSet<>(); + private final Set<Long> users = new HashSet<>(); + private final Map<Long, String> 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<String, Integer> 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<String, Integer> protocols; + + public Map<String, Integer> getProtocols() { + return protocols; + } + + public void setProtocols(Map<String, Integer> protocols) { + this.protocols = protocols; + } + } |