├── .cfignore ├── .gitignore ├── manifest.yml ├── daily-reports ├── package.json ├── server.js └── usa.json ├── realtime-reports ├── package.json ├── server.js └── usa.json └── README.md /.cfignore: -------------------------------------------------------------------------------- 1 | */node_modules/ 2 | *.env 3 | server-update.js 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | */node_modules/ 2 | *.env 3 | secret_key.json 4 | -------------------------------------------------------------------------------- /manifest.yml: -------------------------------------------------------------------------------- 1 | --- 2 | timeout: 180 3 | memory: 256M 4 | disk_quota: 256M 5 | no-route: true 6 | services: 7 | - analytics-reporter-creds 8 | applications: 9 | - name: realtime-reporter 10 | path: realtime-reports 11 | env: 12 | ANALYTICS_CREDS: analytics-reporter-creds 13 | - name: daily-reporter 14 | path: daily-reports 15 | env: 16 | ANALYTICS_CREDS: analytics-reporter-creds 17 | -------------------------------------------------------------------------------- /daily-reports/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "analytics-reporter-example", 3 | "version": "1.0.0", 4 | "description": "Analytics report example", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "Gabriel Ramirez", 11 | "license": "ISC", 12 | "dependencies": { 13 | "analytics-reporter": "git+https://github.com/geramirez/analytics-reporter.git", 14 | "async": "^1.5.2", 15 | "cfenv": "1.0.0", 16 | "cron": "^1.1.0" 17 | }, 18 | "engines": { 19 | "node": "5.5.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /realtime-reports/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "analytics-reporter-example", 3 | "version": "1.0.0", 4 | "description": "Analytics report example", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "Gabriel Ramirez", 11 | "license": "ISC", 12 | "dependencies": { 13 | "analytics-reporter": "git+https://github.com/geramirez/analytics-reporter.git", 14 | "async": "^1.5.2", 15 | "cfenv": "1.0.0", 16 | "cron": "^1.1.0" 17 | }, 18 | "engines": { 19 | "node": "5.5.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | ### Set up a user defined service with credentials 3 | After entering this command you'll be prompted for each credentials individually. 4 | ```bash 5 | cf cups analytics-reporter-creds -p "ANALYTICS_KEY_0, ANALYTICS_KEY_1, ANALYTICS_KEY_2, ANALYTICS_KEY_3, ANALYTICS_REPORT_EMAIL, ANALYTICS_REPORT_IDS, ANALYTICS_REPORTS_PATH, AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_BUCKET, AWS_BUCKET_PATH, AWS_CACHE_TIME" 6 | ``` 7 | 8 | 9 | The keys must be split up using ANALYTICS_KEY_0, ANALYTICS_KEY_1, ... 10 | 11 | ### Deploy 12 | ```bash 13 | cf push 14 | ``` 15 | 16 | cf unbind-service analytics-reporter analytics-reporter-creds 17 | cf ds analytics-reporter-creds 18 | -------------------------------------------------------------------------------- /daily-reports/server.js: -------------------------------------------------------------------------------- 1 | var Analytics = require("analytics-reporter"), 2 | CronJob = require('cron').CronJob, 3 | fs = require('fs'), 4 | async = require("async"), 5 | spawn = require('child_process').spawn, 6 | creds = require("cfenv").getAppEnv().getService(process.env.ANALYTICS_CREDS).credentials, 7 | key = creds.ANALYTICS_KEY_0 + creds.ANALYTICS_KEY_1 + creds.ANALYTICS_KEY_2 + creds.ANALYTICS_KEY_3, 8 | allReports = []; 9 | 10 | var reportIDs = [{ 11 | gaid: 'ga:68909496', 12 | path: 'data/sba' 13 | }, { 14 | gaid: 'ga:67460690', 15 | path: 'data/dhs' 16 | }] 17 | 18 | for (idx in reportIDs) { 19 | (function(reportID) { 20 | var aws_settings = { 21 | bucket: creds.AWS_BUCKET, 22 | path: reportID.path, 23 | cache: 0, 24 | }; 25 | var analytics = new Analytics( 26 | key.replace(/\\n/g, '\n'), 27 | creds.ANALYTICS_REPORT_EMAIL, 28 | reportID.gaid, 29 | creds.ANALYTICS_REPORTS_PATH, 30 | aws_settings, 31 | true 32 | ); 33 | allReports.push(function(finished) { 34 | analytics.run({ 35 | 'csv': true, 36 | 'json': true, 37 | 'frequency': 'realtime', 38 | 'slim': true, 39 | 'publish': true 40 | }, function() { 41 | console.log('Reports Finished'); 42 | finished(); 43 | }); 44 | }); 45 | })(reportIDs[idx]); 46 | }; 47 | 48 | var runAllReports = function() { 49 | async.eachSeries(allReports, 50 | function(item, callback) { 51 | console.log("Daily Reports Starting"); 52 | item(callback); 53 | }, 54 | function(err) { 55 | if(err) { 56 | console.log(err) 57 | } 58 | } 59 | ); 60 | }; 61 | 62 | var jobs = new CronJob({ 63 | cronTime: '5 10 * * *', 64 | onTick: runAllReports, 65 | start: false, 66 | timeZone: 'America/Los_Angeles' 67 | }); 68 | 69 | 70 | jobs.start(); 71 | -------------------------------------------------------------------------------- /realtime-reports/server.js: -------------------------------------------------------------------------------- 1 | var Analytics = require("analytics-reporter"), 2 | CronJob = require('cron').CronJob, 3 | fs = require('fs'), 4 | async = require("async"), 5 | spawn = require('child_process').spawn, 6 | creds = require("cfenv").getAppEnv().getService(process.env.ANALYTICS_CREDS).credentials, 7 | key = creds.ANALYTICS_KEY_0 + creds.ANALYTICS_KEY_1 + creds.ANALYTICS_KEY_2 + creds.ANALYTICS_KEY_3, 8 | allReports = []; 9 | 10 | var reportIDs = [{ 11 | gaid: 'ga:68909496', 12 | path: 'data/sba' 13 | }, { 14 | gaid: 'ga:67460690', 15 | path: 'data/dhs' 16 | }] 17 | 18 | for (idx in reportIDs) { 19 | (function(reportID) { 20 | var aws_settings = { 21 | bucket: creds.AWS_BUCKET, 22 | path: reportID.path, 23 | cache: 0, 24 | }; 25 | var analytics = new Analytics( 26 | key.replace(/\\n/g, '\n'), 27 | creds.ANALYTICS_REPORT_EMAIL, 28 | reportID.gaid, 29 | creds.ANALYTICS_REPORTS_PATH, 30 | aws_settings, 31 | true 32 | ); 33 | allReports.push(function(finished) { 34 | analytics.run({ 35 | 'csv': true, 36 | 'json': true, 37 | 'frequency': 'realtime', 38 | 'slim': true, 39 | 'publish': true 40 | }, function() { 41 | console.log('Reports Finished'); 42 | finished(); 43 | }); 44 | }); 45 | })(reportIDs[idx]); 46 | }; 47 | 48 | var runAllReports = function() { 49 | async.eachSeries(allReports, 50 | function(item, callback) { 51 | console.log("Realtime Reports Starting"); 52 | item(callback); 53 | }, 54 | function(err) { 55 | if(err) { 56 | console.log(err) 57 | } 58 | } 59 | ); 60 | }; 61 | 62 | 63 | var jobs = new CronJob({ 64 | cronTime: '*/2 * * * *', 65 | onTick: runAllReports, 66 | start: false, 67 | timeZone: 'America/Los_Angeles' 68 | }); 69 | 70 | 71 | jobs.start(); 72 | -------------------------------------------------------------------------------- /daily-reports/usa.json: -------------------------------------------------------------------------------- 1 | { 2 | "reports": [ 3 | { 4 | "name": "realtime", 5 | "frequency": "realtime", 6 | "realtime": true, 7 | "query": { 8 | "metrics": ["rt:activeUsers"] 9 | }, 10 | "meta": { 11 | "name": "Active Users Right Now", 12 | "description": "Number of users currently visiting all sites." 13 | } 14 | }, 15 | { 16 | "name": "today", 17 | "frequency": "realtime", 18 | "query": { 19 | "dimensions": ["ga:date", "ga:hour"], 20 | "metrics": ["ga:sessions"], 21 | "start-date": "today", 22 | "end-date": "today" 23 | }, 24 | "meta": { 25 | "name": "Today", 26 | "description": "Today's visits for all sites." 27 | } 28 | }, 29 | { 30 | "name": "devices", 31 | "frequency": "daily", 32 | "slim": true, 33 | "query": { 34 | "dimensions": ["ga:date" ,"ga:deviceCategory"], 35 | "metrics": ["ga:sessions"], 36 | "start-date": "90daysAgo", 37 | "end-date": "yesterday", 38 | "sort": "ga:date" 39 | }, 40 | "meta": { 41 | "name": "Devices", 42 | "description": "90 days of desktop/mobile/tablet visits for all sites." 43 | } 44 | }, 45 | { 46 | "name": "os", 47 | "frequency": "daily", 48 | "slim": true, 49 | "query": { 50 | "dimensions": ["ga:date" ,"ga:operatingSystem"], 51 | "metrics": ["ga:sessions"], 52 | "start-date": "90daysAgo", 53 | "end-date": "yesterday", 54 | "filters": ["ga:sessions>1000"], 55 | "sort": "ga:date" 56 | }, 57 | "meta": { 58 | "name": "Operating Systems", 59 | "description": "90 days of visits, broken down by operating system and date, for all sites." 60 | } 61 | }, 62 | { 63 | "name": "windows", 64 | "frequency": "daily", 65 | "slim": true, 66 | "query": { 67 | "dimensions": ["ga:date" ,"ga:operatingSystemVersion"], 68 | "metrics": ["ga:sessions"], 69 | "start-date": "90daysAgo", 70 | "end-date": "yesterday", 71 | "filters": [ 72 | "ga:operatingSystem==Windows", 73 | "ga:sessions>1000" 74 | ], 75 | "sort": "ga:date" 76 | }, 77 | "meta": { 78 | "name": "Windows", 79 | "description": "90 days of visits from Windows users, broken down by operating system version and date, for all sites." 80 | } 81 | }, 82 | { 83 | "name": "browsers", 84 | "frequency": "daily", 85 | "slim": true, 86 | "query": { 87 | "dimensions": ["ga:date" ,"ga:browser"], 88 | "metrics": ["ga:sessions"], 89 | "start-date": "90daysAgo", 90 | "end-date": "yesterday", 91 | "sort": "ga:date,-ga:sessions", 92 | "filters": ["ga:sessions>1000"] 93 | }, 94 | "meta": { 95 | "name": "Browsers", 96 | "description": "90 days of visits broken down by browser for all sites." 97 | } 98 | }, 99 | { 100 | "name": "ie", 101 | "frequency": "daily", 102 | "slim": true, 103 | "query": { 104 | "dimensions": ["ga:date","ga:browserVersion"], 105 | "metrics": ["ga:sessions"], 106 | "start-date": "90daysAgo", 107 | "end-date": "yesterday", 108 | "sort": "ga:date,-ga:sessions", 109 | "filters": [ 110 | "ga:browser==Internet Explorer", 111 | "ga:sessions>1000" 112 | ] 113 | }, 114 | "meta": { 115 | "name": "Internet Explorer", 116 | "description": "90 days of visits from Internet Explorer users broken down by version for all sites." 117 | } 118 | }, 119 | { 120 | "name": "top-pages-realtime", 121 | "frequency": "realtime", 122 | "realtime": true, 123 | "query": { 124 | "dimensions": ["rt:pagePath", "rt:pageTitle"], 125 | "metrics": ["rt:activeUsers"], 126 | "sort": "-rt:activeUsers", 127 | "max-results": "20" 128 | }, 129 | "meta": { 130 | "name": "Top Pages (Live)", 131 | "description": "The top 20 pages, measured by active onsite users, for all sites." 132 | } 133 | }, 134 | { 135 | "name": "top-domains-7-days", 136 | "frequency": "daily", 137 | "query": { 138 | "dimensions": ["ga:hostname"], 139 | "metrics": ["ga:sessions"], 140 | "start-date": "7daysAgo", 141 | "end-date": "yesterday", 142 | "sort": "-ga:sessions", 143 | "max-results": "20" 144 | }, 145 | "meta": { 146 | "name": "Top Domains (7 Days)", 147 | "description": "Last week's top 20 domains, measured by visits, for all sites." 148 | } 149 | }, 150 | { 151 | "name": "top-domains-30-days", 152 | "frequency": "daily", 153 | "query": { 154 | "dimensions": ["ga:hostname"], 155 | "metrics": ["ga:sessions"], 156 | "start-date": "30daysAgo", 157 | "end-date": "yesterday", 158 | "sort": "-ga:sessions", 159 | "max-results": "20" 160 | }, 161 | "meta": { 162 | "name": "Top Domains (30 Days)", 163 | "description": "Last 30 days' top 20 domains, measured by visits, for all sites." 164 | } 165 | }, 166 | { 167 | "name": "second-level-domains", 168 | "frequency": "daily", 169 | "cut": ["ga:sessions"], 170 | "query": { 171 | "dimensions": ["ga:hostname"], 172 | "metrics": ["ga:sessions"], 173 | "filters": [ 174 | "ga:sessions>4", 175 | "ga:hostname=~^[^\\.]+\\.[^\\.]+$" 176 | ], 177 | "start-date": "14daysAgo", 178 | "end-date": "yesterday", 179 | "sort": "ga:hostname", 180 | "max-results": 10000 181 | }, 182 | "meta": { 183 | "name": "Participating second-level domains.", 184 | "description": "Participating second-level domains over the last 2 weeks." 185 | } 186 | }, 187 | { 188 | "name": "top-downloads-yesterday", 189 | "frequency": "daily", 190 | "query": { 191 | "dimensions": ["ga:pageTitle", "ga:eventLabel", "ga:pagePath"], 192 | "metrics": ["ga:totalEvents"], 193 | "filters": ["ga:eventCategory=~ownload"], 194 | "start-date": "yesterday", 195 | "end-date": "yesterday", 196 | "sort": "-ga:totalEvents", 197 | "max-results": "100" 198 | }, 199 | "meta": { 200 | "name": "Top Downloads Yesterday", 201 | "description": "Top downloads yesterday" 202 | } 203 | }, 204 | { 205 | "name": "top-downloads-7-days", 206 | "frequency": "daily", 207 | "query": { 208 | "dimensions": ["ga:pageTitle", "ga:eventLabel", "ga:pagePath"], 209 | "metrics": ["ga:totalEvents"], 210 | "filters": ["ga:eventCategory=~ownload", "ga:eventLabel!~swf$"], 211 | "start-date": "7daysAgo", 212 | "end-date": "yesterday", 213 | "sort": "-ga:totalEvents", 214 | "max-results": "100" 215 | }, 216 | "meta": { 217 | "name": "Top Downloads (7 Days)", 218 | "description": "Top downloads in the last 7 days." 219 | } 220 | }, 221 | { 222 | "name": "top-cities-realtime", 223 | "frequency": "realtime", 224 | "realtime": true, 225 | "query": { 226 | "dimensions": ["rt:city"], 227 | "metrics": ["rt:activeUsers"], 228 | "sort": "-rt:activeUsers" 229 | }, 230 | "meta": { 231 | "name": "Top Cities (Live)", 232 | "description": "Top cities for active onsite users." 233 | } 234 | }, 235 | { 236 | "name": "top-countries-realtime", 237 | "frequency": "realtime", 238 | "realtime": true, 239 | "query": { 240 | "dimensions": ["rt:country"], 241 | "metrics": ["rt:activeUsers"], 242 | "sort": "-rt:activeUsers" 243 | }, 244 | "meta": { 245 | "name": "Top Cities", 246 | "description": "Top countries for active onsite users." 247 | } 248 | }, 249 | { 250 | "name": "all-pages-realtime", 251 | "frequency": "realtime", 252 | "realtime": true, 253 | "threshold": { 254 | "field": "rt:activeUsers", 255 | "value": "10" 256 | }, 257 | "query": { 258 | "dimensions": ["rt:pagePath", "rt:pageTitle"], 259 | "metrics": ["rt:activeUsers"], 260 | "sort": "-rt:activeUsers", 261 | "max-results": "10000" 262 | }, 263 | "meta": { 264 | "name": "All Pages (Live)", 265 | "description": "Pages, measured by active onsite users, for all sites." 266 | } 267 | }, 268 | { 269 | "name": "all-domains-30-days", 270 | "frequency": "daily", 271 | "query": { 272 | "dimensions": ["ga:hostname"], 273 | "metrics": ["ga:sessions"], 274 | "start-date": "30daysAgo", 275 | "end-date": "yesterday", 276 | "sort": "-ga:sessions", 277 | "max-results": "10000", 278 | "filters": ["ga:sessions>=1000"] 279 | }, 280 | "meta": { 281 | "name": "All Domains (30 Days)", 282 | "description": "Last 30 days' domains, measured by visits, for all sites." 283 | } 284 | } 285 | ] 286 | } 287 | -------------------------------------------------------------------------------- /realtime-reports/usa.json: -------------------------------------------------------------------------------- 1 | { 2 | "reports": [ 3 | { 4 | "name": "realtime", 5 | "frequency": "realtime", 6 | "realtime": true, 7 | "query": { 8 | "metrics": ["rt:activeUsers"] 9 | }, 10 | "meta": { 11 | "name": "Active Users Right Now", 12 | "description": "Number of users currently visiting all sites." 13 | } 14 | }, 15 | { 16 | "name": "today", 17 | "frequency": "realtime", 18 | "query": { 19 | "dimensions": ["ga:date", "ga:hour"], 20 | "metrics": ["ga:sessions"], 21 | "start-date": "today", 22 | "end-date": "today" 23 | }, 24 | "meta": { 25 | "name": "Today", 26 | "description": "Today's visits for all sites." 27 | } 28 | }, 29 | { 30 | "name": "devices", 31 | "frequency": "daily", 32 | "slim": true, 33 | "query": { 34 | "dimensions": ["ga:date" ,"ga:deviceCategory"], 35 | "metrics": ["ga:sessions"], 36 | "start-date": "90daysAgo", 37 | "end-date": "yesterday", 38 | "sort": "ga:date" 39 | }, 40 | "meta": { 41 | "name": "Devices", 42 | "description": "90 days of desktop/mobile/tablet visits for all sites." 43 | } 44 | }, 45 | { 46 | "name": "os", 47 | "frequency": "daily", 48 | "slim": true, 49 | "query": { 50 | "dimensions": ["ga:date" ,"ga:operatingSystem"], 51 | "metrics": ["ga:sessions"], 52 | "start-date": "90daysAgo", 53 | "end-date": "yesterday", 54 | "filters": ["ga:sessions>1000"], 55 | "sort": "ga:date" 56 | }, 57 | "meta": { 58 | "name": "Operating Systems", 59 | "description": "90 days of visits, broken down by operating system and date, for all sites." 60 | } 61 | }, 62 | { 63 | "name": "windows", 64 | "frequency": "daily", 65 | "slim": true, 66 | "query": { 67 | "dimensions": ["ga:date" ,"ga:operatingSystemVersion"], 68 | "metrics": ["ga:sessions"], 69 | "start-date": "90daysAgo", 70 | "end-date": "yesterday", 71 | "filters": [ 72 | "ga:operatingSystem==Windows", 73 | "ga:sessions>1000" 74 | ], 75 | "sort": "ga:date" 76 | }, 77 | "meta": { 78 | "name": "Windows", 79 | "description": "90 days of visits from Windows users, broken down by operating system version and date, for all sites." 80 | } 81 | }, 82 | { 83 | "name": "browsers", 84 | "frequency": "daily", 85 | "slim": true, 86 | "query": { 87 | "dimensions": ["ga:date" ,"ga:browser"], 88 | "metrics": ["ga:sessions"], 89 | "start-date": "90daysAgo", 90 | "end-date": "yesterday", 91 | "sort": "ga:date,-ga:sessions", 92 | "filters": ["ga:sessions>1000"] 93 | }, 94 | "meta": { 95 | "name": "Browsers", 96 | "description": "90 days of visits broken down by browser for all sites." 97 | } 98 | }, 99 | { 100 | "name": "ie", 101 | "frequency": "daily", 102 | "slim": true, 103 | "query": { 104 | "dimensions": ["ga:date","ga:browserVersion"], 105 | "metrics": ["ga:sessions"], 106 | "start-date": "90daysAgo", 107 | "end-date": "yesterday", 108 | "sort": "ga:date,-ga:sessions", 109 | "filters": [ 110 | "ga:browser==Internet Explorer", 111 | "ga:sessions>1000" 112 | ] 113 | }, 114 | "meta": { 115 | "name": "Internet Explorer", 116 | "description": "90 days of visits from Internet Explorer users broken down by version for all sites." 117 | } 118 | }, 119 | { 120 | "name": "top-pages-realtime", 121 | "frequency": "realtime", 122 | "realtime": true, 123 | "query": { 124 | "dimensions": ["rt:pagePath", "rt:pageTitle"], 125 | "metrics": ["rt:activeUsers"], 126 | "sort": "-rt:activeUsers", 127 | "max-results": "20" 128 | }, 129 | "meta": { 130 | "name": "Top Pages (Live)", 131 | "description": "The top 20 pages, measured by active onsite users, for all sites." 132 | } 133 | }, 134 | { 135 | "name": "top-domains-7-days", 136 | "frequency": "daily", 137 | "query": { 138 | "dimensions": ["ga:hostname"], 139 | "metrics": ["ga:sessions"], 140 | "start-date": "7daysAgo", 141 | "end-date": "yesterday", 142 | "sort": "-ga:sessions", 143 | "max-results": "20" 144 | }, 145 | "meta": { 146 | "name": "Top Domains (7 Days)", 147 | "description": "Last week's top 20 domains, measured by visits, for all sites." 148 | } 149 | }, 150 | { 151 | "name": "top-domains-30-days", 152 | "frequency": "daily", 153 | "query": { 154 | "dimensions": ["ga:hostname"], 155 | "metrics": ["ga:sessions"], 156 | "start-date": "30daysAgo", 157 | "end-date": "yesterday", 158 | "sort": "-ga:sessions", 159 | "max-results": "20" 160 | }, 161 | "meta": { 162 | "name": "Top Domains (30 Days)", 163 | "description": "Last 30 days' top 20 domains, measured by visits, for all sites." 164 | } 165 | }, 166 | { 167 | "name": "second-level-domains", 168 | "frequency": "daily", 169 | "cut": ["ga:sessions"], 170 | "query": { 171 | "dimensions": ["ga:hostname"], 172 | "metrics": ["ga:sessions"], 173 | "filters": [ 174 | "ga:sessions>4", 175 | "ga:hostname=~^[^\\.]+\\.[^\\.]+$" 176 | ], 177 | "start-date": "14daysAgo", 178 | "end-date": "yesterday", 179 | "sort": "ga:hostname", 180 | "max-results": 10000 181 | }, 182 | "meta": { 183 | "name": "Participating second-level domains.", 184 | "description": "Participating second-level domains over the last 2 weeks." 185 | } 186 | }, 187 | { 188 | "name": "top-downloads-yesterday", 189 | "frequency": "daily", 190 | "query": { 191 | "dimensions": ["ga:pageTitle", "ga:eventLabel", "ga:pagePath"], 192 | "metrics": ["ga:totalEvents"], 193 | "filters": ["ga:eventCategory=~ownload"], 194 | "start-date": "yesterday", 195 | "end-date": "yesterday", 196 | "sort": "-ga:totalEvents", 197 | "max-results": "100" 198 | }, 199 | "meta": { 200 | "name": "Top Downloads Yesterday", 201 | "description": "Top downloads yesterday" 202 | } 203 | }, 204 | { 205 | "name": "top-downloads-7-days", 206 | "frequency": "daily", 207 | "query": { 208 | "dimensions": ["ga:pageTitle", "ga:eventLabel", "ga:pagePath"], 209 | "metrics": ["ga:totalEvents"], 210 | "filters": ["ga:eventCategory=~ownload", "ga:eventLabel!~swf$"], 211 | "start-date": "7daysAgo", 212 | "end-date": "yesterday", 213 | "sort": "-ga:totalEvents", 214 | "max-results": "100" 215 | }, 216 | "meta": { 217 | "name": "Top Downloads (7 Days)", 218 | "description": "Top downloads in the last 7 days." 219 | } 220 | }, 221 | { 222 | "name": "top-cities-realtime", 223 | "frequency": "realtime", 224 | "realtime": true, 225 | "query": { 226 | "dimensions": ["rt:city"], 227 | "metrics": ["rt:activeUsers"], 228 | "sort": "-rt:activeUsers" 229 | }, 230 | "meta": { 231 | "name": "Top Cities (Live)", 232 | "description": "Top cities for active onsite users." 233 | } 234 | }, 235 | { 236 | "name": "top-countries-realtime", 237 | "frequency": "realtime", 238 | "realtime": true, 239 | "query": { 240 | "dimensions": ["rt:country"], 241 | "metrics": ["rt:activeUsers"], 242 | "sort": "-rt:activeUsers" 243 | }, 244 | "meta": { 245 | "name": "Top Cities", 246 | "description": "Top countries for active onsite users." 247 | } 248 | }, 249 | { 250 | "name": "all-pages-realtime", 251 | "frequency": "realtime", 252 | "realtime": true, 253 | "threshold": { 254 | "field": "rt:activeUsers", 255 | "value": "10" 256 | }, 257 | "query": { 258 | "dimensions": ["rt:pagePath", "rt:pageTitle"], 259 | "metrics": ["rt:activeUsers"], 260 | "sort": "-rt:activeUsers", 261 | "max-results": "10000" 262 | }, 263 | "meta": { 264 | "name": "All Pages (Live)", 265 | "description": "Pages, measured by active onsite users, for all sites." 266 | } 267 | }, 268 | { 269 | "name": "all-domains-30-days", 270 | "frequency": "daily", 271 | "query": { 272 | "dimensions": ["ga:hostname"], 273 | "metrics": ["ga:sessions"], 274 | "start-date": "30daysAgo", 275 | "end-date": "yesterday", 276 | "sort": "-ga:sessions", 277 | "max-results": "10000", 278 | "filters": ["ga:sessions>=1000"] 279 | }, 280 | "meta": { 281 | "name": "All Domains (30 Days)", 282 | "description": "Last 30 days' domains, measured by visits, for all sites." 283 | } 284 | } 285 | ] 286 | } 287 | --------------------------------------------------------------------------------