Cualquiera que haya realizado algún tipo de desarrollo web se ha encontrado con la necesidad (o ha tenido la curiosidad) de conocer cómo utilizan los usuarios el sitio web. Cuando se trata de aplicaciones de escritorio esto es mucho menos frecuente aunque no por ello menos útil.
Una forma de saber el uso que se da a nuestra aplicación es preguntar directamente a los usuarios, pero eso supone un esfuerzo adicional para ellos, para nosotros y, sobre todo, es poco fiable porque como dice House todo el mundo miente.
Cómo funciona Google Analytics
En el mundo web una de las herramientas de seguimiento más extendidas es Google Analytics, que ofrece un sistema bastante fácil de empezar a utilizar pero a la vez muy potente si queremos darle un uso más avanzado.
Para realizar el seguimiento de la actividad de los usuarios Google Analytics permite usar dos técnicas:
- Podemos inyectar un fragmento de código javascript en cada página del sitio web para que, cada vez que alguien acceda a esa página, envíe a los servidores de Google Analytics información sobre el tipo de navegador, el tiempo empleado en la página, etc. Es la opción más habitual, pero tiene el problema de que si el usuario no tiene habilitada la ejecución de código javascript, no podremos capturar ningún tipo de información.
- Incrustar en cada página una imagen alojada en los servidores de Google Analytics y añadir en la URL de la imagen ciertos parámetros que nos permitan realizar el seguimiento. Para ello debemos generar URLs personalizadas para cada visitante del sitio, pero a cambio no hace falta que tengan habilitado javascript para realizar el seguimiento.
Cómo usarlo en aplicaciones de escritorio
A Greg Young se le ocurrió aprovechar está última técnica para realizar el seguimiento de una aplicación de escritorio, en su caso un plugin para Visual Studio. La idea es muy sencilla, como casi todas las buenas ideas. Se basa en lanzar una petición web a la URL con la imagen para que Google Analytics registre el acceso y guarde las estadísticas.
OJO: No tengo muy claro que se pueda usar legalmente Google Analytics de esta forma. Antes de implementar esto en la vida real deberías leerte las condiciones de servicio por si acaso.
Limpiando un poco el código de Greg Young, acabé con la siguiente clase que también podéis encontrar en github:
public class TrackingService { // Sample usage: // service.TrackEvent("customers/add"); // service.TrackEvent("order/discount-applied"); public void TrackEvent(string path) { ThreadPool.QueueUserWorkItem(x => TrackPageView("/events/" + path)); } private const string VERSION = "4.4sa"; private static readonly int VISITOR = Guid.NewGuid().GetHashCode(); private void TrackPageView(string path) { try { var connection = WebRequest.Create(GetGAUrl(path)); ((HttpWebRequest)connection).UserAgent = ""; connection.Headers.Add("Accept-Language", "EN-US"); using (connection.GetResponse()) { // Ignore response } } catch { // Swallow exception. It could be logged } } private static string GetGAUrl(string path) { const string DOMAIN = "mydomain.com"; const string RESOURCE = "myapp"; const string GA_ACCOUNT = "MO-111111-1"; return "http://www.google-analytics.com/__utm.gif" + "?" + "utmwv=" + VERSION + "&utmn=" + GetRandomNumber() + "&utmhn=" + DOMAIN + "&utmr=" + RESOURCE + "&utmp=" + path.Replace("/", "%2F") + "&utmac=" + GA_ACCOUNT + "&utmcc=__utma%3D999.999.999.999.999.1%3B" + "&utmvid=" + (VISITOR - DateTime.Today.GetHashCode()); } private static string GetRandomNumber() { return new Random().Next(0x7fffffff).ToString(); } }
El uso de esta clase es muy simple. Cada acción o evento de la aplicación que queremos registrar debe asociarse a una URL diferente y cuando queramos registrarlo deberemos invocar el método TrackEvent
. Por ejemplo, si quisieramos analizar el uso de un editor de texto, podríamos tener eventos similares a estos:
service.TrackEvent("document/new"); service.TrackEvent("document/load"); service.TrackEvent("document/save"); service.TrackEvent("edit/find"); ...
Para registrar el evento se construirá una URL que lo represente usando el método GetGAUrl
y se lanzará una petición web a Google Analytics a esa URL para que lo registre.
Conclusiones
Existen muchas herramientas específicas para analizar el uso de aplicaciones de escritorio y seguramente sean mucho más potentes y versátiles que esta técnica, pero este sistema es muy fácil de montar y empezar a utilizar.
Antes de aplicar esta técnica es importante pararse un rato a pensar qué eventos vamos a registrar y cómo los vamos a representar porque de ello dependerá luego la información que podamos extraer de Google Analytics. Hay que tener en cuenta que, inicialmente, lo único que podremos hacer es filtar por URLs en Google Analytics por lo que la estructura de esas URLs es determinante.
En el ejemplo anterior, al agrupar todas las operaciones sobre documentos en la ruta «document/xxx», es fácil filtrar en Google Analytics aquellas URLs que contienen el texto «document/» y obtener así datos globales de uso de las opciones sobre documentos.
Con un poco de imaginación y una buena estructura de eventos es posible extraer información muy valiosa de casi todos los aspectos de nuestra aplicación.