La web analytics è un componente davvero importante per ogni strategia dati (vedi il mio articolo dedicato), perché ti permette di conoscere meglio i tuoi clienti e gli utenti del tuo sito. Tuttavia integrare sistemi di web analytics, come Google Analytics con altre piattaforme utilizzate per l’analisi quali Azure, spesso non è cosa semplice.

In questo articolo, dal taglio più tecnico, voglio raccontare come possono complicarsi le cose quando si esce dallo “standard” (sempre che ne esista uno!).

Di recente mi è capitato di dover realizzare un prototipo per integrare due mondi dell’analisi dati: Google e Microsoft. Ovvero: un sito WordPress la cui analytics è gestita con Google Analytics 4 (tramite Google Tag Manager) e il cloud Microsoft Azure dove si svolge tutta la parte di analisi dati e business intelligence.

Perché qualcuno vorrebbe integrare Azure con Google Analytics?

Primo: Google Analytics 4 ha una retention dei dati massima di 14 mesi, quindi se si vuole fare una analisi che vada più in là nel tempo è necessario trasferire i dati su un database esterno, o meglio su un data warehouse. Lo “standard” è utilizzare Google Cloud Platform con Big Query. Esiste una connessione già pronta all’uso nella proprietà di Google Analytics 4, si imposta un service account dedicato, e il gioco è fatto.

Ma, secondo motivo, molte aziende hanno già tutta la parte di analisi sviluppata su altri cloud, ad esempio Azure. Hanno i carichi attivi su Synapse, o su AzureSQL in configurazione HTAP, cluster Spark rodati e così via.

E qui le cose si complicano

Si complicano perché Google Tag Manager ha già una serie di tag (diciamo, per semplicità, degli script che vengono iniettati nel sito internet) che permettono di integrare piattaforme di analisi diverse. Tra cui HotJar, Linkedin, ecc… Ma non si trova niente (almeno per ora) per connettere Azure.

Una possibile soluzione

Ciò premesso esistono diverse soluzioni per integrare Azure con Google Analytics utilizzando Google Tag Manager. Tag Manager infatti permette di iniettare del codice javascript personalizzato nel sito creando un tag di tipo “custom HTML”. Pericoloso. Potente. Affascinante.

Inoltre bisogna tenere conto che Google Analytics 4 (che sia integrato tramite Google Tag Manager o meno) per funzionare crea una variabile a livello di pagina chiamata dataLayer, che contiene tutti gli eventi.

Ed ecco l’idea per realizzare un prototipo: iniettare uno script javascript personalizzato eseguito subito dopo l’invio dei dati a Google Analytics che riprenda il dataLayer e lo inoltri al cloud Azure.

Possibili alternative?

Sinceramente, vedo questa soluzione più adatta ad un test perché tutto questo avviene sul browser: si duplicano richieste HTTP e alcune informazioni importanti di autenticazione sono presenti nella header della richiesta (benché si usi solo il protocollo HTTPS con buona sicurezza della cifratura).

Tuttavia esiste una ulteriore evoluzione di Google Tag Manager chiamata Google Tag Manager “server side”. In pratica è un server proxy che serve ad eseguire gli script che in modalità “classica” verrebbero eseguiti sul browser. E come puoi immaginare garantisce più sicurezza, controllo sui dati, e le richieste HTTP che partono dal browser si riducono notevolmente.

Però in questo caso non avevo a disposizione un container per installare Google Tag Manager server side, ed avevo la necessità di concentrarmi sull’architettura di Azure.

Altra alternativa potrebbe essere quella di integrare direttamente Google Big Query con Azure. Ma questo richiede strumenti esterni (a pagamento), non è in near-realtime, e i dati arrivano su Big Query dopo essere transitati da Google Analytics.

Ancora un altro approccio potrebbe essere quello di usare Big Query e tramite una pipeline spostare i dati su uno storage in formato compresso come parquet o avro. Ma nuovamente, aggiunge complessità al mio caso d’uso.

L’architettura progettata per integrare Azure con Google Analytics

Quindi in definitiva ho optato per questa soluzione:

  • database CosmosDB NoSQL adatto a storicizzare gli eventi destrutturati di interazione del sito
  • Azure Event Hubs come sistema di trasporto ad alte prestazioni per ricevere gli eventi dal sito tramite chiamata REST (la gestione è integrata in Event Hubs)
  • Azure Stream Analytics per trasferire i dati da Event Hubs a CosmosDB
  • Script javascript iniettato sul sito tramite Google Tag Manager per inviare i dati alla API di Event Hubs

Qualcuno potrebbe dire che CosmosDB prevede l’inserimento diretto di dati tramite REST API, ma volevo lasciarmi la flessibilità di poter decidere cosa fare con i dati ricevuti PRIMA di inserirli su Cosmos DB, e volevo mantenere la possibilità di dividere il flusso dati in altri canali (ad esempio Power BI per analisi real time dei dati. Una sorta di architettura lambda per la data engineering).

Il primo passo: creare il database CosmosDB

Su Azure creiamo un database Cosmos NoSQL come nell’immagine sotto. Da notare che per scopi di test è possibile selezionare il free tier che permette di utilizzare CosmosDB gratuitamente all’interno di certi range di risorse. Inoltre, quando si sceglie la zona geografica, è bene ricordare se si è soggetti al GDPR o meno.

Per praticità mi sono creato un resource group dedicato per raccogliere tutto il necessario in un unico contenitore.

Una volta generate la risorsa ho creato il database website-analytics ed un container chiamato “events” che sarà il contenitore di tutto il dataLayer “rubato” a Google Analytics.

Tramite il tasto in alto “New Container” è possibile creare il nuovo database, il container e la chiave di partizionamento dei dati come visibile nel pane a destra della pagina.

Fatto questo siamo pronti pre creare l’Event Hubs che ci servirà come entry point dei dati in Azure.

Il secondo passo per integrare Azure con Google Analytics: istanziare la risorsa Event Hubs

Dal menu “Create resource” scegliamo Event Hubs. Da questo sarà possibile creare il namespace dell’hub che creeremo in seguito. Per mantenere bassi i costi possiamo scegliere il tier basic, che però non permette di salvare i messaggi in arrivo sullo storage.

Al momento infatti non mi interessa avere questa opportunità, ma se servisse, basta eseguire l’upgrade.

Una volta creato il namespace che io ho chiamato “danieleperugini-g4-integration-eventhubs” dobbiamo creare l’event hub vero e proprio. Io l’ho chiamato per praticità “webevents”.

E’ possibile creare l’event hub cliccando sul menu Event Hubs a sinistra

Creazione della policy di accesso: necessaria per integrare Azure con Google Analytics

Una volta creato l’event hub si deve creare una policy di accesso per permettere di scrivervi messaggi. Quindi entrando nell’Event Hub appena creato, sulla sinistra premiamo su “Shared Access Policies” per creare la policy che chiamiamo “GTM” con diritti di scrittura.

Questa policy è necessaria perché servirà per creare una firma da utilizzare nello script javascript da iniettare sul sito. Senza quella, Event Hubs non accetterà le richieste.

Creazione del processo di integrazione tra Event Hubs e Cosmos DB

Quello che faremo adesso sarà realizzare un processo che prenda in ingresso i dati provenienti da Event Hubs e li scriva su Cosmos DB. Per fare clicchiamo sul menu “Process Data” sulla sinistra. Questo ci permetterà di scegliere diverse integrazioni possibili, tra cui “Materialize data in Cosmos DB”. Cliccando sul tasto di creazione l’effetto sarà la creazione di un cluster Stream Analytics e di un suo Job che ci permetterà di eseguire questa operazione.

Seguendo il wizard saremo portati in un’area di lavoro simile alla foto sottostante. Io ho modificato un po’ gli step per velocizzare il tutto. Ma fondamentalmente deve essere presente l’acquisizione e l’output. In mezzo è possibile trasformare i dati a piacimento.

L’area di lavoro ti chiederà di confermare le connessioni, il formato dati ed altro. Alla fine premi il tasto “Start” in alto per pubblicare il job ed avviarlo.

Una volta avviato il Job, rimarrà in ascolto su Event Hubs di dati in ingresso sull’hub creato e li scriverà su CosmosDB. Nella fase di definizione delle connessioni ovviamente sarà necessario definire quale DB utilizzare e quale container. Se tutto è andato a buon fine, potrai ritrovare il Job creato andando nella home, cercando le risorse Stream Analytics, come nella figura sotto.

Il terzo passo: lo script javascript da iniettare sul sito

Come detto all’inizio, ho a disposizione Google Tag Manager e per testare la soluzione voglio realizzare un tag da eseguire dopo che è stato inviato il dataLayer a Google Analytics. Per fare questo è necessario accedere a Google Tag Manager, nella sezione tag, e creare un nuovo tag di tipo Custom HTML che conterrà lo script.

Il contenuto sarà qualcosa del tipo:

<script>
  
  var strBody = JSON.stringify(window.dataLayer);
  console.log(strBody);
  var accessKey = "SharedAccessSignature <shared access signature>";
    
  var evtHubUrl = "https://<namespace hub>.servicebus.windows.net/<nome hub>/messages?timeout=60&api-version=2014-01";

  fetch(evtHubUrl, {
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Authorization': accessKey,
        'Content-Length': strBody.length.toString(),
    },
    body: strBody
  })
  .then(function(response) {
    console.log(response);   
  });
  
</script>

Come si nota bisogna prestare attenzione all’url, che comprenda la versione API altrimenti Event Hubs non prenderà nemmeno in considerazione la richiesta.

Inoltre, cosa importante, per valorizzare il parametro accessKey, sarà necessario rifarsi alla policy di accesso di cui abbiamo parlato prima nella creazione dell’Event Hub. Microsoft mette a disposizione una guida per generarla qui.

Per essere sicuri che sia eseguito solo dopo che il tag di Google Analytics ha inviato i propri dati (utile ad esempio se si è impostata una condizione relativa al Cookie Consent) si deve modificare il tag di configurazione di Google Analytics e nella sezione “Tag sequencing” impostare il tag che abbiamo creato per l’integrazione con Event Hubs per essere eseguito dopo quello di Google Analytics. Vedi immagine sotto.

Fatto questo, tramite il preview di Google Tag Manager e il Tag Assistan sarà possibile vedere i tag eseguiti, sarà possibile vedere le richieste partire dal sito tramite gli strumenti di sviluppo del browser, e vedere i dati in arrivo su Cosmos DB.

I Tags Fired sono i tag lanciati tra cui quello creato (nel mio caso Azure Event Hub Tag)

Tramite Cosmos Data Explorer è possibile navigare gli eventi

E dopo?

Le opportunità adesso sono infinite: è possibile collegare Azure Synapse tramite il connettore dedicato, oppure PowerBI, o ancora scatenare della function quando i dati cambiano. Ed infine integrare i dati con quelli già esistenti.

Come vedi quindi, il cloud è uno strumento potentissimo quando si parla di analisi dei dati. E anche se sembra complicato, in relativamente poco tempo è possibile metter su dei prototipi funzionanti.

Ma se vuoi approfondire l’argomento, o hai un progetto che ti sta a cuore, fissa con me una consulenza gratuita e parleremo insieme di quelli che sono i tuoi obiettivi, di come i dati possono dare una forte spinta al loro raggiungimento, e di come potresti impostare una strategia dati confezionata per la tua attività.

Alla prossima informazione!