Desactivar el modo de accesibilidad TecnoShare > Comunidad
Inicio de sesión | Ayuda (nueva ventana)

Blog de Diego

Ir a buscar
Inicio
Blog de Diego
Blog de Pablo
TecnoForo

Categorías
WSS 3.0
MOSS 2007
Estadísticas de Uso
Otros blogs
No hay elementos en esta lista.
Vínculos
Fotos
Archivo
Archivo (Calendario)
Comunidad > Blog de Diego > Categorías

17/09/2009

Parseando el BLOB de datos de uso de SharePoint

Hace cosa de unos días, mi amigo Pablo me preguntó si sabía cómo acceder a las estadísticas de utilización de MOSS 2007 en forma programática, pero no sólo quería ver información sobre los 31 días anteriores, sino que también necesitaba datos de los meses precedentes. Sin dudarlo le dije que eso no se podía, ya que el modelo de objetos solo permite acceder a información de los últimos 31 días  y sólo hasta un máximo de 2000 registros. Él me recordó entonces, que SharePoint Designer tiene todos esos reportes de uso que abarcan varios meses y era obvio que SPD estaba sacando esta información de alguna parte.

Armado con Fiddler me dispuse a descubrir de donde el viejo y querido SPD sacaba los datos de uso. Chequeando los requests logueados por Fiddler descubrí que SPD estaba haciendo algunos GET requests a una DLL llamada owssvr.dll con los siguientes parámetros de query string:

  • Cmd=GetUsageBlog
  • BlobType=Current

o:

  • Cmd=GetUsageBlog
  • BlobType=Old

Lamentablemente la respuesta era binaria (parece que lo llaman BLOB por algo), de modo que no tenía idea de cómo parsearlo.

Mi siguiente pista vino en la forma de un ejemplo de código de Microsoft en C++ no manejado, llamado, de manera ingeniosa, Usage Blob Parser. Ahora que conocía la estructura del misterioso BLOB podía escribir un parser en mi estimado C# y así acceder a la información  sin tener que usar SPD.

Estructura del BLOB de datos de uso

El BLOB de datos de uso posee dos variantes, el actual (current) y el pasado (old). El primero contiene datos de los últimos 31 días, mientras que el pasado cuenta con datos de los 31 meses anteriores.

Cada unos de los BLOBs, está compuesto de registros de uso (o hit vectors como se los llama en el ejemplo de código arriba mencionado), los cuales se dividen en siete categorías:

  • Browsers
  • Documents
  • Operating Systems
  • Query Strings
  • Referring Domains
  • Referring URL's
  • Visiting Users

Las cuáles corresponden a las categorías equivalentes en los reportes de uso de SharePoint Designer.

Cada uno de los registros de uso contiene 31 valores, formados por una fecha y un contador de hits, los cuales corresponden a los días/meses precedentes según se trate de registros del BLOB actual o del BLOB pasado.

Parseando el BLOB

Armado con estos conocimientos y el código de ejemplo no nos será difícil descargar y parsear el BLOB de datos de uso.

En la solución se encuentra la clase UsageBlob, la cual cuenta con dos sobrecargas del método estático GetUsageBlob, la primera sobrecarga acepta como parámetros una URL, un valor booleano indicando si deseamos el BLOB actual o el pasado y una instancia de NetworkCredential para autenticar el request; la segunda sobrecarga nos permite construir el blog de uso a partir de un stream (que debe soportar acceso aleatorio así que no puede ser un NetworkStream).

Realizar consultas al objeto UsageBlob no debería ser difícil, en especial si utilizamos LINQ, cómo en el ejemplo siguiente, el cual obtiene los datos de uso separados por navegador para el mes en curso:

var now = DateTime.Now;
var minDate = new DateTime(now.Year, now.Month, 1);
var browsers = from b in blob.Browsers.UsageRecords
               select new {
                    Name = b.Key,
                    Hits = (
                            from v in b.Values
                            where v.Date >= minDate
                            select v.Count
                            ).Sum(),
                    Percentage = 0
                    };

var totalHits = browsers.Sum(b => b.Hits);
if (totalHits > 0)
{
    browsers = from b in browsers
               orderby b.Hits descending
               select new
                   {
                       Name = b.Name,
                       Hits = b.Hits,
                       Percentage = (int)Math.Round(((double)b.Hits / totalHits) * 100)
                   };
}


Bueno, espere que encuentren útil la información y el código. Sientanse libres de hacer cualquier pregunta o comentario.

Solución del Parser del BLOB de datos de uso: Descargar

Post en mi blog en inglés 

Expuesta a las 10:51 por Diego Galeota | Categoría: Estadísticas de Uso | Vínculo permanente | Enviar esta entrada de blog por correo electrónico | Comentarios (0)