Power BI Dashboards : connectez vos Azure Stream Analytics

Bonjour à tous,

Aujourd’hui je souhaite vous parler d’une fonctionnalité récemment ajoutée (et présentée au Ignite) concernant un lien possible entre Power BI et Azure Stream Analytics.

Il s’agit du premier billet de blog d’une série de deux ou trois, qui seront dédiés à Power BI, ses nouveautés, son API, … Cela se fait à la suite de mon premier billet qui présentait le futur Power BI, sur le blog du yOS Tour, et de la présentation sur Power BI que nous avons faite avec Patrick Guimonet lors du yOS Day de Montpellier, et que nous rejouerons, dans une version améliorée, à la rebuild de Nantes en octobre (un événement à ne rater sous un prétexte, mode pub off) !

Le but de mixer Power BI et Azure Stream Analytics (et un hub d’événement dans Azure) est facilement compréhensible : visualiser en temps réel, dans une page web, des rapports sur de grandes masses de données. Le résultat est vraiment bluffant, puisque dans une page web, en direct, sans rafraîchissement, vos graphiques évoluent avec l’afflux de données qui leur est envoyé. J’adore !

Et le meilleur, c’est qu’avec Azure, c’est super facile à faire !

Le schéma théorique :
Fournisseur de données => Azure Web Job => Hub d’événements => Stream analytics => Power BI Dashboards
Vu de loin, ça fait beaucoup d’intermédiaire, mais c’est aussi le principe du micro service que Microsoft met en avant.
En gros, l’Azure Web Job (en continuous) va récupérer vos données, les déverser dans un service bus qui héberge le hub d’événements. Le stream analytics, branché sur le hub d’événements, envoi toutes les données dans Power BI Dashboards.
Gros avantage : vous pouvez brancher autant d’Azure Web Jobs que vous voulez sur votre Hub d’événements, tant que vous déversez des données issues formatées de manière similaires, pour que le stream analytics puisse les mixer ensembles, et les envoyer à Power BI.
Notez que je n’ai pas essayé de brancher plusieurs hub d’événements sur un même stream analytics, mais ça doit être possible… A tester !

Mode d’emploi :

First things first, créez votre hub d’événements. Pour cela rendez-vous dans le portail Azure. On restera sur l’ancienne version du portail : la preview ne prend pas encore en charge les Stream Analytics, mais bientôt, I hope !
Appuyez sur « Nouveau » et naviguez comme sur le screenshot ci-dessous.Capture d’écran 2015-06-21 à 17.32.23

Sélectionnez une « Création rapide », vos préférences pour la localisation, … et vous pouvez créez le hub. Cela met quelques secondes / minutes, selon l’état de charge des data centers de Microsoft.Capture d’écran 2015-06-21 à 17.35.48

Paramétrez votre Hub d’événements, en vous rendant sur votre Service Bus, cliquez sur Hubs d’événements dans la barre de lien supérieure, et cliquez sur le nom du Hub que vous venez de créer. Le tableau de bord du Hub s’affiche alors, et dans la barre de lien supérieure, cliquez sur « Groupes de consommateurs ».
Cliquez sur le bouton « + » en bas de la page, pour créer un nouveau groupe. Je l’ai nommé « My-Custom-Dev ».Capture d’écran 2015-06-21 à 17.46.06

Ce paramétrage est nécessaire pour brancher votre Stream Analytics sur le Hub.

Enfin, cliquez sur « Configurer », identifiez la rubrique « Stratégie d’accès partagé » et créez une nouvelle stratégie, attribuant les trois niveaux de droit, comme ci-dessous.Capture d’écran 2015-06-21 à 17.49.00

Cliquez sur « Enregistrer » en bas de la page, et vous notez qu’apparaissent les clés permettant d’exploiter dans votre code la stratégie de que vous venez de créer. Nous allons y revenir.

2. Créez le stream Analytics
C’est reparti pour un tour ! Cliquez sur « Nouveau » et suivez le screenshot ci-dessous. Notez que vous aurez besoin d’un compte de stockage.

Capture d’écran 2015-06-21 à 17.38.07

Une fois créé, le stream analytics mérite d’être configuré. C’est un outil assez simple, on lui indique une source de données, une requête et une sortie. Ouvrez donc le stream analytics en cliquant sur son nom, et cliquez sur « Entrées » pour stipuler la source de données.
Comme c’est vide, vous pouvez cliquer sur « Ajouter une entrée ».Capture d’écran 2015-06-21 à 17.40.39

Dans la pop up qui s’ouvre, sélectionnez « Flux de données », Suivant, « Hub d’événements », Suivant. Saisissez un alias d’entrée, il s’agit d’indiquer un friendly name. N’oubliez pas également de ne pas laisser « Default » en groupe de consommateur, mais de bien utiliser celui que vous avez précédemment créé.

Capture d’écran 2015-06-21 à 17.52.00

Arrivent ensuite les paramètres de sérialization, il s’agit du format dans lequel Stream Analytics va recevoir les données. Pour cet exemple, on laissera JSON et UTF-8.

Dans la barre de lien supérieure, cliquez sur « Requête ». Il s’agit d’indiquer les éléments que vous souhaitez récupérer de votre source. Pour le test, saisissez Select * FROM [AliasDeVotreEntree]
On note que la syntaxe est très proche du language des requêtes SQL. Cette fonction peut vous permettre de filtrer les données qui ne vous intéresse pas pour votre reporting. La requête que j’ai présenté ci-dessus ne filtre absolument pas. N’oubliez pas d’enregistrer !

Capture d’écran 2015-06-21 à 17.57.14

Dans la barre de lien supérieure, cliquez alors sur « Sorties ». Ajoutez une sortie, et dans la fenêtre qui s’affiche, Microsoft a eu l’extrême bonté d’ajouter Power BI (en Preview à l’heure où j’écris ces lignes), sélectionnez le, cliquez sur suivant et autorisez Azure à publier dans Power BI.Capture d’écran 2015-06-21 à 18.00.07.

Il convient d’avoir ouvert un compte sur le site Power BI. Vous pourrez alors autoriser le Stream Analytics à publier dans Power BI Dashboards.
Notez que le mécanisme autorisation ne marchait pas avec Internet Explorer, mais fonctionnait avec Chrome… Peut-être la Preview… Allez savoir.

Vous devrez alors saisir un certain nombre d’élément qui apparaitront dans Power BI. Suivez le guide !Capture d’écran 2015-06-21 à 18.03.52

Maintenant que tout est paramétré dans Azure, il convient d’envoyer des données dans Stream Analytics, par l’intermédiaire du Hub d’événements.
La toile regorge d’exemple ou vous branchez un détecteur d’humidité sur la chasse d’eau de vos toilettes pour connaitre la consommation d’eau de votre foyer, et le taux d’humidité de l’eau ^^ (IoT Power !!!)… J’ai moi même faillit succomber en envisageant de faire un exemple avec l’API de mes HUE, pour savoir quand elles étaient allumées ou éteintes et sortir un tableau sur Power BI les temps d’allumage, avec un modèle prédictif (Machine Learning Power !!!) sur la couleur des éclairages que je préfère dans le salon versus celles que ma femme préfère dans la cuisine, en fonction de l’heure qu’il est, du temps qu’il fait, du nombre d’avions au dessus de chez moi, de la délinquance juvénile de mon quartier, …

Mais non ! Je n’ai pas succombé à cette folie, j’ai codé un exemple avec un RANDOM qui génère les données !!!!!!!!! Tout simplement. Notez que je pense tout de même faire un post sur ce blog avec mes HUE et Stream Analytics et Power BI… Mais pas tout de suite.

Rendez-vous donc dans Visual Studio, créez un nouveau projet console C# (ou un Azure Web Jobs, as you want).
Deux petites choses à ajouter via la console NuGet :
– Newtonsoft.Json : Install-Package Newtonsoft.Json -Version 6.0.8
– Le SDK du Service Bus Azure : Install-Package WindowsAzure.ServiceBus

Enfin, dans le portail Azure, allez récupérer la chaine de connexion à votre Service Bus.Capture d’écran 2015-06-21 à 18.17.37

et voici le code à mettre dans votre Program.cs. N’oubliez pas de changer les variables eventHubName et connectionString. Je rappelle que les best practices interdisent complètement cette pratique de mettre les chaines de connexions directement dans le code, et qu’elles doivent normalement être dans le fichier App.config, puis appelée dans le code… Je le fais, parce que c’est dimanche, et que je ne mettrai pas ce dev en production… A bon entendeur…

Les best practices imposent également que le code soit commenté… Je ne l’ai pas fait pour les mêmes raisons ^^ (et aussi parce que c’est assez court).

 class MsgToSend  
      {  
           public Guid TheGuid;  
           public string Author;  
      }  
      class Program  
      {  
           static string eventHubName = "LE NOM DE VOTRE RECEPTEUR D'EVENEMENTS";  
           static string connectionString = "LA CHAINE DE CONNEXION";  
           static void Main(string[] args)  
           {  
                Console.WriteLine("Press Ctrl-C to stop the sender process");  
                Console.WriteLine("Press Enter to start now");  
                Console.ReadLine();  
                SendingRandomMessages().Wait();  
           }  
           static async Task SendingRandomMessages()  
           {  
                var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);  
                while (true)  
                {  
                     try  
                     {  
                          Guid guidToSend = Guid.NewGuid();  
                          MsgToSend mtsCurrent = new MsgToSend();  
                          mtsCurrent.TheGuid = guidToSend;  
                          Random rNames = new Random();  
                          List<string> liNames = new List<string> { "Aurélien Prévot", "Gilles Pommier", "Patrick Guimonet", "Yoan Topenot", "Aurélien Prévot", "Aurélien Prévot", "Aurélien Prévot" };  
                          int intNameIndex = rNames.Next(liNames.Count);  
                          mtsCurrent.Author = liNames[intNameIndex];  
                          string strMessage = JsonConvert.SerializeObject(mtsCurrent);  
                          Console.WriteLine("{0} > Sending message: {1}", DateTime.Now.ToString(), strMessage);  
                          await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(strMessage)));  
                     }  
                     catch (Exception exception)  
                     {  
                          Console.ForegroundColor = ConsoleColor.Red;  
                          Console.WriteLine("{0} > Exception: {1}", DateTime.Now.ToString(), exception.Message);  
                          Console.ResetColor();  
                     }  
                     await Task.Delay(200);  
                }  
           }  
      }  

En gros, ce bout de dev consiste à envoyer des GUID et le nom de son auteur (pris totalement au hasard). Dans mon scénario, celui qui a créé le plus de GUID a gagné. Evidemment, comme je n’aime pas perdre, je me suis mis quatre fois plus souvent dans le tableau que les autre participants.
Une fois qu’on a créé l’objet, on le stringifie en JSON et hop, on l’envoit dans le Hub.

Appuyez sur F5 ! Dans la fenêtre qui s’ouvre, appuyez sur Entrée, pour lancer le traitement !

Capture d’écran 2015-06-21 à 18.28.06

Et là, rien ne se passe  dans Power BI : normal, on a oublié de lancer le Stream Analytics !

Retour dans Azure, sur les réglages de votre Stream Analytics, cliquez sur « Lancer » dans la barre du bas ; et validez la popup. Le Stream Analytics peut mettre quelques minutes à se lancer.Capture d’écran 2015-06-21 à 18.30.07

Rendez-vous sur le site de Power BI, et là, comme par magie, votre source de données est apparue !

Capture d’écran 2015-06-21 à 18.32.07

Cliquez dessus, construisez-vous un rapport, épinglez les graphiques à votre tableau de bord, et vous constaterez que les chiffres augmentent tout seuls ! Sans rafraichissement, sans rien d’autre à faire qu’admirer les jauges qui montent (surtout la mienne) ! C’est génial !

Capture d’écran 2015-06-21 à 18.34.46

Comme convenu, je gagne !!! Grâce à mon random truqué !

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s