Files
Tesi/peertube/datavis/CRUD/sessions-metrics.js

142 lines
4.6 KiB
JavaScript

/* global use, db */
// MongoDB Playground
// To disable this template go to Settings | MongoDB | Use Default Template For Playground.
// Make sure you are connected to enable completions and to be able to run a playground.
// Use Ctrl+Space inside a snippet or a string literal to trigger completions.
// The result of the last command run in a playground is shown on the results panel.
// By default the first 20 documents will be returned with a cursor.
// Use 'console.log()' to print to the debug output.
// For more documentation on playgrounds please refer to
// https://www.mongodb.com/docs/mongodb-vscode/playgrounds/
use("statistics");
let formattedDate = (date) => ({
unix: { $toLong: date },
iso: { $toString: date },
});
db.getCollection("peertube_ts").aggregate([
{
$sort: { timestamp: 1 }
},
{
$group: {
_id: "$tags.session",
host: { $first: "$tags.host" },
firstTimestamp: { $first: "$timestamp" },
lastTimestamp: { $last: "$timestamp" },
firstTimestampWithPeers: {
$min: {
$cond: {
if: { $gt: [{ $size: { $ifNull: ["$peers", []] } }, 0] },
then: "$timestamp",
else: null,
}
}
},
maxNumberOfPeers: {
$max: {
$size: { $ifNull: ["$peers", []] },
}
},
minNumberOfPeers: {
$min: {
$size: { $ifNull: ["$peers", []] },
}
}
}
},
// Lookup other sessions that may have peers
{
$lookup: {
from: "peertube_ts",
let: { currentSession: "$_id", ftp: "$firstTimestampWithPeers", fst: "$firstTimestamp" },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $ne: ["$tags.session", "$$currentSession"] },
{ $lt: ["$timestamp", "$$ftp"] },
{ $gte: ["$timestamp", "$$fst"] },
{ $gt: [{ $size: { $ifNull: ["$peers", []] } }, 0] }
]
}
}
}
],
as: "concurrentSessions"
}
},
// Mark whether peers existed in other sessions before starting
{
$addFields: {
concurrentSessions: {
$gt: [{ $size: "$concurrentSessions" }, 0]
}
}
},
{
$group: {
_id: "$host",
sessions: {
$push: {
id: "$_id",
startTime: formattedDate("$firstTimestamp"),
endTime: formattedDate("$lastTimestamp"),
duration: {
$divide: [
{
$subtract: ["$lastTimestamp", "$firstTimestamp"],
},
1000,
]
},
firstPeerConnection: {
$cond: {
if: { $eq: ["$firstTimestampWithPeers", null] },
then: null,
else: {
time: {
date: formattedDate("$firstTimestampWithPeers"),
elapsedFromStart: {
$divide: [
{
$subtract: ["$firstTimestampWithPeers", "$firstTimestamp"],
},
1000,
]
}
},
concurrentSessions: "$concurrentSessions",
}
}
},
maxPeers: { $max: "$maxNumberOfPeers" },
minPeers: { $min: "$minNumberOfPeers" }
}
}
}
},
{
$set: {
sessions: {
$sortArray: {
input: "$sessions",
sortBy: { id: 1 }
}
}
}
},
{
$project: {
_id: 0,
host: "$_id",
sessions: "$sessions"
}
},
{
$sort: { host: 1 }
}
]);