From 53ae9e193d6ef8a222964b4f34f5f54480ba7134 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Tue, 28 Jan 2020 22:40:40 -0500 Subject: [PATCH] WIP. traffic analytics app --- .../bubble/app/analytics/TrafficAnalyticsApp.java | 2 +- .../app/analytics/TrafficAnalyticsData.java | 3 +++ .../src/main/java/bubble/dao/app/AppDataDAO.java | 4 ++++ .../bubble/rule/analytics/TrafficAnalytics.java | 4 ++-- .../apps/analytics/bubbleApp_analytics.json | 15 ++++++++++----- utils/cobbzilla-wizard | 2 +- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsApp.java b/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsApp.java index fa0ae007..f9101f94 100644 --- a/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsApp.java +++ b/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsApp.java @@ -53,7 +53,7 @@ public class TrafficAnalyticsApp extends AppDataDriverBase { b = new StringBuilder(); for (int i = 0; i< limit; i++) { if (b.length() > 0) b.append(ILIKE_SEP); - b.append(PCT + FQDN_SEP).append(DATE_FORMAT_YYYY_MM_DD_HH.print(now - HOURS.toMillis(i))).append("-").append(PCT); + b.append(PCT + FQDN_SEP).append(DATE_FORMAT_YYYY_MM_DD_HH.print(now - HOURS.toMillis(i))).append(PCT); } return SearchBoundComparison.like_any.name() + OP_SEP + b.toString(); diff --git a/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsData.java b/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsData.java index a1b3d422..a95756e7 100644 --- a/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsData.java +++ b/bubble-server/src/main/java/bubble/app/analytics/TrafficAnalyticsData.java @@ -1,6 +1,7 @@ package bubble.app.analytics; import bubble.model.app.AppData; +import bubble.model.device.Device; import lombok.Getter; import lombok.Setter; @@ -14,6 +15,8 @@ public class TrafficAnalyticsData extends AppData { final String[] parts = getKey().split(FQDN_SEP); this.fqdn = parts[0]; this.timeInterval = parts[1]; + final Device device = data.getRelated().entity(Device.class); + if (device != null) setDevice(device.getName()); } @Getter @Setter private String fqdn; diff --git a/bubble-server/src/main/java/bubble/dao/app/AppDataDAO.java b/bubble-server/src/main/java/bubble/dao/app/AppDataDAO.java index 9fd9c2b2..ef21ac9d 100644 --- a/bubble-server/src/main/java/bubble/dao/app/AppDataDAO.java +++ b/bubble-server/src/main/java/bubble/dao/app/AppDataDAO.java @@ -36,6 +36,10 @@ public class AppDataDAO extends AppTemplateEntityDAO { return filterExpired(findByUniqueFields("app", app, "site", site, "key", key)); } + public AppData findByAppAndSiteAndKeyAndDevice(String app, String site, String key, String device) { + return filterExpired(findByUniqueFields("app", app, "site", site, "key", key, "device", device)); + } + public List findByAccountAndAppAndAndKey(String account, String app, String key) { return filterExpired(findByFields("account", account, "app", app, "key", key)); } diff --git a/bubble-server/src/main/java/bubble/rule/analytics/TrafficAnalytics.java b/bubble-server/src/main/java/bubble/rule/analytics/TrafficAnalytics.java index c969b2cf..5eac51a2 100644 --- a/bubble-server/src/main/java/bubble/rule/analytics/TrafficAnalytics.java +++ b/bubble-server/src/main/java/bubble/rule/analytics/TrafficAnalytics.java @@ -40,7 +40,7 @@ public class TrafficAnalytics extends AbstractAppRuleDriver { // if the underlying db driver gets into an upset state because of the concurrent updates. We will cross // that bridge when we get to it. private synchronized void incr(Account account, Device device, String app, String site, String key) { - final AppData found = appDataDAO.findByAppAndSiteAndKey(app, site, key); + final AppData found = appDataDAO.findByAppAndSiteAndKeyAndDevice(app, site, key, device == null ? null : device.getUuid()); if (found == null) { appDataDAO.create(new AppData() .setApp(app) @@ -48,7 +48,7 @@ public class TrafficAnalytics extends AbstractAppRuleDriver { .setMatcher(matcher.getUuid()) .setKey(key) .setAccount(account.getUuid()) - .setDevice(device.getUuid()) + .setDevice(device == null ? null : device.getUuid()) .setExpiration(now() + ANALYTICS_EXPIRATION) .setData("1")); } else { diff --git a/bubble-server/src/main/resources/models/apps/analytics/bubbleApp_analytics.json b/bubble-server/src/main/resources/models/apps/analytics/bubbleApp_analytics.json index a1967fb7..9b7843b6 100644 --- a/bubble-server/src/main/resources/models/apps/analytics/bubbleApp_analytics.json +++ b/bubble-server/src/main/resources/models/apps/analytics/bubbleApp_analytics.json @@ -8,12 +8,15 @@ "driverClass": "bubble.app.analytics.TrafficAnalyticsApp", "presentation": "app", "fields": [ - {"name": "ctime"}, - {"name": "URL"}, + {"name": "timeInterval"}, + {"name": "fqdn"}, {"name": "device"}, - {"name": "count"} + {"name": "data"} + ], + "params": [ + {"name": "site", "required": false}, + {"name": "device", "required": false} ], - "params": [{"name": "site", "required": false}], "views": [ {"name": "last_24_hours"}, {"name": "last_7_days"}, @@ -38,10 +41,12 @@ "messages": [ {"name": "name", "value": "Traffic Analytics"}, {"name": "description", "value": "Traffic analytics for your Bubble. Manage block lists."}, - {"name": "field.key", "value": "URL"}, + {"name": "field.timeInterval", "value": "When"}, + {"name": "field.fqdn", "value": "URL"}, {"name": "field.device", "value": "Device"}, {"name": "field.data", "value": "Count"}, {"name": "param.site", "value": "Site"}, + {"name": "param.device", "value": "Device"}, {"name": "view.last_24_hours", "value": "Last 24 Hours"}, {"name": "view.last_7_days", "value": "Last 7 Days"}, {"name": "view.last_30_days", "value": "Last 30 Days"} diff --git a/utils/cobbzilla-wizard b/utils/cobbzilla-wizard index f28baed0..516376d0 160000 --- a/utils/cobbzilla-wizard +++ b/utils/cobbzilla-wizard @@ -1 +1 @@ -Subproject commit f28baed0eff9e4ddad9bdbf4560f517bd2ad6d83 +Subproject commit 516376d0591bc89cdb02061604f6161223fc583b