diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2016-09-27 10:15:01 +1300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-27 10:15:01 +1300 |
commit | 18499577b16a198762609075ff1846f354d3d712 (patch) | |
tree | 0d33302e1193724405099e1108ba04cad552a95e | |
parent | aaec58aec04256845dc37afd713b488071b1406b (diff) | |
parent | ccd4a65a4954bcd7d2c38b806440bb766c51b0e2 (diff) | |
download | trackermap-server-18499577b16a198762609075ff1846f354d3d712.tar.gz trackermap-server-18499577b16a198762609075ff1846f354d3d712.tar.bz2 trackermap-server-18499577b16a198762609075ff1846f354d3d712.zip |
Merge pull request #2367 from tananaev/implement_statistics
Implement server statistics collection
-rw-r--r-- | debug.xml | 9 | ||||
-rw-r--r-- | schema/changelog-3.8.xml | 27 | ||||
-rw-r--r-- | src/org/traccar/BaseProtocolDecoder.java | 3 | ||||
-rw-r--r-- | src/org/traccar/Context.java | 9 | ||||
-rw-r--r-- | src/org/traccar/MainEventHandler.java | 1 | ||||
-rw-r--r-- | src/org/traccar/api/SecurityRequestFilter.java | 2 | ||||
-rw-r--r-- | src/org/traccar/database/DataManager.java | 13 | ||||
-rw-r--r-- | src/org/traccar/database/StatisticsManager.java | 88 | ||||
-rw-r--r-- | src/org/traccar/model/Statistics.java | 90 |
9 files changed, 242 insertions, 0 deletions
@@ -353,6 +353,15 @@ DELETE FROM attribute_aliases WHERE id = :id; </entry> + <entry key='database.selectStatistics'> + SELECT * FROM statistics; + </entry> + + <entry key='database.insertStatistics'> + INSERT INTO statistics (captureTime, activeUsers, activeDevices, requests, messagesReceived, messagesStored, attributes) + VALUES (:captureTime, :activeUsers, :activeDevices, :requests, :messagesReceived, :messagesStored, :attributes); + </entry> + <!-- PROTOCOL CONFIG --> <entry key='gps103.port'>5001</entry> diff --git a/schema/changelog-3.8.xml b/schema/changelog-3.8.xml index 304ac21d4..deab6603c 100644 --- a/schema/changelog-3.8.xml +++ b/schema/changelog-3.8.xml @@ -39,5 +39,32 @@ <where>speedunit = 'kmh'</where> </update> + <createTable tableName="statistics"> + <column name="id" type="INT" autoIncrement="true"> + <constraints primaryKey="true" /> + </column> + <column name="capturetime" type="TIMESTAMP"> + <constraints nullable="false" /> + </column> + <column name="activeusers" type="INT" defaultValueNumeric="0"> + <constraints nullable="false" /> + </column> + <column name="activedevices" type="INT" defaultValueNumeric="0"> + <constraints nullable="false" /> + </column> + <column name="requests" type="INT" defaultValueNumeric="0"> + <constraints nullable="false" /> + </column> + <column name="messagesreceived" type="INT" defaultValueNumeric="0"> + <constraints nullable="false" /> + </column> + <column name="messagesstored" type="INT" defaultValueNumeric="0"> + <constraints nullable="false" /> + </column> + <column name="attributes" type="VARCHAR(4096)"> + <constraints nullable="false" /> + </column> + </createTable> + </changeSet> </databaseChangeLog> diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index 46832a4ca..72b9a7a74 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -129,6 +129,9 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { @Override protected void onMessageEvent(Channel channel, SocketAddress remoteAddress, Object msg) { + if (Context.getStatisticsManager() != null) { + Context.getStatisticsManager().registerMessageReceived(); + } DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); if (deviceSession != null) { Context.getConnectionManager().updateDevice(deviceSession.getDeviceId(), Device.STATUS_ONLINE, new Date()); diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index 5a3dca878..827761cc5 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -25,6 +25,7 @@ import org.traccar.database.IdentityManager; import org.traccar.database.NotificationManager; import org.traccar.database.PermissionsManager; import org.traccar.database.GeofenceManager; +import org.traccar.database.StatisticsManager; import org.traccar.geocode.BingMapsReverseGeocoder; import org.traccar.geocode.FactualReverseGeocoder; import org.traccar.geocode.GeocodeFarmReverseGeocoder; @@ -142,6 +143,12 @@ public final class Context { return aliasesManager; } + private static StatisticsManager statisticsManager; + + public static StatisticsManager getStatisticsManager() { + return statisticsManager; + } + public static void init(String[] arguments) throws Exception { config = new Config(); @@ -245,6 +252,8 @@ public final class Context { aliasesManager = new AliasesManager(dataManager); + statisticsManager = new StatisticsManager(); + } public static void init(IdentityManager testIdentityManager) { diff --git a/src/org/traccar/MainEventHandler.java b/src/org/traccar/MainEventHandler.java index 3f7e68b2a..9f172c584 100644 --- a/src/org/traccar/MainEventHandler.java +++ b/src/org/traccar/MainEventHandler.java @@ -62,6 +62,7 @@ public class MainEventHandler extends IdleStateAwareChannelHandler { } Log.info(s.toString()); + Context.getStatisticsManager().registerMessageStored(position.getDeviceId()); } } diff --git a/src/org/traccar/api/SecurityRequestFilter.java b/src/org/traccar/api/SecurityRequestFilter.java index f0dd363db..9e0f03de7 100644 --- a/src/org/traccar/api/SecurityRequestFilter.java +++ b/src/org/traccar/api/SecurityRequestFilter.java @@ -69,6 +69,7 @@ public class SecurityRequestFilter implements ContainerRequestFilter { String[] auth = decodeBasicAuth(authHeader); User user = Context.getDataManager().login(auth[0], auth[1]); if (user != null) { + Context.getStatisticsManager().registerRequest(user.getId()); securityContext = new UserSecurityContext(new UserPrincipal(user.getId())); } } catch (SQLException e) { @@ -79,6 +80,7 @@ public class SecurityRequestFilter implements ContainerRequestFilter { Long userId = (Long) request.getSession().getAttribute(SessionResource.USER_ID_KEY); if (userId != null) { + Context.getStatisticsManager().registerRequest(userId); securityContext = new UserSecurityContext(new UserPrincipal(userId)); } diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java index 02adb0455..c58fe40a5 100644 --- a/src/org/traccar/database/DataManager.java +++ b/src/org/traccar/database/DataManager.java @@ -48,6 +48,7 @@ import org.traccar.model.GroupPermission; import org.traccar.model.Notification; import org.traccar.model.Position; import org.traccar.model.Server; +import org.traccar.model.Statistics; import org.traccar.model.User; import org.traccar.model.DeviceGeofence; import org.traccar.model.GeofencePermission; @@ -484,4 +485,16 @@ public class DataManager { .setLong("id", attributeAliasId) .executeUpdate(); } + + public Collection<Statistics> getStatistics() throws SQLException { + return QueryBuilder.create(dataSource, getQuery("database.selectStatistics")) + .executeQuery(Statistics.class); + } + + public void addStatistics(Statistics statistics) throws SQLException { + statistics.setId(QueryBuilder.create(dataSource, getQuery("database.insertStatistics"), true) + .setObject(statistics) + .executeUpdate()); + } + } diff --git a/src/org/traccar/database/StatisticsManager.java b/src/org/traccar/database/StatisticsManager.java new file mode 100644 index 000000000..b9af4d9b7 --- /dev/null +++ b/src/org/traccar/database/StatisticsManager.java @@ -0,0 +1,88 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.database; + +import org.traccar.Context; +import org.traccar.helper.Log; +import org.traccar.model.Statistics; + +import java.sql.SQLException; +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +public class StatisticsManager { + + private static final int SPLIT_MODE = Calendar.DAY_OF_MONTH; + + private int lastUpdate = Calendar.getInstance().get(SPLIT_MODE); + + private Set<Long> users = new HashSet<>(); + private Set<Long> devices = new HashSet<>(); + + private int requests; + private int messagesReceived; + private int messagesStored; + + private void checkSplit() { + int currentUpdate = Calendar.getInstance().get(SPLIT_MODE); + if (lastUpdate != 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); + + try { + Context.getDataManager().addStatistics(statistics); + } catch (SQLException e) { + Log.warning(e); + } + + users.clear(); + devices.clear(); + requests = 0; + messagesReceived = 0; + messagesStored = 0; + lastUpdate = currentUpdate; + } + } + + public synchronized void registerRequest(long userId) { + checkSplit(); + requests += 1; + if (userId != 0) { + users.add(userId); + } + } + + public synchronized void registerMessageReceived() { + checkSplit(); + messagesReceived += 1; + } + + public synchronized void registerMessageStored(long deviceId) { + checkSplit(); + messagesStored += 1; + if (deviceId != 0) { + devices.add(deviceId); + } + } + +} diff --git a/src/org/traccar/model/Statistics.java b/src/org/traccar/model/Statistics.java new file mode 100644 index 000000000..0461ebd7e --- /dev/null +++ b/src/org/traccar/model/Statistics.java @@ -0,0 +1,90 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.model; + +import java.util.Date; + +public class Statistics extends Extensible { + + private Date captureTime; + + public Date getCaptureTime() { + if (captureTime != null) { + return new Date(captureTime.getTime()); + } else { + return null; + } + } + + public void setCaptureTime(Date captureTime) { + if (captureTime != null) { + this.captureTime = new Date(captureTime.getTime()); + } else { + this.captureTime = null; + } + } + + private int activeUsers; + + public int getActiveUsers() { + return activeUsers; + } + + public void setActiveUsers(int activeUsers) { + this.activeUsers = activeUsers; + } + + private int activeDevices; + + public int getActiveDevices() { + return activeDevices; + } + + public void setActiveDevices(int activeDevices) { + this.activeDevices = activeDevices; + } + + private int requests; + + public int getRequests() { + return requests; + } + + public void setRequests(int requests) { + this.requests = requests; + } + + private int messagesReceived; + + public int getMessagesReceived() { + return messagesReceived; + } + + public void setMessagesReceived(int messagesReceived) { + this.messagesReceived = messagesReceived; + } + + private int messagesStored; + + public int getMessagesStored() { + return messagesStored; + } + + public void setMessagesStored(int messagesStored) { + this.messagesStored = messagesStored; + } + +} |