Aunque era algo que ya teníamos en el antiguo portal de Windows Azure, sin duda, una de las cosas más interesantes que nos ofrece la nueva versión es la facilidad para manejar la monitorización de los distintos elementos disponibles, entre ellos las cuantas de Storage. Como puede observar en la siguiente imagen, la interfaz nos permite de una forma sencilla habilitar la monitorización para los diferentes elementos de un storage ( blob, queues y tables ). En ocasiones, disponer de el portal de azure como herramienta de trabajo principal no es posible, imagine que usted esta usando la infraestructura de azure para terceros y que desea en sus propias herramientas habilitar y ver toda esta información de monitorización. En estos casos, necesitamos de un mecanismo para poder habilitar de forma programática la configuración de monitorización, y, por supuesto, también necesitaremos un mecanismos para ver los diferentes valores de las métricas de esta configuración.
Por suerte, todo lo que tenemos disponible en el portal lo tenemos disponible nosotros, puesto que en teoría este portal está construido con el mismo API que nosotros tenemos a nuestra disposición. Por lo tanto vamos a intentar realizar dos pasos, configuración de la monitorización y revisión de las métricas sin necesidad de utilizar el portal de azure. por supuesto el código es meramente demostrativo, como casi siempre en los posts, y tendrá muchas posibilidades de mejora, pero ya le queda a usted estimado lector para ganarse su trabajo;
Configuración de la monitorización
Para realizar la configuración de la monitorización utilizaremos uno de esos N API Rest que Azure nos pone a nuestra disposición, en concreto el API rest referido a los servicios de Blob, Queues y/o Tables, dependiendo de que monitorización querramos habilitar. En el siguiente enlace puede ver el caso concreto del servicio de blob Set Blob Service Properties gracias al cual podremos hacer este trabajo. En realidad el API para los diferentes elementos solamente presenta cambios en la url ( los segmentos blob,queues o tables dependiendo del servicio ) y el modo de autenticación.
Según el método mencionado anteriormente, para habilitar la configuración solamente tendremos que realizar una petición PUT a laa url .blob.core.windows.net/?restype=service&comp=properties">.blob.core.windows.net/?restype=service&comp=properties">.blob.core.windows.net/?restype=service&comp=properties">.blob.core.windows.net/?restype=service&comp=properties">http://<account-name>.blob.core.windows.net/?restype=service&comp=properties
utilizando un cuerpo de mensaje similar al siguiente fragmento (extraído del enlace anterior )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span>?> <StorageServiceProperties> <Logging> <Version>version-number</Version> <Delete><span class="kwrd">true</span>|<span class="kwrd">false</span></Delete> <Read><span class="kwrd">true</span>|<span class="kwrd">false</span></Read> <Write><span class="kwrd">true</span>|<span class="kwrd">false</span></Write> <RetentionPolicy> <Enabled><span class="kwrd">true</span>|<span class="kwrd">false</span></Enabled> <Days>number-of-days</Days> </RetentionPolicy> </Logging> <Metrics> <Version>version-number</Version> <Enabled><span class="kwrd">true</span>|<span class="kwrd">false</span></Enabled> <IncludeAPIs><span class="kwrd">true</span>|<span class="kwrd">false</span></IncludeAPIs> <RetentionPolicy> <Enabled><span class="kwrd">true</span>|<span class="kwrd">false</span></Enabled> <Days>number-of-days</Days> </RetentionPolicy> </Metrics> <!-- The DefaultServiceVersion element can only be set <span class="kwrd">for</span> the Blob service and the request must be made <span class="kwrd">using</span> the 2011-08-18 version --> <DefaultServiceVersion><span class="kwrd">default</span>-service-version-<span class="kwrd">string</span></DefaultServiceVersion> </StorageServiceProperties> |
Pues bien, vamos a intentarlo:
Para generar el XML anterior utilizaremos una serialización XML de las clases siguientes, las cuales, representan como verá este sencillo fragmento. Por supuesto, usted puede crear cualquier otro mecanismo, para conseguir tener este fragmento de XML. [Si utiliza XmlSerializer no se olvide de utilizar XmlSerializerNamespace para eliminar los namespaces que este serializador incluye por defecto]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<span class="kwrd">public</span> <span class="kwrd">class</span> StorageServiceProperties { <span class="kwrd">public</span> Logging Logging { get; set; } <span class="kwrd">public</span> Metrics Metrics { get; set; } } <span class="kwrd">public</span> <span class="kwrd">class</span> Metrics { <span class="kwrd">public</span> <span class="kwrd">string</span> Version { get; set; } <span class="kwrd">public</span> <span class="kwrd">bool</span> Enabled { get; set; } <span class="kwrd">public</span> <span class="kwrd">bool</span> IncludeAPIs { get; set; } <span class="kwrd">public</span> RetentionPolicy RetentionPolicy { get; set; } } <span class="kwrd">public</span> <span class="kwrd">class</span> Logging { <span class="kwrd">public</span> <span class="kwrd">string</span> Version { get; set; } <span class="kwrd">public</span> <span class="kwrd">bool</span> Delete { get; set; } <span class="kwrd">public</span> <span class="kwrd">bool</span> Read { get; set; } <span class="kwrd">public</span> <span class="kwrd">bool</span> Write { get; set; } <span class="kwrd">public</span> RetentionPolicy RetentionPolicy { get; set; } } <span class="kwrd">public</span> <span class="kwrd">class</span> RetentionPolicy { <span class="kwrd">public</span> <span class="kwrd">bool</span> Enabled { get; set; } <span class="kwrd">public</span> <span class="kwrd">int</span> Days { get; set; } } |
Para la petición utilizaremos HttpWebRequest o cualquier API de cliente como HttpClient o RestSharp. En nuestro caso, para no molestar al lector con otras API diferente a las habituales optaremos por el uso de la primera opción, aunque habitualmente haga uso de RestSharp para este tipo de tareas. A lo largo de las siguientes lineas, veremos como realizar la petición solicitada por el API mencionado anteriormente.
1 2 3 4 5 6 7 8 9 10 |
<span class="rem">//create the http request and set default headers</span> <span class="kwrd">string</span> baseUri = <span class="kwrd">string</span>.Format(<span class="str">"http://{0}.blob.core.windows.net/?restype=service&comp=properties"</span>, accountName); var request = (HttpWebRequest)HttpWebRequest.Create(baseUri); request.Headers.Add(<span class="str">"x-ms-version"</span>, <span class="str">"2009-09-19"</span>); request.Method = <span class="str">"PUT"</span>; <span class="rem">//set the content length from settings</span> var bytes = UTF8Encoding.UTF8.GetBytes(settings); request.ContentLength = bytes.Length; |
En estas lineas, él único trabajo que hemos realizado es la creación de un request a la dirección dada y seteados los valores de cabeceras como “x-ms-version” obligatorias según la información que el API nos ofrece. El siguiente paso, es establecer la cabecera de authorización, proceso que no es simple como podemos ver en los esquemas de autenticación de Windows Azure pero que resolveremos de una forma terriblemente simple gracias a la clase StorageCredentialsAccountAndKey y a su método SignRequest.
1 2 |
var storageCredentials = <span class="kwrd">new</span> StorageCredentialsAccountAndKey(accountName,mystorageaccountprimarykey); storageCredentials.SignRequest(request); |
Bien, ya solamente tenemos que escribir el cuerpo de la petición y obtener la respuesta, y esto, es idéntico a cualquier petición que ya hubiéramos hecho con HttpWebRequest. anteiormente.
1 2 3 4 |
request.GetRequestStream().Write(bytes, 0, bytes.Length); var response = request.GetResponse(); |
Consulta de las métricas
A lo largo de las líneas anteriores hemos visto como habilitar la monitorización de una cuenta de storage de una forma simple. Pero, aún nos queda el elemento importante, que no es otro que la recuperación de los valores de las diferentes métricas que hemos habilitado. Como se ha podido imaginar de las líneas anteriores, la activación/configuración se realiza a nivel de servicio ( para blob, queue, tables ) no para la cuenta de storage. Las métricas de estos diferentes servicios las posemos categorizar en los siguientes puntos:
- Métricas de transacciones – Expuesta, tal y como se puede ver aquí, en tres tablas fundamentales:
-
- $MetricsTransactionBlob
- $MetricsTransactionsTable
- $MetricsTransactionsQueue
- Métricas de capacidad – Expuestas, tal y como se puede ver aqui, en la siguiente tabla:
-
- $MetricsCapacityBlob
Para consultar los esquemas de las diferentes tablas de métricas podemos acudir a la MSDN dónde obtendremos la información necesaria. En realidad, no tiene demasiada historia, por lo menos no mucho más que trabajar con cualquier Table Service de Azure. En nuestro caso, por ver un ejemplo, haremos lo siguiente, el mapeo de una entidad para trabajar con $MetricsTransactionsBlob, tal cual nos dice la documentación, y una consulta de todos los contadores usando un TableServiceContext.
1 2 3 4 5 6 7 8 9 10 |
var entitySetName = <span class="str">"$MetricsTransactionsBlob"</span>; var client = storageAccount.CreateCloudTableClient(); <span class="kwrd">if</span> (client.DoesTableExist(entitySetName)) { var context = client.GetDataServiceContext(); var data = context.CreateQuery<StorageMetrics>(entitySetName) .ToList(); } |
12345 <span class="kwrd">public</span> <span class="kwrd">class</span> StorageMetrics : TableServiceEntity{<span class="kwrd">public</span> <span class="kwrd">string</span> TotalRequests { get; set; }<span class="kwrd">public</span> StorageMetrics() { }}
1 |
Espero que os haya resultado de interés..
Saludos
unai