From 53bcb5c788e6b24bf8f6f631445b61a87c5f715f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 25 Sep 2016 14:51:16 +1300 Subject: Implement server statistics collection --- src/org/traccar/database/DataManager.java | 13 ++++ src/org/traccar/database/StatisticsManager.java | 92 +++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/org/traccar/database/StatisticsManager.java (limited to 'src/org/traccar/database') 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 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..b21380332 --- /dev/null +++ b/src/org/traccar/database/StatisticsManager.java @@ -0,0 +1,92 @@ +/* + * 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.MINUTE; + + private int lastUpdate = Calendar.getInstance().get(SPLIT_MODE); + + private Set users = new HashSet<>(); + private Set 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 registerUser(long userId) { + checkSplit(); + users.add(userId); + } + + public synchronized void registerDevice(long deviceId) { + checkSplit(); + devices.add(deviceId); + } + + public synchronized void registerRequest() { + checkSplit(); + requests += 1; + } + + public synchronized void registerMessageReceived() { + checkSplit(); + messagesReceived += 1; + } + + public synchronized void registerMessageStored() { + checkSplit(); + messagesStored += 1; + } + +} -- cgit v1.2.3 From ccd4a65a4954bcd7d2c38b806440bb766c51b0e2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 26 Sep 2016 22:27:15 +1300 Subject: Change statistics calculation logic --- src/org/traccar/DeviceSession.java | 3 --- src/org/traccar/MainEventHandler.java | 2 +- src/org/traccar/api/SecurityRequestFilter.java | 3 ++- src/org/traccar/api/resource/SessionResource.java | 2 -- src/org/traccar/database/StatisticsManager.java | 22 +++++++++------------- 5 files changed, 12 insertions(+), 20 deletions(-) (limited to 'src/org/traccar/database') diff --git a/src/org/traccar/DeviceSession.java b/src/org/traccar/DeviceSession.java index 45bc5dcde..5e2686f23 100644 --- a/src/org/traccar/DeviceSession.java +++ b/src/org/traccar/DeviceSession.java @@ -21,9 +21,6 @@ public class DeviceSession { public DeviceSession(long deviceId) { this.deviceId = deviceId; - if (Context.getStatisticsManager() != null) { - Context.getStatisticsManager().registerDevice(deviceId); - } } public long getDeviceId() { diff --git a/src/org/traccar/MainEventHandler.java b/src/org/traccar/MainEventHandler.java index 24aa50117..9f172c584 100644 --- a/src/org/traccar/MainEventHandler.java +++ b/src/org/traccar/MainEventHandler.java @@ -62,7 +62,7 @@ public class MainEventHandler extends IdleStateAwareChannelHandler { } Log.info(s.toString()); - Context.getStatisticsManager().registerMessageStored(); + Context.getStatisticsManager().registerMessageStored(position.getDeviceId()); } } diff --git a/src/org/traccar/api/SecurityRequestFilter.java b/src/org/traccar/api/SecurityRequestFilter.java index ff4241b97..9e0f03de7 100644 --- a/src/org/traccar/api/SecurityRequestFilter.java +++ b/src/org/traccar/api/SecurityRequestFilter.java @@ -55,7 +55,6 @@ public class SecurityRequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { - Context.getStatisticsManager().registerRequest(); if (requestContext.getMethod().equals("OPTIONS")) { return; @@ -70,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) { @@ -80,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/api/resource/SessionResource.java b/src/org/traccar/api/resource/SessionResource.java index 4ab1960c9..deed70b37 100644 --- a/src/org/traccar/api/resource/SessionResource.java +++ b/src/org/traccar/api/resource/SessionResource.java @@ -73,7 +73,6 @@ public class SessionResource extends BaseResource { } if (userId != null) { - Context.getStatisticsManager().registerUser(userId); return Context.getPermissionsManager().getUser(userId); } else { throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND).build()); @@ -86,7 +85,6 @@ public class SessionResource extends BaseResource { @FormParam("email") String email, @FormParam("password") String password) throws SQLException { User user = Context.getPermissionsManager().login(email, password); if (user != null) { - Context.getStatisticsManager().registerUser(user.getId()); request.getSession().setAttribute(USER_ID_KEY, user.getId()); return user; } else { diff --git a/src/org/traccar/database/StatisticsManager.java b/src/org/traccar/database/StatisticsManager.java index b21380332..b9af4d9b7 100644 --- a/src/org/traccar/database/StatisticsManager.java +++ b/src/org/traccar/database/StatisticsManager.java @@ -27,7 +27,7 @@ import java.util.Set; public class StatisticsManager { - private static final int SPLIT_MODE = Calendar.MINUTE; + private static final int SPLIT_MODE = Calendar.DAY_OF_MONTH; private int lastUpdate = Calendar.getInstance().get(SPLIT_MODE); @@ -64,19 +64,12 @@ public class StatisticsManager { } } - public synchronized void registerUser(long userId) { - checkSplit(); - users.add(userId); - } - - public synchronized void registerDevice(long deviceId) { - checkSplit(); - devices.add(deviceId); - } - - public synchronized void registerRequest() { + public synchronized void registerRequest(long userId) { checkSplit(); requests += 1; + if (userId != 0) { + users.add(userId); + } } public synchronized void registerMessageReceived() { @@ -84,9 +77,12 @@ public class StatisticsManager { messagesReceived += 1; } - public synchronized void registerMessageStored() { + public synchronized void registerMessageStored(long deviceId) { checkSplit(); messagesStored += 1; + if (deviceId != 0) { + devices.add(deviceId); + } } } -- cgit v1.2.3 From 82909a81eb01cfd76f38fec7cccff5a5c87b5232 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 1 Oct 2016 15:50:09 +1300 Subject: Remove unused data manager methods (fix #2386) --- debug.xml | 10 ---------- setup/traccar.xml | 10 ---------- src/org/traccar/database/DataManager.java | 12 ------------ 3 files changed, 32 deletions(-) (limited to 'src/org/traccar/database') diff --git a/debug.xml b/debug.xml index 94e30c6b8..d01a25248 100644 --- a/debug.xml +++ b/debug.xml @@ -119,11 +119,6 @@ WHERE email = :email; - - SELECT * FROM users - WHERE id = :id; - - SELECT * FROM users; @@ -247,11 +242,6 @@ SELECT * FROM events WHERE deviceId = :deviceId AND type LIKE :type AND serverTime BETWEEN :from AND :to ORDER BY serverTime DESC; - - SELECT * FROM geofences - WHERE id = :id; - - SELECT * FROM geofences; diff --git a/setup/traccar.xml b/setup/traccar.xml index ccdc5b745..c13abb3e2 100644 --- a/setup/traccar.xml +++ b/setup/traccar.xml @@ -62,11 +62,6 @@ WHERE email = :email; - - SELECT * FROM users - WHERE id = :id; - - SELECT * FROM users; @@ -190,11 +185,6 @@ SELECT * FROM events WHERE deviceId = :deviceId AND type LIKE :type AND serverTime BETWEEN :from AND :to ORDER BY serverTime DESC; - - SELECT * FROM geofences - WHERE id = :id; - - SELECT * FROM geofences; diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java index c58fe40a5..6718bda83 100644 --- a/src/org/traccar/database/DataManager.java +++ b/src/org/traccar/database/DataManager.java @@ -160,12 +160,6 @@ public class DataManager { .executeQuery(User.class); } - public User getUser(long userId) throws SQLException { - return QueryBuilder.create(dataSource, getQuery("database.selectUser")) - .setLong("id", userId) - .executeQuerySingle(User.class); - } - public void addUser(User user) throws SQLException { user.setId(QueryBuilder.create(dataSource, getQuery("database.insertUser"), true) .setObject(user) @@ -359,12 +353,6 @@ public class DataManager { .executeQuery(Geofence.class); } - public Geofence getGeofence(long geofenceId) throws SQLException { - return QueryBuilder.create(dataSource, getQuery("database.selectGeofences")) - .setLong("id", geofenceId) - .executeQuerySingle(Geofence.class); - } - public void addGeofence(Geofence geofence) throws SQLException { geofence.setId(QueryBuilder.create(dataSource, getQuery("database.insertGeofence"), true) .setObject(geofence) -- cgit v1.2.3 From bae6692356872fcc093ce92ed37cba7d2e2f6d7f Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Mon, 3 Oct 2016 12:16:15 +0500 Subject: Make status events switchable --- debug.xml | 1 + src/org/traccar/database/ConnectionManager.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'src/org/traccar/database') diff --git a/debug.xml b/debug.xml index a529af327..a2d6bc3ba 100644 --- a/debug.xml +++ b/debug.xml @@ -50,6 +50,7 @@ true true true + true