Dashboard en temps réel avec Power BI et Azure Stream Analytics

Durant les Techdays 2015, j’ai présenté un tableau de bord Power BI se mettant à jour en temps réel. Suite à cette présentation, j’ai eu pas mal de questions sur le sujet, et notamment des questions sur la mise en place d’un tel Dashboard.

En fait, il y a 2 manières de faire :

  1. Soit en utilisant l’API de Power BI : https://msdn.microsoft.com/en-us/library/dn877544
  2. Soit en s’appuyant sur l’architecture lambda et plus précisément sur Azure Stream Analytics 

Dans cet article, nous allons traiter du point numéro 2.

Afin d’avoir une vue d’ensemble de l’architecture lambda, je vais reprendre le slide que l’on a joué durant la session zomBIe des Techdays :

image 

Le sujet d’aujourd’hui est donc la branche temps réel de l’architecture lambda et nous allons mettre en œuvre les composants suivants :

  • Un Event Hub
  • Stream Analytics avec une sortie vers Power BI (bientôt disponible, inscription à la preview : https://dev.powerbi.com)
  • Le nouveau portail Power BI

J’utiliserai aussi un petit programme en c# pour simuler l’envoi d’information en temps réel.

Pré requis

Pour refaire l’exemple de cet article il vous faut :

  • Un compte Azure
  • Un accès au portail Power BI https://app.powerbi.com
  • Si besoin Définir le compte permettant de se connecter au portail Power BI comme coadministrateur de votre abonnement Azure.

J’utilise le même compte pour me connecter à mon portail Azure (compte administrateur) et au portail Power BI.

Event Hub

Présentation

L’Event Hub, va être le point d’entrée des signaux dans notre architecture lambda. Event hub permet l’ingestion d’un grand nombre d’information provenant d’une grande variété d’objets. 1 000 000 d’objets peuvent publier sur un Event Hub en utilisant les protocoles HTTPS ou AMQP. Un Event Hub peut ingérer jusqu’à un million de messages par seconde.

image

Création d’un Event Hub

Pour paramétrer un Event HUB, connectez-vous au portail Azure.

Cliquez sur le bouton “ + ” en bas à gauche de l’écran, puis sélectionnez “Services d’application”, “Service Bus”, puis “Hub d’évènements”.

image 

Puis cliquez sur “Création personnalisée”

image

Dans la fenêtre “Créer un hub d’évènements”, renseignez les différents champs. Dans la liste déroulante “Espace de noms” sélectionnez “Créer un espace de noms”. Cela permet de faire apparaître le champ “Nom de l’espace de noms”. Dans ce champ, renseignez l’espace de nom de votre Event Hub. Ci-dessous une copie d’écran :

image

Passez à l’étape numéro 2 en cliquant sur la flèche en bas à droite.  Définissez le nombre de partition (compris entre 8 et 32), ainsi que le nombre de jour de rétention des messages. Pour plus d’information, vous pouvez consulter cet article : https://msdn.microsoft.com/fr-fr/library/azure/dn836025.aspx

Validez la création de l’Event Hub en cliquant sur le bouton de validation en bas à droite de la fenêtre.

image

Au bout de quelques secondes, votre Event Hub sera créé.

image

Paramétrage d’un Event Hub

Nous allons paramétrer notre Event Hub. Cliquez sur le “nom de l’espace de noms” que l’on vient de créer (dans cet exemple “FranckMercier-ns”), puis cliquez sur “Hubs d’évènements”. Dans la colonne “Nom”, cliquez sur votre Event Hub (ici “franckmercier”)

image

Dans la fenêtre de l’Event Hub, cliquez sur “Configurer”. Sous la section “Stratégies d’accès partagé”, définissez les stratégies d’accès à votre Event Hub. Ici, je vais créer une stratégie dont le nom est “FranmerPolicy” et dont l’autorisation est “Gérer”.

Cliquez sur “Enregistrer

image

En bas de la fenêtre, apparaît alors les clés d’accès.

image

Notre Event hub est prêt. Nous allons maintenant créer et paramétrer un service pour consommer les évènements sortant de notre Event Hub. Ce service est Azure Stream Analytics.

Azure Stream Analytics

Stream Analytics est un moteur de traitement d'événements qui permet de récupérer des informations à partir de tous types d'appareils. Stream Analytics inclut l'intégration immédiate aux concentrateurs d'événements (Event Hub) afin d'ingérer des millions d'événements par seconde. Ensemble, les concentrateurs d'événements et Stream Analytics vous permettent de traiter de gros volumes de données et de prendre des décisions en temps réel.

Création d’un service Azure Stream Analytics

A partir du portail Azure, cliquez sur le bouton “ + ” en bas à gauche de la fenêtre. Sélectionnez “Services de données”, “Stream Analytics”, “Création Rapide”. Renseignez les différents champs, puis cliquez sur “Créer une tâche Stream Analytics”.

image

Au bout de quelques secondes, mon service Azure Stream Analytics a bien été créé :

image

Paramétrage du Service Azure Stream Analytics

Maintenant que notre service Azure Stream Analytics a été créé, nous allons le paramétrer pour recevoir les informations provenant de notre Event Hub (puis éventuellement les transformer), pour les envoyer ensuite vers un portail Power BI.

Paramétrage d’une entrée

Cliquez sur le nom de votre service Azure Stream Analytics (“franmer” dans cet exemple). Puis cliquez sur “Entrées”. Cliquez sur “Ajouter une entrée”.

image

Azure Stream Analytics a la possibilité de traiter plusieurs entrées. Ces entrées sont de 2 types :

  • Une entrée de flux de données (Event Hub)
  • Une entrée de données de référence (afin d’enrichir un flux de données, avec des données statiques (provenant d’un fichier JSON par exemple))

Pour cet exemple, nous allons choisir l’entrée “Flux de données”. Cliquez sur la flèche en bas à droite.

image

Nous allons sélectionnez “Concentrateur d’évènements” (Event Hub). Cliquez sur la flèche en bas à droite.

image

Dans le champ Alias d’entrée, renseignez le nom que vous souhaitez donner à votre entrée dans le service Azure Stream Analytics (ici, j’ai donné le nom “Input”)

Dans la liste déroulante “Abonnement”, il y a une option intéressante qui vous permet d’aller connecter Azure Steam Analytics sur un Event Hub se trouvant dans un autre abonnement Azure. Pour cette démonstration, nous allons sélectionner “Utiliser le concentrateur d’évènements de l’abonnement actuel”.

image

Ci-dessous une copie d’écran de mon paramétrage. Sélectionnez les informations liées à votre Event Hub. Dans le champ “Nom de la stratégie de concentrateur d’évènements”, faîtes attention à bien choisir la stratégie que l’on a défini lors du paramétrage de l’Event Hub (“FranmerPolicy” dans mon exemple).

Passez à l’étape numéro 4.

image

Dans la dernière étape nous allons choisir les paramètres de sérialisation. Nous avons le choix entre “Avro”, “CSV” ou “JSON”. Nous allons sélectionner JSON, car le programme que je vais utiliser envoi des informations dans le format JSON. Cliquez sur la coche en bas à droite pour terminer le paramétrage de l’entrée.

image

Après validation, vous devez obtenir ce genre de résultat.

image

 

Paramétrage d’une requête

Maintenant que nous avons défini une entrée, nous allons définir une requête pour récupérer les données. Cette requête peut être un simple “select” ou une requête plus complexe permettant de transformer les données ou réaliser des opérations sur des fenêtres de temps (faire une moyenne toutes les 5 secondes).

Cliquez sur “Requête” pour définir la requête de traitement des données. Notez que le langage utilisé est très proche du T-SQL. Pour cet exemple, je réalise juste un sélect de tous les champs qui sont présents dans l’entrée de mon service :

SELECT MyTime, SucetteID, Produit, Vente, TotalVente, objectif FROM Input

Cliquez sur “Enregistrer”, et confirmez l’enregistrement.

image

Paramétrage de la sortie

Nous allons maintenant définir la sortie de notre service vers un portail Power BI. (Il se peut que cette fonctionnalité ne soit pas encore disponible au moment où vous lirez cet article, mais cela ne saurait tarder à arriver).

Cliquez sur “Sorties”, puis sur “Ajouter une sortie”.

image

La liste des sorties disponibles s’affiche à l’écran.

Avant d’aller plus loin, ouvrez dans un autre onglet de voter navigateur Web votre portail Power BI via l’adresse https://app.powerbi.com. Connectez-vous avec le même compte que celui que vous utilisez actuellement pour paramétrer Azure Stream Analytics. 5il se peut que ce comportement évolue, mais c’est celui que j’ai actuellement avec la version preview).

Sélectionnez “Power BI” puis passez à l’étape d’après.

image

Sélectionnez “Autorisez maintenant”.

image

La fenêtre suivante va apparaître quelques instants :

image

Définissez dans la fenêtre “Ajouter une sortie Microsoft Power BI” le nom de la base de données ainsi que le nom de la table. Si la table existe déjà côté Power BI, elle sera remplacée par la nouvelle. Validez vos modifications.

image

Vous devez obtenir une nouvelle sortie pour votre service Azure Stream Analytics.

Il ne nous reste plus qu’à démarrer le service. En bas de la page, cliquez sur le bouton démarrer.

image

Sélectionnez “Heure de démarrage de la tâche” puis validez.

image

 

Simuler l’injection de données

Bon tout ça c’est bien beau, mais maintenant, comment on envoie les données.

Pour ce faire, j’ai utilisé un petit programme en c# qui permet de simuler l’envoi de données, mais surtout il permet de voir comment se connecter à un Event hub pour justement lui envoyer les données.

Dans un premier temps, dans mon fichier “Program.cs”, j’ai le code suivant. Dans la partie en rouge, il faut remplacer les valeurs par celle de votre Event Hub.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Messaging;
using Newtonsoft.Json;
using Microsoft.ServiceBus;

namespace Sucettes
{
    class Program
    {
        static void Main(string[] args)
        {
           //Définition des variables
           //Variables pour l'event hub

           string eventHubName = FranckMercier"";
string eventHubNamespace = "FranckMercier-ns";
string sharedAccessPolicyName = "FranmerPolicy";
string sharedAccessPolicyKey = "Y++SUDhybyDVIKXfwN+FZUIVSxK7vjOaFQphW5v3tsA=";           

           Random MyRandom = new Random();
          

//Initialisation du serice bus
           var settings = new MessagingFactorySettings()
           {
               TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sharedAccessPolicyName, sharedAccessPolicyKey),
               TransportType = TransportType.Amqp
           };

           var factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", eventHubNamespace, ""), settings);
           EventHubClient client = factory.CreateEventHubClient(eventHubName);

           List<Task> tasks = new List<Task>();
          

//Création d'une variable liste pour stocker mes objets ventes
            List<Ventes> MyVentes = new List<Ventes>();

            List<string> ListeSucettes = new List<string>();
            ListeSucettes.Add("Tourbillon");
            ListeSucettes.Add("Festive");
            ListeSucettes.Add("Canne");
            ListeSucettes.Add("Love");
            ListeSucettes.Add("Sensuelle");

            for (int i = 0; i < ListeSucettes.Count; i++)
            {
                MyVentes.Add(new Ventes(i, DateTime.UtcNow, ListeSucettes[i], 0,0,2000000));
            }

           

            while (!Console.KeyAvailable)
            {
                for (int j = 0; j < 5; j++)
                {

                    MyVentes[j].Vente = MyRandom.Next(0, 9);
                    MyVentes[j].MyTime = DateTime.UtcNow;
                    MyVentes[j].TotalVente = MyVentes[j].TotalVente + MyVentes[j].Vente;
                    var Vente = MyVentes[j];                                            

                    // Serialize to JSON
                    var serializedString = JsonConvert.SerializeObject(Vente);
                    Console.WriteLine(serializedString);
                    EventData data = new EventData(Encoding.UTF8.GetBytes(serializedString))
                    {
                        PartitionKey = Vente.SucetteID.ToString()
                    };

                    // Send the metric to Event Hub
                    tasks.Add(client.SendAsync(data));

                }
                Thread.Sleep(1500);
            }

        }
    }
}

 

Ce programme appelle une classe Vente.cs qui définit la structure de mes ventes :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sucettes
{

    public  class Ventes
    {

       public DateTime MyTime { get; set; }
       public int SucetteID { get; set; }
       public string Produit { get; set; }
       public int Vente { get; set; }
       public int TotalVente { get; set; }
       public int objectif { get; set; }

       public Ventes(int mId, DateTime mDate, string mProduit, int mVente,int mTotalVente, int mObjectif)
        {
            this.Produit = mProduit;
            this.Vente = mVente;          
            this.SucetteID = mId;
            this.MyTime = mDate;
            this.TotalVente = mTotalVente;
            this.objectif = mObjectif;
        }

    }
}

Lors de l’exécution du programme, voici un exemple des données envoyées à l’Event Hub :

image

Le code se trouve ici : https://1drv.ms/1Erx7hf 

 

Utilisation de l’application

Dans le dossier, il y a aussi un fichier IoT.zip qui est en fait directement l’application avec un fichier de configuration.

Une fois le fichier IoT.zip récupéré, décompressez-le. Vous devez vous retrouver avec les fichiers suivants :

image

Localisez le fichier “Test.exe.config” , puis ouvrez le avec un éditeur de texte. En haut du fichier, renseignez les informations de votre Event Hub.

image

Sauvegardez vos modifications. puis double-cliquez sur le fichier “Test.exe” pour envoyer les évènements à votre Event Hub.

image

Exécutez le programme “Test.exe” pour vérifier le bon fonctionnement.

image

 

 

Récupérer les données dans le portail Power BI

Maintenant, connectez-vous au portail Power BI via l’adresse https://app.powerbi.com.

Dans le volet de gauche, dans la partie “DataSet”, une nouvelle source de données, “Sucettes” vient d’apparaître. Elle est reconnaissable avec le petit astérix vert.

image

 

A droite de la source de données, cliquez sur les 3 petits points puis sur “Explore”.

image

 

Vous arrivez donc dans la partie de création de rapports. Power BI vous permet donc, à partir d’une source de données, et en mode Web, de créer vos rapports en sélectionnant les différentes dimensions et mesures de votre source de données. Dans l’exemple ci-dessous, j’ai créé une jauge représentant les ventes par rapport à un objectif.

image

Une fois la gauge créée, je peux l’épingler sur mon Dashboard Ventes (le Dashboard Ventes est celui sélectionné pour recevoir les différents éléments du rapport).

image

Sauvegardez votre rapport en cliquant sur “Save”, puis cliquez sur le nom du Dashboard. Ici, le Dashboard utilisé est le Dashboard “Ventes”.

Comme le rapport est “branché” sur une source de données alimentée en temps réel via Azure Stream Analytics, les données de la gauge sont mis à jour en temps réel. Sauf que là pour le voir dans un article blog, ce n’est pas terrible :) !!

image

Alors j’ai fait une petite vidéo :)

https://www.youtube.com/watch?v=3mRudSv1IjY&feature=youtu.be

 

Surveillance du service Azure Stream Analytics

Le service Azure Stream Analytics, fournit aussi un tableau de bord de supervision ainsi que la possibilité de pouvoir consulter les journaux d’évènements liés au service. Ce qui peut être bien utile pour comprendre ce qui se passe (surtout quand ça ne fonctionne pas :)).

Dans votre service Azure Stream Analytics, cliquez sur “Tableau de bord” afin de voir les évènements liés à votre service (vous pouvez aussi cliquer sur “Surveiller”, juste à côté de “Tableau de bord”).

Dans le tableau de bord, vous avez par défaut les indicateurs courants de supervision du service ainsi qu’un accès au journal des opérations. Cliquez sur le lien “journaux des opérations”, pour ouvrir la fenêtre de gestion des services.

image

Dans la fenêtre “Services de gestion”, vous pouvez voir les évènements liés à votre service Azure Stream Analytics.

image

Vous avez maintenant toutes les billes pour réaliser de beaux rapports Power BI avec des sources de données temps réel :) !!

Franck Mercier

Sessions de formation gratuites :

Pour tester Windows Server 2012, Windows 8, SQL Server 2012 et SQL Server 2014 CTP2, vous pouvez télécharger gratuitement la version d’évaluation disponible sous la forme :

Windows Server 2012 :

SQL Server 2012 :

Evaluation SQL Server 2014 CTP2 :

Evaluation Power BI :

Testez Azure gratuitement pendant un mois :