Azure WebJobs Part 3 : Activer un Job avec un Blob

Dans cette troisième partie, nous allons voir comment lancer le traitement d’un job à partir d’un nouveau blob dans notre espace de stockage.

Le scénario est le suivant, j’ai un Web Role qui héberge une gateway. J’ai de nombreux logs IIS qui sont stockés dans des blobs et je voudrais pouvoir faire des requêtes sur les données. Pour cela, je dois d’abord lire les blobs et envoyer les lignes qu’il contient dans une table Azure sur laquelle je pourrais faire mes requêtes.

Le Logs IIS

Le fichier contenant le log IIS est un fichier de type CSV avec une description des champs et quelques commentaires sur les premières lignes, sa structure ressemble à celle ci:

image

Ce qui va se traduire dans une table par la classe WebLogEntry (toutes les scripts sont dans le gist en bas du post)

Création du Job

La méthode qui va être exécuté par le SDK va utiliser l’attribut [BlobTrigger(path)] permettant de scanner un path sur un espace de stockage azure et déclenchant la méthode à chaque nouvel élément détecté.

Le chemin d’accès path du blob est du type “container/{name}, ce qui nous permettra de récupérer la propriété name du blob dans une variable si nous avons besoin de l’utiliser.

Le code est le suivant :

public static void IISLogParserToTable([BlobTrigger(@"wad-iis-logfiles/{name}")] Stream input,string name,
[Table("wadiislogs")] ICollector<WebLogEntry> tableBinding){
...

}

Nous allons donc itérer sur chaque ligne du fichier, créer une entité de type WebLogEntry et l’ajouter à la collection tableBindings. Cette collection est décorée par l’attribut [Table(‘name’)] dans la signature de la méthode et va nous permettre à chaque utilisation de la fonction Add d’insérer une nouvelle ligne dans la table Azure.

Nous voyons ici que grace au SDK WebJob, le travail pour lire un Blob et effectué des insertions dans une table est énormément simplifié. Cela aurait été possible a développé dans un web role ou dans un programme console mais nous aurions été obligé de gérer les BlobClient et TableClient etc..

Ce type de traitement peut être utilisé pour insérer des dizaines de milliers de lignes sans aucune problème.

PS : le code du parser CSV est également disponible dans les sources du gist:

#inspired from https://code.msdn.microsoft.com/windowsazure/Cloud-Service-Fundamentals-4ca72649
public class WebLogEntry
{
public String RowKey { get; set; }
public String PartitionKey { get; set; }
/*
date 2012-06-20
time 13:00:06
s-sitename W3SVC472036332
s-computername RD00155D3AB0F9
s-ip 10.119.166.64
cs-method GET
cs-uri-stem /en/common-room/5/2/3
cs-uri-query 1340197206&ajax=ajax&_=1340197205660
s-port 80
cs-username SpiritAuror180
c-ip 195.10.36.9
cs-version HTTP/1.1
cs(User-Agent) Mozilla/5.0+(Windows+NT+6.0;+rv:12.0)+Gecko/20100101+Firefox/12.0
cs(Cookie) SessionCookie=ljm1uqofn2a1zvdgll12lpk0;+__Req*********************
cs(Referer) https://jeremiedevillard.wordpress.com
cs-host http://www.pottermore.com
sc-status 200
sc-substatus 0
sc-win32-status 0
sc-bytes 3343
cs-bytes 2082
time-taken 62
*/
public DateTime Date{ get; set; }
public DateTime Time{ get; set; }
public string SiteName{ get; set; }
public string ComputerName{ get; set; }
public string RoleInstance{ get; set; }
public string ServerIpAddress{ get; set; }
public string HttpMethod{ get; set; }
public string UriStem{ get; set; }
public string UriQuery{ get; set; }
public int Port{ get; set; }
public string UserName{ get; set; }
public string ClientIpAddress{ get; set; }
public string Version{ get; set; }
public string UserAgent{ get; set; }
public string Cookie{ get; set; }
public string Referer{ get; set; }
public string Host{ get; set; }
public int Status{ get; set; }
public int SubStatus{ get; set; }
public int Win32Status{ get; set; }
public int ScBytes{ get; set; }
public int CsBytes{ get; set; }
public int TimeTaken{ get; set; }
}
view raw IISLogEntry hosted with ❤ by GitHub
public static void IISLogParserToTable([BlobTrigger(@"wad-iis-logfiles/{name}")] Stream input,string name,
[Table("wadiislogs")] ICollector<WebLogEntry> tableBinding)
{
//blob name of type : wad-iis-logfiles/5d8a5e565a4544ecb4fcf12b2d533ed6/Router/Router_IN_0/Web/W3SVC1273337584
using (var reader = new StreamReader(input))
{
foreach (var line in reader.GetSplittedLines(" ").Skip(4))
{
//To allow descending entries in the table
var inverseTimeKey = DateTime
.MaxValue
.Subtract(DateTime.UtcNow)
.TotalMilliseconds
.ToString(CultureInfo.InvariantCulture);
var entry = new WebLogEntry
{
PartitionKey = String.Empty,
RowKey = string.Format("{0}-{1}",inverseTimeKey,Guid.NewGuid()),
RoleInstance = name.Split(new[] {'/'})[2],
Date = Convert.ToDateTime(line[0]),
Time = Convert.ToDateTime(line[1]),
SiteName = line[2],
ComputerName = line[3],
ServerIpAddress = line[4],
HttpMethod = line[5],
UriStem = line[6],
UriQuery = line[7],
Port = Convert.ToInt32(line[8]),
UserName = line[9],
ClientIpAddress = line[10],
Version = line[11],
UserAgent = line[12],
Cookie = line[13],
Referer = line[14],
Host = line[15],
Status = Convert.ToInt32(line[16]),
SubStatus = Convert.ToInt32(line[17]),
Win32Status = Convert.ToInt32(line[18]),
ScBytes = Convert.ToInt32(line[19]),
CsBytes = Convert.ToInt32(line[20]),
TimeTaken = Convert.ToInt32(line[21])
};
tableBinding.Add(entry);
}
}
}
view raw IISLogParserJob hosted with ❤ by GitHub
#used in https://code.msdn.microsoft.com/windowsazure/Cloud-Service-Fundamentals-4ca72649
public static class LinqToTextReader
{
public static IEnumerable<string[]> GetSplittedLines(this TextReader reader, string[] delimiters)
{
using (var parser = new TextFieldParser(reader))
{
parser.Delimiters = delimiters;
string[] fields;
while ((fields = parser.ReadFields()) != null)
{
yield return fields;
}
}
}
public static IEnumerable<string[]> GetSplittedLines(this TextReader reader, string delimiter)
{
return GetSplittedLines(reader, new[] { delimiter });
}
}
view raw LinkToTextReader hosted with ❤ by GitHub

 

This entry was posted in Azure, Français and tagged , , . Bookmark the permalink.

1 Response to Azure WebJobs Part 3 : Activer un Job avec un Blob

  1. Pingback: A la découverte des Windows Azure Web Jobs (Intro) | Jérémie – an other BizTalker

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s