diff --git a/Tesi.tex b/Tesi.tex index bf46ca6..b34f682 100644 --- a/Tesi.tex +++ b/Tesi.tex @@ -38,6 +38,7 @@ \usepackage{lipsum} % Per inserire testo a caso in attesa di realizzare i capitoli \usepackage{listings} % Per inserire codice formattato +%\usepackage{minted} %\lstset{ %lstset va usato dopo l'inizio del document e ogni volta che si vuole cambiare/impostare il linguaggio da formattare @@ -871,6 +872,103 @@ Questo progetto fa uso di una \footnote{Disponibile qui: \url{https://gitea.kobi \item Supporto alla configurazione tramite variabili d'ambiente per semplificare l'integrazione con il nostro sistema di test. \end{itemize} +\newpage +\begin{lstlisting}[caption={Esempio di dati JSON con le metriche esportate da WebRTC Internals Exporter}, captionpos=b, basicstyle=\scriptsize] + { + _id: ObjectId('67cf2a286904313f4e5ad32c'), + player: { + Codecs: { + Audio: 'mp4a.40.2', + Video: 'avc1.64002a' + }, + 'Connection Speed': { + Granularity: 's', + Speed: 16777216 + }, + 'Download Breakdown': { + Peers: 0, + Server: 11534336 + }, + 'Live Latency': { + Edge: 0, + Latency: 21 + }, + 'Network Activity': { + Down: 7340032, + Up: 0 + }, + P2P: 'enabled', + 'Player mode': 'p2p-media-loader', + Resolution: '1080p', + 'Total Transfered': { + Down: 11534336, + Up: 0 + }, + 'Video UUID': '70663bee-df65-4080-84bb-eefc5a11ab75', + ... + }, + peers: [ + { + connectionState: 'new', + iceCandidateErrors: [ + { + errorCode: 701, + errorText: 'STUN host lookup received error.', + timestamp: 1741629977060, + url: 'stun:stunserver2024.stunprotocol.org:3478' + }, + ... + ], + iceCandidates: [ + { + candidate: 'candidate:3130924284 1 udp 2113937151 172.17.0.2 43668...', + component: 'rtp', + foundation: '3130924284', + port: 43668, + priority: 2113937151, + protocol: 'udp', + relatedAddress: null, + relatedPort: null, + sdpMLineIndex: 0, + sdpMid: '0', + tcpType: null, + timestamp: 1741629977042, + type: 'host', + usernameFragment: '6V/z' + }, + ... + ], + iceConnectionState: 'new', + iceGatheringState: 'complete', + id: '0dfd00af-518b-46c3-a2de-bc3330da9312', + signalingState: 'have-local-offer', + url: 'https://tube.kobim.cloud/w/eT1NZibmwMy6bx6N2YGLwr', + values: [ + { + bytesReceived: 0, + bytesSent: 0, + id: 'D1', + label: '01e722a46bc1440994d511d27e86171d976d105a', + messagesReceived: 0, + messagesSent: 0, + protocol: '', + state: 'connecting', + timestamp: 1741629979445.746, + type: 'data-channel' + }, + ... + ] + } + ], + tags: { + host: 'selenium-nbg1-node-5-instance-1', + session: '64001538ac0eb86fafc5ed531b96ff7c', + url: 'https://tube.kobim.cloud/w/eT1NZibmwMy6bx6N2YGLwr' + }, + timestamp: ISODate('2025-03-10T18:06:19.496Z') +} +\end{lstlisting} + \subsection{Webpack} Webpack è un bundler di moduli per applicazioni JavaScript. Prende moduli con varie dipendenze e genera dei file statici che rappresentano quei moduli. È ampiamente utilizzato per applicazioni web moderne, in particolare quelle basate su framework come React, Angular e Vue.js. @@ -930,7 +1028,7 @@ Durante la creazione del sistema, abbiamo incontrato diverse difficoltà, per lo \item \textbf{Accesso agli indirizzi IP forniti da WebRTC}: WebRTC dalle ultime versioni come misura di sicurezza e privacy, non permette più l'accesso e la visualizzazione degli indirizzi IP locali delle macchine coinvolte nella connessione grazie a tecniche di offuscazione, rendendo difficile la raccolta di queste informazioni. Per ovviare a questo problema ci siamo avvalsi di 2 soluzioni: la prima consiste nell'utilizzare una versione vecchia di Chromium, nello specifico una versone anteriore o uguale alla 129.0, in quanto in queste versioni l'offuscazione è presente ma è possibile disabilitarla tramite un flag da interfaccia grafica; la seconda soluzione invece consiste proprio nel disabilitarequesta funzionalità ma da riga di comando tramite un altro flag, all'avvio del browser. \item \textbf{Limitazioni delle API di Peertube}: PeerTube fornisce delle API per la gestione della piattaforma, moderazione dei video, e altro ancora, ma non fornisce API per la raccolta delle metriche dei video. Alcune metriche generiche sono esposte via OpenTelemetry ma non sono specifiche per un singolo utente o video. Per ovviare a questo problema, abbiamo utilizzato il data scraping per estrarre le metriche direttamente dalla pagina web. \item \textbf{Gestione delle variabili d'ambiente nell'estensione Chrome}: WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Tuttavia, l'estensione non supporta la sostituzione delle variabili d'ambiente nel codice JavaScript, in quanto viene caricata ed eseguita runtime in un ambiente isolato, rendendo difficile la configurazione dinamica dell'estensione. L'utilizzo di WebPack ci consente di configurare l'estensione in fase di complilazione, sostituendo le variabili d'ambiente con i valori corretti prima di caricarla nel browser. - \item \textbf{Raccolta dei dati dei test su macchine virtuali distribuite}: Data la distribuzione geografica delle nostre macchine virtuali di test, abbiamo dovuto affrontare la sfida di raccogliere ed aggregare i dati in modo efficiente e coordinato. Abbiamo risolto questo problema utilizzando Telegraf come agente di raccolta dati su ogni VM, configurandolo per inviare le metriche ad un'istanza centrale di MongoDB. MongoDB è stato scelto per la sua flessibilità nello schema e per la capacità di gestire grandi volumi di dati time-series provenienti da fonti eterogenee.Le API di Hetzner Cloud ci hanno permesso di automatizzare il deployment e la configurazione di tutte queste componenti su macchine distribuite in diverse regioni geografiche, mantenendo una configurazione coerente su tutta l'infrastruttura di test. + \item \textbf{Raccolta dei dati dei test su macchine virtuali distribuite}: Data la distribuzione geografica delle nostre macchine virtuali di test, abbiamo dovuto affrontare la sfida di raccogliere ed aggregare i dati in modo efficiente e coordinato. Questa sfida l'abbiamo risolta utilizzando Telegraf come agente di raccolta dati su ogni VM, configurandolo per inviare le metriche ad un'istanza centrale di MongoDB. MongoDB è stato scelto per il suo supporto nativo a documenti JSON e per la capacità di gestire grandi volumi di dati time-series provenienti da fonti eterogenee.Le API di Hetzner Cloud ci hanno permesso di automatizzare il deployment e la configurazione di tutte queste componenti su macchine distribuite in diverse regioni geografiche. \end{itemize} \subsection{Python script} @@ -992,11 +1090,11 @@ I passaggi presenti in figura \ref{fig:architettura-collector} possono essere ri \item \textbf{Avvio del browser}: Viene avviato il browser ed aperta la pagina del video specificato tramite Selenium, con l'estensione di WebRTC Internals Exporter installata ed abilitata. Viene anche avviato in ascolto un server HTTP in background per ricevere le metriche WebRTC tramite un endpoint locale POST dedicato. \item \textbf{Avvio del test}: Viene caricata la pagina del video e tramite Selenium viene controllato che il video sia in riproduzione tramite il controllo dell'esistenza del bottone play. \item \textbf{Raccolta delle metriche WebRTC}: L'estensione per WebRTC inizia a raccogliere le metriche e ogni 2 secondi circa le invia allo script principale. Viene quindi di fatto instaurato un ciclo che viene usato dallo script come sorgente di clock per la raccolta delle altre metriche. - \item \textbf{Raccolta delle metriche video di PeerTube}: Utilizzando BeautifulSoup, vengono trasformate e raccolte le metriche del player video di PeerTube, come la qualità del video, il buffering, quantità di dati trasferiti, la latenza, e altro ancora. - \item \textbf{Invio delle metriche a Telegraf}: Le metriche raccolte infine vengono inviate a Telegraf tramite una socket di sistema, per l'elaborazione e l'invio al database finale. + \item \textbf{Raccolta delle metriche video di PeerTube}: Utilizzando BeautifulSoup, vengono trasformate e raccolte le metriche del player video di PeerTube, come la qualità del video, il buffering, quantità di dati trasferiti, la latenza, e altro ancora. Il tutto viee convertito in un formato JSON. + \item \textbf{Invio delle metriche a Telegraf}: Le metriche raccolte, vengono inviate a Telegraf tramite una socket di sistema, per l'elaborazione e l'invio al database finale, nel nostro caso MongoDB. C'è un passaggio fondamentale però che Telegraf esegue, ed è quello di fare \textit{string-join} dei dati JSON, ovvero di `appiattire' e trasformare i dati in una stringa, per poi inviarli al database. Questo viene fatto in quanto Telegraf, utilizzando il plugin di input per il formato JSON, converte gli array \textbf{in singole metriche separate}, e non come un unico documento, perdendo quindi la struttura originale dei dati. In se qusto non è un problema, ma per la nostra analisi, è fondamentale mantenere la struttura originale dei dati per facilitarci il lavoro. \end{itemize} -Va evidenziata la scelta di utilizzare un solo script Python per coordinare il tutto sia l'inizializzazione che raccolta delle metriche dalle pagine web e dalla estensione esterna, in quanto questo ha semplificato la gestione e soprattutto la creazione del sistema, e permette come bonus di avere un unico punto di controllo per l'intero processo. +Va inoltre evidenziata la scelta di utilizzare un solo script Python per coordinare il tutto, sia l'inizializzazione che raccolta delle metriche dalle pagine web e dalla estensione esterna, in quanto questo ha semplificato la gestione e soprattutto la creazione del sistema e permette come bonus di avere un unico punto di controllo per l'intero processo. \newpage