11/**
22 * Checks aggregated data for all events of all apps and outputs the ones that should need omitting segments.
3+ * For deletion to work SERVER_URL and API_KEY should be set.
34 * If DRY_RUN is false, will also omit those segmentes
45 * Server: countly
56 * Path: $(countly dir)/bin/scripts/modify-data
67 * Command: nodejs omit_events.js
78 */
89
9- //API key here with permission to delete events
10- var API_KEY = "0d87fb49bd48ddc510306b7b4faf209a" ;
11-
10+ //API key with global admin rights
11+ var API_KEY = "" ;
1212//dry run without deleting events
1313var DRY_RUN = true ;
1414var SERVER_URL = "https://yourserver.count.ly" ;
1515
1616var requestsToRun = [ ] ;
17-
17+ var omitLimit = 100 ; //Segment value limit
18+ var failedReqs = 0 ;
1819
1920var plugins = require ( "../../../plugins/pluginManager" ) ;
2021var crypto = require ( 'crypto' ) ;
21- var request = require ( 'request' ) ;
22- var requestOptions = {
23- uri : ( process . env . COUNTLY_CONFIG_PROTOCOL || "http" ) + "://" + ( process . env . COUNTLY_CONFIG_HOSTNAME || "localhost" ) + "/i/events/edit_map" ,
24- method : 'POST'
25- } ;
22+ var request = require ( 'countly-request' ) ( plugins . getConfig ( "security" ) ) ;
23+
2624if ( ! SERVER_URL ) {
2725 SERVER_URL = ( process . env . COUNTLY_CONFIG_PROTOCOL || "http" ) + "://" + ( process . env . COUNTLY_CONFIG_HOSTNAME || "localhost" ) ;
2826}
2927plugins . dbConnection ( ) . then ( async function ( db ) {
30-
31- var date = new Date ( ) ;
32- var yy = date . getFullYear ( ) ;
33-
3428 var apps = await db . collection ( "apps" ) . find ( ) . toArray ( ) ;
3529 var appCheck = { } ;
3630 for ( var l = 0 ; l < apps . length ; l ++ ) {
@@ -42,48 +36,78 @@ plugins.dbConnection().then(async function(db) {
4236 var omitted_segments = { } ;
4337 var event_map = { } ;
4438 if ( events [ i ] && events [ i ] . list && events [ i ] . list . length ) {
39+ console . log ( "Checking app:" , events [ i ] . _id ) ;
4540 for ( var j = 0 ; j < events [ i ] . list . length ; j ++ ) {
4641 if ( events [ i ] . list [ j ] ) {
42+ console . log ( " Checking event:" , events [ i ] . list [ j ] ) ;
4743 var eventSegmentCounts = { } ;
48- var eventMeta = await db . collection ( "events" + crypto . createHash ( 'sha1' ) . update ( events [ i ] . list [ j ] + events [ i ] . _id ) . digest ( 'hex' ) ) . find ( { "m" : yy + ":0" } ) . toArray ( ) ;
49- for ( var k = 0 ; k < eventMeta . length ; k ++ ) {
50- if ( eventMeta [ k ] && eventMeta [ k ] . meta_v2 && eventMeta [ k ] . meta_v2 . segments ) {
51- for ( let segment in eventMeta [ k ] . meta_v2 . segments ) {
52- if ( eventMeta [ k ] . meta_v2 [ segment ] ) {
53- if ( typeof eventSegmentCounts [ segment ] === "undefined" ) {
54- eventSegmentCounts [ segment ] = 0 ;
44+ var hash = crypto . createHash ( 'sha1' ) . update ( events [ i ] . list [ j ] + events [ i ] . _id ) . digest ( 'hex' ) ;
45+ var pipeline = [
46+ { "$match" : { "_id" : { "$regex" : "^" + events [ i ] . _id + "_" + hash + "_no-segment_.*" } , "meta_v2" : { "$exists" : true } } } ,
47+ {
48+ "$project" : {
49+ "m" : "$m" ,
50+ "meta_v2" : {
51+ "$map" : {
52+ "input" : { "$objectToArray" : "$meta_v2" } ,
53+ "as" : "seg" ,
54+ "in" : { "k" : "$$seg.k" , "v" : { "$size" : { "$objectToArray" : "$$seg.v" } } }
5555 }
56- eventSegmentCounts [ segment ] += Object . keys ( eventMeta [ k ] . meta_v2 [ segment ] ) . length ;
5756 }
5857 }
58+ } ,
59+ { "$unwind" : "$meta_v2" } ,
60+ {
61+ "$group" : {
62+ "_id" : { "key" : "$meta_v2.k" , "m" : "$m" } ,
63+ "count" : { "$sum" : "$meta_v2.v" }
64+ }
65+ }
66+ ] ;
67+ var eventMeta = await db . collection ( "events_data" ) . aggregate ( pipeline ) . toArray ( ) ;
68+ for ( var k = 0 ; k < eventMeta . length ; k ++ ) {
69+ if ( eventMeta [ k ] . _id . key !== "segments" ) {
70+ eventSegmentCounts [ eventMeta [ k ] . _id . key ] = eventSegmentCounts [ eventMeta [ k ] . _id . key ] || 0 ;
71+ eventSegmentCounts [ eventMeta [ k ] . _id . key ] = Math . max ( eventMeta [ k ] . count , eventSegmentCounts [ eventMeta [ k ] . _id . key ] ) ;
5972 }
73+
6074 }
6175 var first = true ;
6276 //console.log("Event:", events[i].list[j], "for app:", events[i]._id);
6377 for ( let segment in eventSegmentCounts ) {
64- if ( eventSegmentCounts [ segment ] >= 1000 ) {
78+ if ( eventSegmentCounts [ segment ] >= omitLimit ) {
6579 if ( first ) {
6680 if ( firstApp ) {
67- console . log ( "For app:" , appCheck [ events [ i ] . _id ] || events [ i ] . _id ) ;
6881 firstApp = false ;
6982 }
70- console . log ( "" , "Event:" , events [ i ] . list [ j ] ) ;
7183 first = false ;
7284 }
73- console . log ( "" , "" , segment , ":" , eventSegmentCounts [ segment ] ) ;
85+ if ( events [ i ] && events [ i ] . omitted_segments && events [ i ] . omitted_segments [ events [ i ] . list [ j ] ] && Array . isArray ( events [ i ] . omitted_segments [ events [ i ] . list [ j ] ] ) ) {
86+ omitted_segments [ events [ i ] . list [ j ] ] = events [ i ] . omitted_segments [ events [ i ] . list [ j ] ] ;
87+ }
7488 if ( ! omitted_segments [ events [ i ] . list [ j ] ] ) {
7589 omitted_segments [ events [ i ] . list [ j ] ] = [ ] ;
7690 }
77- omitted_segments [ events [ i ] . list [ j ] ] . push ( segment ) ;
91+ if ( omitted_segments [ events [ i ] . list [ j ] ] . indexOf ( segment ) === - 1 ) {
92+ omitted_segments [ events [ i ] . list [ j ] ] . push ( segment ) ;
93+ }
94+
95+ if ( events [ i ] && events [ i ] . map && events [ i ] . map [ events [ i ] . list [ j ] ] ) {
96+ event_map [ events [ i ] . list [ j ] ] = events [ i ] . map [ events [ i ] . list [ j ] ] ;
97+ event_map [ events [ i ] . list [ j ] ] . omit_list = events [ i ] . map [ events [ i ] . list [ j ] ] . omit_list || [ ] ;
98+ }
7899 if ( ! event_map [ events [ i ] . list [ j ] ] ) {
79100 event_map [ events [ i ] . list [ j ] ] = { key : events [ i ] . list [ j ] , is_visible : true , omit_list : [ ] } ;
80101 }
81- event_map [ events [ i ] . list [ j ] ] . omit_list . push ( segment ) ;
102+ if ( event_map [ events [ i ] . list [ j ] ] && event_map [ events [ i ] . list [ j ] ] . omit_list && event_map [ events [ i ] . list [ j ] ] . omit_list . indexOf ( segment ) === - 1 ) {
103+ event_map [ events [ i ] . list [ j ] ] . omit_list . push ( segment ) ;
104+ }
82105 }
83106 }
84107 }
85108 }
86109 }
110+ console . log ( " Current event map:" , JSON . stringify ( event_map ) ) ;
87111 if ( Object . keys ( omitted_segments ) . length ) {
88112 if ( DRY_RUN ) {
89113 //as it is dry run - output request
@@ -96,25 +120,41 @@ plugins.dbConnection().then(async function(db) {
96120 requestsToRun . push ( SERVER_URL + "/i/events/edit_map?" + props . join ( "&" ) ) ;
97121 }
98122 else {
99- requestOptions . json = {
100- omitted_segments : JSON . stringify ( omitted_segments ) ,
101- event_map : JSON . stringify ( event_map ) ,
102- app_id : events [ i ] . _id ,
103- api_key : API_KEY
123+ console . log ( "Omitting segments for app:" , events [ i ] . _id , "for events:" , JSON . stringify ( omitted_segments ) ) ;
124+ const options = {
125+ url : SERVER_URL + "/i/events/edit_map" ,
126+ uri : SERVER_URL + "/i/events/edit_map" ,
127+ method : "POST" ,
128+ json : {
129+ omitted_segments : JSON . stringify ( omitted_segments ) ,
130+ event_map : JSON . stringify ( event_map ) ,
131+ app_id : events [ i ] . _id + "" ,
132+ api_key : API_KEY
133+ } ,
134+ strictSSL : false
104135 } ;
105136 await new Promise ( function ( resolve ) {
106- request ( requestOptions , function ( error , response , body ) {
107- console . log ( "request finished" , body ) ;
137+ request ( SERVER_URL + "/i/events/edit_map" , options , function ( error ) {
138+ if ( ( error && error . name ) ) {
139+ failedReqs ++ ;
140+ console . log ( JSON . stringify ( error . message ) ) ;
141+ console . log ( { err : 'There was an error while sending a request.' } ) ;
142+ }
143+
108144 resolve ( ) ;
109145 } ) ;
110146 } ) ;
111147 }
112148 }
113149 }
150+ if ( failedReqs ) {
151+ console . log ( "There were " + failedReqs + " failed requests. Please check your API KEY and url for server" ) ;
152+ }
114153 if ( requestsToRun . length ) {
115154 for ( var z = 0 ; z < requestsToRun . length ; z ++ ) {
116155 console . log ( requestsToRun [ z ] ) ;
117156 }
118157 }
158+ console . log ( "Done" ) ;
119159 db . close ( ) ;
120160} ) ;
0 commit comments