feat: add WebRTC Internals Exporter and Hetzner cloud section with detailed explanations and images; update bibliography with new reference

This commit is contained in:
2025-03-20 18:56:00 +01:00
parent 403d2eb03d
commit 968ef8e454
3 changed files with 69 additions and 3 deletions

View File

@@ -611,8 +611,8 @@ Per i nostri test abbiamo utilizzato una combinazione di tecnologie open source
\item \textbf{MongoDB}: Per l'archiviazione strutturata dei dati raccolti
\item \textbf{Python}: Come linguaggio principale per l'automazione
\item \textbf{Selenium}: Per simulare browser reali che guardano lo stream
\item \textbf{webrtc-internals-exporter}: Una estensione del browser creata per raccogliere metriche dettagliate sulle connessioni WebRTC
\item \textbf{Hetzner Cloud}: Per distribuire i test su macchine virtuali in diverse regioni geografiche
\item \textbf{WebRTC Internals Exporter}: Una estensione del browser creata per raccogliere metriche dettagliate sulle connessioni WebRTC
\item \textbf{Hetzner Cloud e script CLI}: Per distribuire i test su macchine virtuali in diverse regioni geografiche
\end{itemize}
\subsection{Docker}
@@ -826,7 +826,65 @@ Un altro componente messo a dispoizione da Selenium è, `Selenium Grid', che per
\caption{Architettura Selenium Grid.}
\end{figure}
Per fare tutto questo, Selenium mette a disposizione varie immagini Docker preconfigurate con tutto il necessario per eseguire i test, come il browser, il driver, l'hub, e le dipendenze necessarie, con anche diverse versioni legacy per testare la compatibilità con versioni obsolete.\cite{TestGrid_2024} \cite{scalerWhichBrowser} \cite{seleniumSeleniumBrowser}
Per fare tutto questo, Selenium mette a disposizione varie immagini Docker preconfigurate con tutto il necessario per eseguire i test, come il browser, il driver, l'hub, e le dipendenze necessarie, con anche diverse versioni legacy per testare la compatibilità con versioni obsolete.
In particolare, a noi interessa l'immagine `selenium/standalone-chrome', che contiene tutto il necessario per eseguire test su Chromium, incluso il browser stesso, il driver e il server Selenium, ed è stata usata come base per \textbf{creare una immagine Docker monolitica} per i nostri test, che include tutte le ulteriori dipendenze necessarie come:
\begin{itemize}
\item \textbf{Python}: Per l'automazione.
\item \textbf{Telegraf}: Per la raccolta ed invidio di tutte le metriche.
\item \textbf{WebRTC Internals Exporter}: Per la raccolta delle metriche WebRTC.
\item \textbf{Webpack}: Per la sostituzione delle variabili d'ambiente nel codice JavaScript.
\end{itemize} \cite{TestGrid_2024} \cite{scalerWhichBrowser} \cite{seleniumSeleniumBrowser}
\subsection{WebRTC Internals Exporter}
WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Creato da un ricercatore Italiano, è stato progettato per semplificare il processo di raccolta e analisi delle metriche WebRTC, che altrimenti sarebbero difficili da ottenere in quanto Chromium mette a disposizione uno strumento chiamato WebRTC-internals, che consente di visualizzare le statistiche WebRTC in tempo reale, ma non offre un modo semplice per esportarle dato che di base offre solo la creazione di file `dumps' non automatizzabile.
L'uso di webrtc-internals con il processo di creazione/caricamento dei dump presenta alcune grosse limitazioni:
\begin{itemize}
\item È necessario aprire la pagina `chrome://webrtc-internals' prima di avviare una sessione. Se la sessione è già in corso e si verificano problemi, non è possibile raccogliere metriche retroattivamente.
\item La visualizzazione delle metriche è limitata nel tempo e non è possibile personalizzarle, filtrarle o creare query aggiuntive sui dati raccolti.
\item L'uso di file dump può rendere difficile l'archiviazione e l'organizzazione dei dati dei test, oltre alla condivisione dei risultati. Inoltre, il caricamento di file dump di grandi dimensioni in altri strumenti di analisi, potrebbe richiedere molto tempo e memoria.
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=300pt]{images/web-rtc-internals-chrome.png}
\caption{Grafici WebRTC Internals.}
\end{figure}
WebRTC Internals Exporter risolve questi problemi abilitando l'esportazione delle metriche verso un servizio chiamato Prometheus PushGateway.
Prometheus PushGateway è un servizio progettato per permettere a lavori effimeri e batch di esporre le proprie metriche a Prometheus. Poiché questi processi potrebbero non esistere abbastanza a lungo da essere interrogati direttamente, possono invece inviare le loro metriche al PushGateway, garantendo così la raccolta dei dati.
Tecnicamente l'estensione funziona in questo modo: viene precaricato un codice JavaScript che sovrascrive la classe globale `RTCPeerConnection'.
La nuova classe assegna un ID casuale a tutti gli oggetti peer connection creati e li memorizza all'interno dell'oggetto `webrtcInternalExporter'. L'utente può abilitare l'estensione per la scheda attualmente aperta facendo clic sull'icona dell'estensione e attivando la relativa checkbox.
Dopo l'attivazione, lo script di override inizierà a chiamare periodicamente il metodo `getStats' sugli oggetti peer connection creati. Tutte le metriche selezionate verranno inviate allo script in background, che le inoltrerà al servizio PushGateway configurato.
Il metodo `getStats' è un metodo standardizzato definito nell'API WebRTC che consente di ottenere le statistiche relative a una connessione peer-to-peer.\cite{WebRTCDebugging}
\
Questo progetto fa uso di una \textbf{versione altamente modificata} di WebRTC Internals Exporter, per adattarsi alle nostre esigenze di test e automazione. In particolare, abbiamo modificato le funzionalità:
\begin{itemize}
\item Abilitare l'esportazione delle metriche WebRTC verso un `endpoint' HTTP RESTful al posto di Prometheus PushGateway, con una formattazione dei dati personalizzata, ma sempre basata su JSON.
\item Aggiunta di metriche esportate aggiuntive rispetto a quelle di base fornite da `getStats'.
\item Abilitazione automatica dell'estensione all'avvio del browser, senza intervento manuale.
\item Supporto alla configurazione tramite variabili d'ambiente per semplificare l'integrazione con il nostro sistema di test.
\end{itemize}
\subsection{Hetzner Cloud e script CLI}
Hetzner Cloud è un servizio di cloud computing offerto da Hetzner Online GmbH, un provider di servizi di hosting e data center con sede in Germania. Hetzner Cloud offre una vasta gamma di servizi di cloud computing, tra cui server virtuali, storage, reti e servizi di sicurezza.
Sulla base di quello che è stato fatto da PeerTube, abbiamo deciso di utilizzare Hetzner Cloud per distribuire i nostri test su macchine virtuali in diverse regioni geografiche, in quanto, gli script per l'automazione dei test sono l'unica parte fornitaci da PeerTube nell'articolo originale. Anche qua abbiamo utilizzato delle versioni altamente modificate per adattarle alle nostre esigenze.
Gli script fanno utilizzo della CLI, `Command-line interface', di Hetzner Cloud, che consente di gestire le risorse cloud direttamente dalla riga di comando, e sono formati da 2 parti principali: uno script per la creazione delle macchine virtuali e uno script per l'avvio dei test.
Rispetto a quelli originali, li abbiamo modificati per far utilizzo delle varibili d'ambiente per la configurazione del nostro sistema di test, e per sostituire Selenium Grid, con l'immagine Docker monolitica standalone che abbiamo creato.
\section{Architettura del sistema di test}