🤙

Importer les données Matomo vers Google BigQuery, avec Google Cloud Function

Twitter LinkedIn Nos services

Importer les données Matomo vers Google BigQuery, avec Google Cloud Function

Dans cet article, nous verrons comment écrire une cloud function dans Google Cloud Platform (en Python), afin d’importer les données de Matomo vers Google Big Query
image

1. Contexte et objectifs

Pourquoi utiliser Matomo ?

Matomo est un outil d’analytics open source (une alternative à Google Analytics), qui a regagné en popularité récemment. En effet, Matomo peut bénéficier de l’exemption de consentement de la CNIL, ce qui permet de collecter des données d’audience, même en l’absence de consentement.

C’est donc un complément très utile à Google Analytics pour :

  • Connaître plus précisément les chiffres d’audience, de conversion, de pages vues etc..., par source / device, y compris pour les utilisateurs qui refusent les cookies.
  • Analyser la manière dont les internautes interagissent avec la bannière de consentement, dans le but de l’optimiser

Pour en savoir plus, quelques liens :

  • Le guide de configuration de Matomo ayant été validé par la CNIL pour bénéficier de l’exemption de consentement :
  • 💡D’ailleurs, Matomo est la solution d’analytics utilisée sur le site de la CNIL :

Pourquoi importer ses données dans Google Big Query ?

Matomo possède sa propre interface d’analyse des données, assez similaire à Google Analytics

Capture d’écran : interface de Matomo Analytics
Capture d’écran : interface de Matomo Analytics

Cependant, cela ne correspond pas à ce que nous souhaitons faire, puisque dans notre cas, nous allons vouloir exporter la donnée, pour la comparer avec d’autres sources de donnée, par exemple :

  • Google analytics
  • Le CRM (pour les leads) ou les données e-commerce (pour les ventes)
  • Les données issues de plate-forme d’Ads (Google Ads, FB Ads)
  • etc...

Et nous voulons bien entendu automatiser le process (le pipeline de donnée).

Pour faire cela, nous allons donc utiliser l’API de reporting de Matomo (pour appeler les données), via Google cloud function :

image

2. Dans Matomo

Nous allons donc utiliser l’API de reporting

  • Pour notre exemple, nous allons créer un “custom report” dans Matomo (avec les dimensions et les métriques souhaitées), que nous allons appeler via l’API.
Capture d’écran : back office de Matomo
Capture d’écran : back office de Matomo
  • Il faut en profiter pour relever l’ID du site et l’ID du custom report. On le trouve facilement dans l’URL de la page du rapport : https://monsite.matomo.cloud/index.php?module=CoreHome&action=index&idSite=1&period=day&date=yesterday#?idSite=1&period=day&date=yesterday&segment=&category=CustomReports_CustomReports&subcategory=1

Il faut également créer le token pour l’API (dans Admin → Sécurité → Create token) qu’il faudra mettre dans ‘MyToken’

image

3. Dans Google Cloud platform

Créer un "service account" dans GCP

image

  • Créer le compte, et lui donner un rôle qui permette l'écriture et la création de tables dans BigQuery (Admin)
  • Créer une clé pour ce compte (JSON). Cette clé est téléchargée sur votre ordinateur. Nous en aurons besoin par la suite.
image
  • Créer un dataset et une table

Le code dans Google Cloud function (Python)

Création de la coud function

image

Le code est ci-dessous

import json
import requests
from datetime import datetime
from dateutil import parser
from google.cloud import bigquery
from google.oauth2 import service_account


### On appelle les données de config

headers = {'Content-Type': 'application/json'}
TOK = 'MyToken'

CRED_PATH = "applibs/google_cred.json"
LOCATION = "europe-west2"
CREDENTIALS = service_account.Credentials.from_service_account_file(CRED_PATH)


def get_project_id():
    with open(CRED_PATH) as f:
        data = json.load(f)
        return data['project_id']


PROJECT_ID = get_project_id()
CLIENT = bigquery.Client(project=PROJECT_ID, credentials=CREDENTIALS)

### Fonction qui va nous servir à uploader les données dans BigQUery
def save_data(json_data: json):
    try:
        dataset_name = 'my_dataset'
        table_id = "my_table_name"

        dataset_id = f'{PROJECT_ID}.{dataset_name}'
        dataset = bigquery.Dataset(dataset_id)
        dataset.location = LOCATION
        table_ref = dataset.table(table_id)
        table = CLIENT.get_table(table_ref)

        errors = CLIENT.insert_rows(table, json_data)
        print(errors)
        if not errors:
            return "success"
        else:
            error = errors[0]["errors"]
            message = error[0]["message"]
            return message

    except Exception as error:
        return f"Data saving error. Details: {error}"


### On prépare la requête API
def extract():
    params = (('token_auth', TOK), \
              ('apiAction', 'getCustomReport'),\
              ('language', 'en'),\
              ('apiModule', 'CustomReports'),
              ('date', 'yesterday'),
              ('idCustomReport', 1),
              ('format', 'JSON'))
    r = requests.get('https://mydomain.matomo.cloud/?module=API&method=API.getProcessedReport&idSite=1&period=day&flat=1', params=params,headers=headers,verify = False)
    j = json.loads(r.text)
    return j



def cloud_handler(request=None):
    """
        :param request:
        :return: success/error message
    """


    try:
        print(f"Start processing at: {datetime.now().isoformat()}")

### Extract data
        request_data = extract()
        data = request_data['reportData']
        print(data)
        date = parser.parse(request_data['prettyDate']).strftime("%Y-%m-%d")
        json_data = []

        for i in range(len(data)):
            json_data.append(
                {
                    "date": date,
                    "label": data[i]['label'],
                    "visits": data[i]['nb_visits'],
                    "goal_1_conversion": data[i]['goal_1_conversion'],
                    "goal_2_conversion": data[i]['goal_2_conversion'],
                    "goal_3_conversion": data[i]['goal_3_conversion'],
                    "goal_4_conversion": data[i]['goal_4_conversion'],
                    "goal_5_conversion": data[i]['goal_5_conversion'],
                    "goal_6_conversion": data[i]['goal_6_conversion'],
                    "goal_7_conversion": data[i]['goal_7_conversion'],
                    "goal_11_conversion": data[i]['goal_11_conversion']
                }
            )
        print(json_data)
  
### store data to BigQuery
        res = save_data(json_data)
    
        print(res)
        print(f"End processing at: {datetime.now().isoformat()}")

        if res == "success":
            return {"message": "Data saved successfully."}, 200

        print("error: " + res)
        return {"message": res}, 400

    except Exception as error_info:
        print(error_info)
        return {"message": error_info}, 400

Et le fichier “requirements.txt :

google-api-core==1.17.0
google-api-python-client==1.7.11
google-auth==1.14.1
google-auth-httplib2==0.0.3
google-cloud-bigquery==1.24.0
google-cloud-core==1.1.0
google-cloud-firestore==1.6.0
google-cloud-storage==1.23.0
google-resumable-media==0.5.0
googleapis-common-protos==1.6.0
python-dateutil==2.7.5
Code à ajouter dans le fichier requirements.txt

Ajouter un fichier ayant le chemin applibs/google_cred.json et y copier le contenu du fichier de la clé créée pour le service account

image

Définir le point d’entrée en tant que cloud_handler

image

Dans l’interface de cloud function :

image

image

Déclencher la fonction périodiquement (tous les jours)

Pour cela, il suffit d’aller dans cloud scheduler :

image

4. Admirer le résultat

Après avoir manuellement créé le dataset et la table avec les champs définis dans la cloud function, et exécuté la fonction, la donnée est maintenant dans Google Big Query :

image

Et il ne vous reste plus qu’à brancher un outil de DataViz dessus

image

Envie de déployer Matomo ? 🚀 Contactez nous et nous nous ferons un plaisir de revenir vers vous. Contact →

Tous les articles concernant Google BigQuery