Skip to content

Commit 55c860a

Browse files
Merge branch 'next' into SER-1557
2 parents 26c91de + 562ee4f commit 55c860a

File tree

24 files changed

+822
-184
lines changed

24 files changed

+822
-184
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## Version 24.05.13
2+
Fixes:
3+
- [alerts] Fixed bugs related to NPS alerts
4+
- [crash] Reworked symbol files upload to support larger symbol files
5+
- [push] Fixed bug that would surface when sending Array or Object related payload
6+
7+
Enterprise fixes:
8+
- [ab-testing] Slight improvements to the UI and UX
9+
- [remote-config] Slight improvements to the UI and UX
10+
11+
Enterprise Features:
12+
- [ab-testing] Improved UI for selecting AB test expiration
13+
114
## Version 24.05.12
215
Fixes:
316
- [dashboards] Fixes for dashboards grid

api/api.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,10 +370,18 @@ plugins.connectToAllDatabases().then(function() {
370370
}
371371

372372
const form = new formidable.IncomingForm(formidableOptions);
373-
req.body = '';
374-
req.on('data', (data) => {
375-
req.body += data;
376-
});
373+
if (/crash_symbols\/(add_symbol|upload_symbol)/.test(req.url)) {
374+
req.body = [];
375+
req.on('data', (data) => {
376+
req.body.push(data);
377+
});
378+
}
379+
else {
380+
req.body = '';
381+
req.on('data', (data) => {
382+
req.body += data;
383+
});
384+
}
377385

378386
let multiFormData = false;
379387
// Check if we have 'multipart/form-data'
@@ -432,4 +440,4 @@ plugins.connectToAllDatabases().then(function() {
432440

433441
plugins.loadConfigs(common.db);
434442
}
435-
});
443+
});

api/utils/requestProcessor.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,9 @@ const processRequest = (params) => {
18241824
switch (paths[3]) {
18251825
case 'all':
18261826
validateRead(params, 'core', () => {
1827+
if (!params.qstring.query) {
1828+
params.qstring.query = {};
1829+
}
18271830
if (typeof params.qstring.query === "string") {
18281831
try {
18291832
params.qstring.query = JSON.parse(params.qstring.query);
@@ -1864,6 +1867,9 @@ const processRequest = (params) => {
18641867
break;
18651868
case 'count':
18661869
validateRead(params, 'core', () => {
1870+
if (!params.qstring.query) {
1871+
params.qstring.query = {};
1872+
}
18671873
if (typeof params.qstring.query === "string") {
18681874
try {
18691875
params.qstring.query = JSON.parse(params.qstring.query);
@@ -1896,6 +1902,9 @@ const processRequest = (params) => {
18961902
break;
18971903
case 'list':
18981904
validateRead(params, 'core', () => {
1905+
if (!params.qstring.query) {
1906+
params.qstring.query = {};
1907+
}
18991908
if (typeof params.qstring.query === "string") {
19001909
try {
19011910
params.qstring.query = JSON.parse(params.qstring.query);

bin/scripts/data-cleanup/delete_old_views.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
9090
let view = await cursor.next();
9191
//Find one drill entry for the view with timestamp greater than expiration date
9292
var drillEntry = await drillSession.client.db("countly_drill").collection(collectionName).findOne({"sg.name": view.view, "ts": { $gt: expiration_timestamp }}, {ts: 1});
93+
var drillEntry2 = await drillSession.client.db("countly_drill").collection("drill_events").findOne({"a": app._id + "", "e": event, "sg.name": view.view, "ts": { $gt: expiration_timestamp }}, {ts: 1});
9394
//If no entry found, delete the view
94-
if (!drillEntry) {
95+
if (!drillEntry && !drillEntry2) {
9596
console.log("Deleting view: ", view.view);
9697
if (!DRY_RUN) {
9798
await new Promise(function(resolve) {

bin/scripts/data-cleanup/remove_old_crashes_sync.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ Promise.all(
6767
count = await drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')).countDocuments({ ts: { $lt: lastUnixTimestamp * 1000 } });
6868
console.log("", count, "drill crashes to be deleted via command");
6969
console.log("", "", "", `db.drill_events${crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')}.deleteMany({ ts: { $lt: ${lastUnixTimestamp * 1000} } })`);
70+
var count2 = await drillDb.collection("drill_events").countDocuments({"a": app._id + "", "e": "[CLY]_crash", ts: { $lt: lastUnixTimestamp * 1000 } });
71+
console.log("", count2, "drill crashes to be deleted via command");
72+
console.log("", "", "", `db.drill_events.deleteMany({"a": ${app._id}, "e": "[CLY]_crash", ts: { $lt: ${lastUnixTimestamp * 1000} } })`);
7073
checkThreshold(count);
7174
}
7275
else {
@@ -77,8 +80,12 @@ Promise.all(
7780
res = await db.collection(`app_crashes${app._id}`).deleteMany({ ts: { $lt: lastUnixTimestamp } });
7881
console.log("", res, "crashes deleted");
7982
await sleep(SLEEP);
83+
//deleting from old collection
8084
res = await drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')).deleteMany({ ts: { $lt: lastUnixTimestamp * 1000 } });
8185
console.log("", res, "drill crashes deleted");
86+
//deleting from amerged drill collection
87+
res = await drillDb.collection("drill_events").deleteMany({"a": app._id + "", "e": "[CLY]_crash", ts: { $lt: lastUnixTimestamp * 1000 } });
88+
console.log("", res, "drill crashes deleted");
8289
await sleep(SLEEP);
8390
}
8491
}

bin/scripts/data-reports/check_user_mismatch.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,25 @@ var query = {"ts": {"$gt": 1709762400000}}; //Change this query to set date rang
1414
var eventKey = "[CLY]_session"; //Write in your event key
1515
var appID = "6075f94b7e5e0d392902520c"; //Write in YOUR app ID
1616

17+
var union_with_old_collection = false; //False if all sessions are stored in drill_events collection
18+
1719
console.log("Running for:" + appID + " " + eventKey + " " + JSON.stringify(query));
1820

1921
Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) {
2022

2123
var pipeline = [];
22-
pipeline.push({"$match": query});
23-
pipeline.push({"$group": {"_id": null, "uid": {"$addToSet": "$uid"}}});
24+
var query2 = JSON.parse(JSON.stringify(query));
25+
query2.e = eventKey;
26+
query2.a = appID;
27+
pipeline.push({"$match": query2});
2428

25-
var collection = "drill_events" + crypto.createHash('sha1').update(eventKey + appID).digest('hex');
29+
if (union_with_old_collection) {
30+
var collection = "drill_events" + crypto.createHash('sha1').update(eventKey + appID).digest('hex');
31+
pipeline.push({"$unionWith": { "coll": collection, "pipeline": [{"$match": query}] }});
32+
}
33+
pipeline.push({"$group": {"_id": null, "uid": {"$addToSet": "$uid"}}});
2634

27-
drillDb.collection(collection).aggregate(pipeline, function(err, res) {
35+
drillDb.collection("drill_events").aggregate(pipeline, function(err, res) {
2836
if (err) {
2937
console.log(err);
3038
countlyDb.close();
@@ -67,6 +75,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
6775
console.log("Users missing in app_users collection: " + missingOnes.length);
6876
console.log(JSON.stringify(missingOnes));
6977
}
78+
else {
79+
console.log("All users matched");
80+
}
7081

7182
countlyDb.close();
7283
drillDb.close();

bin/scripts/data-reports/drill_data_cd.js

Lines changed: 36 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@
77
*/
88

99
//period to check
10-
var startDate = new Date("2024-04-2T00:00:00");
11-
var endDate = new Date("2024-04-3T00:00:00");
10+
var startDate = new Date("2021-04-02T00:00:00");
11+
var endDate = new Date("2025-04-03T00:00:00");
1212
var apps = []; //Put in your APP ID like ["3469834986y34968y206y2"]
1313

14-
var internal_events = [];
15-
var verbose = true;
16-
1714
var Promise = require("bluebird");
18-
var crypto = require('crypto');
1915
var pluginManager = require("../../../plugins/pluginManager");
16+
var results = {};
17+
var dates = {};
2018

2119
function output_data(dates, results) {
2220
var datesList = Object.keys(dates).sort(function(a, b) {
@@ -70,80 +68,48 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
7068
queryApps = {_id: {$in: apps}};
7169
}
7270

73-
countlyDb.collection("apps").find(queryApps).toArray(function(err, apps) {
71+
countlyDb.collection("apps").find(queryApps).toArray(function(err, apps2) {
7472
if (err) {
7573
console.log(err);
7674
countlyDb.close();
7775
drillDb.close();
7876
}
7977
else {
80-
Promise.each(apps, function(app) {
81-
console.log('------' + app.name + '------');
82-
return new Promise(function(resolve) {
83-
var dates = {};
84-
var results = {};
85-
//fetch events list
86-
countlyDb.collection("events").findOne({"_id": app._id}, {"list": 1}, function(err, events) {
87-
events = events || [];
88-
var list = events.list || [];
89-
if (verbose) {
90-
console.log(list.length + " events found");
91-
}
92-
for (var z = 0; z < internal_events.length; z++) {
93-
if (list.indexOf(internal_events[z]) === -1) {
94-
list.push(internal_events[z]);
95-
}
78+
var query = {"cd": {"$gte": startDate, "$lt": endDate}};
79+
if (apps.length > 0) {
80+
81+
var a = [];
82+
for (var i = 0; i < apps2.length; i++) {
83+
a.push(apps2[i]._id + "");
84+
}
85+
query.a = {$in: a};
86+
}
87+
var pipeline = [{"$match": query}, {"$group": {"_id": {"a": "$a", "e": "$e", "d": "$d"}, "c": {"$sum": 1}}}];
88+
drillDb.collection("drill_events").aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) {
89+
if (err) {
90+
console.log(err);
91+
}
92+
if (data && data.length > 0) {
93+
results["_total"] = results["_total"] || {};
94+
95+
for (var z = 0; z < data.length; z++) {
96+
var event = data[z]._id.e;
97+
if (!dates[data[z]._id.d]) {
98+
dates[data[z]._id.d] = true;
9699
}
97-
Promise.each(list, function(event) {
98-
return new Promise(function(resolve2) {
99-
//get hashed drill collection name
100-
let collection = "drill_events" + crypto.createHash('sha1').update(event + app._id).digest('hex');
101-
if (verbose) {
102-
console.log(collection);
103-
}
104-
var pipeline = [
105-
{"$match": {"cd": {"$gte": startDate, "$lt": endDate}}},
106-
{"$group": {"_id": "$d", "c": {"$sum": 1}}}
107-
];
108-
drillDb.collection(collection).aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) {
109-
if (err) {
110-
console.log(err);
111-
}
112-
if (data.length > 0) {
113-
results["_total"] = results["_total"] || {};
114-
results[event] = {};
115-
for (var z = 0; z < data.length; z++) {
116-
if (!dates[data[z]._id]) {
117-
dates[data[z]._id] = true;
118-
}
119-
results[event][data[z]._id] = data[z].c;
120-
results["_total"][data[z]._id] = results["_total"][data[z]._id] || 0;
121-
results["_total"][data[z]._id] += data[z].c || 0;
122-
}
123-
}
124-
resolve2();
125-
});
126-
});
127-
}).then(function() {
128-
//output
129-
//sort dates
130-
output_data(dates, results);
131-
resolve();
132-
}).catch(function(err) {
133-
output_data(dates, results);
134-
console.log(err);
135-
resolve();
136-
});
137-
});
138-
});
139-
}).then(function() {
140-
countlyDb.close();
141-
drillDb.close();
142-
}).catch(function(err) {
143-
console.log(err);
100+
results[data[z]._id.e] = {};
101+
results[event][data[z]._id.d] = data[z].c;
102+
results["_total"][data[z]._id.d] = results["_total"][data[z]._id.d] || 0;
103+
results["_total"][data[z]._id.d] += data[z].c || 0;
104+
}
105+
output_data(dates, results);
106+
}
107+
144108
countlyDb.close();
145109
drillDb.close();
146110
});
111+
112+
147113
}
148114
});
149115
});

0 commit comments

Comments
 (0)