Archivo de la categoría: MAquinas Virtuales

Microsoft Azure and Wowza Streaming Engine at IBC 2015

Para mis amigos que dicen que solo voy a pasear y no trabajo cuando viajo 😛

Anuncios

Cómo leer métricas en una máquina virtual de Azure?

Introducción

Una vez que las compañías comienzan a utilizar servicios en la nube, nace inmediatamente la necesidad de leer métricas de los recursos, por ejemplo el uso de memoria, CPU, etc.

En este post vamos a desarrollar una aplicación que lee estas métricas de una máquina virtual corriendo en Microsoft Azure usando Azure Insights REST API.

El siguiente esquema muestra los elementos involucrados y el orden en que debemos hacer las llamadas para poder leer las métricas.

exquema

Prerrequisitos

Para poder utilizar las métricas, debemos tener una máquina virtual corriendo en Microsoft Azure con la configuración de Diagnostic On como se muestra en la siguiente imagen.

DiagnosticOn

Una vez que tienes la máquina virtual corriendo y recolectando las métricas debes proveer un usuario de Azure Active Directory para que pueda leer los valores de las métricas de ese recurso como se muestra en la siguiente imagen.

roles

En este momento tenemos acceso de lectura para ese usuario.  Ahora debemos registrar nuestra aplicación cliente en Active Directory para que esta pueda autentificarse con el usuario y leer las métricas. El tipo de aplicación en AAD es Native client Application, y agregar el permiso para otras aplicaciones llamado Windows Azure Service Managment API como se muestra en la siguiente captura de pantalla

appIdPermissions

Ahora estamos listo para comenzar a codificar.

Aplicación cliente

Obtener el cliente

La primera llamada que debemos hacer es para autentificarnos y obtener el json token y así poder  hacer la llamada a la API y el servicio de Storage. El método GetAuthorizationHeaderSilent retorna un string que contiene el Token.

public string GetAuthorizationHeaderSilent()
{
	AuthenticationResult result = null;
        var context = new AuthenticationContext("https://login.windows.net/" + TenantId);
        // Directly specify the username and password. 
        var credential = 
           new Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential(
                    this.UserName,
                    this.Password);
         result = context.AcquireToken(
                "https://management.core.windows.net/",
                this.ClientId,
                credential);
         if (result == null)
         {
            throw new InvalidOperationException("Failed to obtain the JWT token");
         }
         jToken=result.AccessToken;
          return jToken;
}

 

Obtener la lista de métricas

Cada máquina virtual puede tener definidos diferentes grupos de métricas, por lo que debemos obtener la lista de las métricas que están activas para esa instancia. El método LoadMetricDefinitions retorna el json file con la lista de métricas y dónde se encuentran almacenados los valores recolectados de cada métrica.

public  async Task  LoadMetricDefinitions(string ResourceGroup, string Provider, string VmName,string Filter)
{
	string url=String.Format(ListMetrcis, SubscriptionId, ResourceGroup, Provider, VmName, apiVersion, Filter);
        string MetricListResponse = null;
        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jToken);
        string stringResponse = null;
        try
        {
           MetricListResponse = await
           client.GetStringAsync(
             String.Format(
		ListMetrcis, 
		SubscriptionId, 
		ResourceGroup, 
		Provider, 
		VmName, 
		apiVersion, 
		Filter));
           stringResponse = MetricListResponse.ToString();
        }
        catch (Exception Err)
            {
                Console.WriteLine(Err.Message);
            }
            return stringResponse;
}

 

Leer el valor de las métricas

Con la lista de métricas y su definición podemos ahora leer desde el servicio Azure Storage los valores de esas métricas. Para hacer eso usamos el método GetMetricStorageData que recorre el documento json con la definición de las métricas y lee la métrica que le indicamos con la variable MetricName. La respuesta del método también es un documento json con los valores de la métrica.

public TableMetricData GetMetricStorageData(string jsonMetricDefinition,string MetricName)
{
 TableMetricData myData = null;
 try
 {
 var jsonData = Newtonsoft.Json.Linq.JObject.Parse(jsonMetricDefinition);
 foreach (var allList in jsonData)
 {
 var list = allList.Value;
 
 foreach (var xxx in list)
 {
 if (xxx["name"]["value"].ToString() == MetricName)
 {
 myData = new TableMetricData();
 foreach (var metricAvailabilities in xxx["metricAvailabilities"])
 {
 myData.tableEndpoint=
 metricAvailabilities["location"]["tableEndpoint"].ToString();
 foreach (var tableInfo in metricAvailabilities["location"]["tableInfo"])
 {
 myData.TableName = tableInfo["tableName"].ToString();
 myData.sasToken=tableInfo["sasToken"].ToString();
 }
 myData.partitionKey = metricAvailabilities["location"]["partitionKey"].ToString();
 }
 break;
 }
 }
 }
 }
 catch (Exception Err)
 {
 Console.WriteLine(Err.Message);
 }
 return 
}

Aplicación de ejemplo

La aplicación de ejemplo que usa los tres métodos expuestos anteriormente es del tipo consola y se muestra a continuación.

static void Main(string[] args)
{
	IMetricProvider myMetric = MetricProviderFactory.GetProvider(0);
	string counterName =  @"\Processor(_Total)\% Processor Time";
	 //1. obtain the JWT token
	 Console.ForegroundColor = ConsoleColor.Red;
	red("My Token is:");
	string myToken = myMetric.GetAuthorizationHeaderSilent();
	Console.WriteLine(myToken);
	Console.WriteLine("");
	//2. Get Metrcis List
	//You need to use your own Data here
       	string ResourceGroupName = "metricsampleRG";
        string ProviderName="Microsoft.Compute";
        string VirtualMachineName="metricsample";

	red("Get Netric List");
	Task<string> defTask=   myMetric.LoadMetricDefinitions(
                    ResourceGroupName,
                    ProviderName,
                    VirtualMachineName,
                   "");
	defTask.Wait();
	string jsonMetricDefinition = defTask.Result;
	PrintMetricDefinition(jsonMetricDefinition);
	//3. Get Metric values Table storage 
       	red("Get Metrics values storage");
	TableMetricData xData = myMetric.GetMetricStorageData(jsonMetricDefinition, counterName);
	//4. Read Values
	red("Metric Values");
	Task<string> readTask = myMetric.ReadMetricValues(xData);
	readTask.Wait();
	PrintValues(readTask.Result, counterName);
	Console.ReadLine();
}

Para poder ejecutar el ejemplo deben actualizar las variables ResourceGroupName, ProviderName y VirtualMachineName con los nombres de su grupo de recursos, el tipo de proveedor que usaron y el nombre de la máquina virtual. Todo esto pueden leerlo en el portal de Azure en las propiedades de la máquina virtua campo Resource ID.

resourceID

Al ejecutar el ejemplo verán primero el token, segundo la lista de métricas disponibles y por último los valores de una de las metricas como se muestra en las siguientes imágenes.

  1. Token

token[2]

2. Lista de Métrica

metricList[2]

3. Valores de la métrica

values[2]

 

El código de ejemplo esta publicado en Git hub en la siguiente liga https://github.com/liarjo/AzureMetricSample

Conclusiones

Para leer métricas de una máquina virtual que está corriendo en Microsoft Azure debemos usar la API Azure Insights.  Ahora, para llegar al valor de la métrica debemos hacer tres llamadas consecutivas. Primero obtener el token de autentificación, luego leer la lista de métricas disponibles para por último los valores de esas métricas.

En este post revisamos paso a cómo hacer estas llamadas y utilizamos un ejemplo completo que está publicado en GITHUB, que lo disfruten

Windows Azure Virtual Machine: múltiples sitios en una VM #windowsazure

Dos clientes diferentes, uno en Santiago y otro en Bogotá me han preguntado cómo pueden hospedar distintos sitios web en una máquina virtual de Windows Azure, cada una con su propio dominio. En este artículo se muestra como hospedar 3 sitios web en misma máquina virtual cada uno con su propio DNS. Los sitios de prueba son los siguientes:

  1. xxx.jpgarcia.cl
  2. yyy.jpgarcia.cl
  3. zzz.agrotrade.cl

Los tres sitios anteriores se encuentran en la misma máquina virtual, la que pertenece al  Cloud Services multisitio.cloudapp.net. La idea es que cuando un usuario cargue en su navegador una de esas URL, el DNS server lo envía a al cloud service. Este mediante la configuración de EndPoint de la máquina virtual (VM), envía el requerimiento al puerto 80 de la VM. En este momento es cuando el ARR intercepta la llamada y utilizando las reglas de ruteo envía el requerimiento al sitio web que corresponda, el cual está hospedado en la misma máquina virtual pero en diferente puerto. Todo esto es trasparente para el usuario final, quien no sabe que todo esto está ocurriendo tras bambalinas. La figura 1, muestra el ejemplo de lo que ocurre cuando se llama al sitio http://xxx.jpgarcia.cl. El requerimiento es ruteado por ARR al sitio xxx hospedado en el puerto 8080.

0

Ahora vamos a revisar cómo configurar el escenario de ejemplo paso a paso, lo que dará como resultado que hospedaremos 3 sitios en la misma VM, cada uno con su propio DNS.

Paso 1: Dar de alta una máquina virtual con IIS 7

Primero creamos una máquina virtual en Windows Azure desde la galería con la imagen de Windows Server 2012 Datacenter. Los datos para la creación son los siguientes:

  • Virtual machine name: vmMultiSitio
  • Size: Large
  • New user name: jpg
  • Password: xxxxxx
  • DNS name: multisitio

Se termina el asistente y comienza el aprovisionamiento de la VM.

1

Una vez aprovisionada la VM nos conectamos utilizando terminal server. La instalación  de Internet Information Server (IIS) se hace agregando el rol Web Server (IIS) desde la consola de Server Manager, siguiendo el asistente con todas las opciones por defecto.

2

Una vez terminada la agregación del Rol obtenemos esta confirmación.

Paso 2: Crear los 3 sitios Web en la VM

Ahora,  nos movemos a la consola Internet Information Server (IIS) Manager para crear los 3 sitios Web que se hospedaran en este servidor. Por defecto tenemos un sitio Web llamado Default Web Site que está configurado en el puerto 80. Ahora creamos el sitio Web llamado XXX, como se muestra en la siguiente imagen.

4

Ahora, en el sitio xxx, creamos la página HMTL llamada iisstart.html con el siguiente código.

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Microsoft Internet Information Services 8</title>
	</head>
	<body>
		Hola Soy el Servido XXX del puerto 8080
	</body>
</html>

Para el segundo sitio ocupamos la siguiente configuración cuando creamos el sitio Web.

5

Volvemos a crear una página HTML llamada iisstart.html con el siguiente código pero en el directorio del sitio yyy.

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Microsoft Internet Information Services 8</title>

	</head>
	<body>
		Hola Soy el Servido YYY del puerto 8081
	</body>
</html>

Por último, creamos el tercer sitio llamado zzz para el sitio xxx.agrotrade.cl con la siguiente configuración.

6

Volvemos a crear una página HTML llamada iisstart.html con el siguiente código pero en el directorio del sitio zzz.

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Microsoft Internet Information Services 8</title>
	</head>
	<body>
		Hola Soy el Servido ZZZ del puerto 8082
	</body>
</html>

Al terminar estos 3 sitios, tenemos la siguiente vista de sitios en nuestro servidor.

7

Paso 4: Instalar Application Request Routing (ARR)

Ya tenemos nuestra máquina virtual con II8 Instalado y los sitios Web creados. Ahora, vamos a instalar ARR utilizando la herramienta Get New Web Platform Components, desde el menú de acciones al nivel de servidor, como se muestra en la siguiente imagen.

8

Esta acción nos lleva a un sitio web donde tenemos el botón de instalación. No podemos descargar nada hasta cambiar la configuración IE Enhanced Security Configuration, lo configuramos como Off para administradores.

9

Volvemos a IE, lo reiniciamos, bajamos el software  y lo ejecutamos inmediatamente. Cuando esté listo, nos presenta la pantalla de Web Platform Installer 4.5. Aquí buscamos ARR, seleccionamos Application Request Routing 2.5 y luego hacemos click en instalar.

10

Finalizado el proceso de instalación, obtenemos la siguiente confirmación.

11

Cerramos IIS Manager.

Antes de configurar el DNS, agregamos un EndPoint en la VM llamado www, no balanceado como muestra la siguiente figura. La idea es que todos los requerimientos lleguen al puerto 80 de balanceador de carga del Cloud Services y de ahí se lo envíe al puerto 80 de nuestra máquina virtual.

11a

Paso 5: Configurar DNS de los 3 sitios Web

Ya tenemos VM con IIS 8,  los 3 sitios Web creados y ARR instalado. Ahora necesitamos ir a nuestro servidor de DNS y configurar que las URL xxx.jpgarcia.cl, yyy.jpgarcia.cl y zzz.agrotrade.cl para que utilizando el registro CNAME sean direccionados al Cloud Services multisitio.cloudapp.net.

En este punto depende de que herramienta de DNS que se utilice, yo uso WordPress.com. En la siguiente imagen podemos ver los registros CNAME destacados en amarillo.

12

Ahora, para la URL zzz.agrotrade.cl tenemos el siguiente registro.

13

Ahora hacemos las pruebas de configuración de DNS.

1. Cargamos http://multisitio.cloudapp.net/  y vemos la página por defecto de IIS 8, que se sirve desde el Web Server llamado Default.

14

2. Cargamos http://xxx.jpgarcia.cl/ y vemos la página por defecto de IIS 8, que se sirve desde el Web Server llamado Default.

15

3. Cargamos http://yyy.jpgarcia.cl/ y vemos la página por defecto de IIS 8, que se sirve desde el Web Server llamado Default.

16

4. si cargamos http://zzz.agrotrade.cl/ y vemos la página por defecto de IIS 8, que se sirve desde el Web Server llamado Default al igual que los 3 casos anteriores.

Paso 6: Configurar las reglas de ruteo

Llegamos ahora a la parte más importante del artículo, es aquí donde vamos a configurar las reglas de ruteo basados en el la variable HTTP_HOST. Volvemos a IIS Manager y en el nivel de servidor seleccionamos el icono URL Rewrite. Entonces, en acciones seleccionamos Add Rule(s), y en el primer dialogo utilizamos Blank rule con los siguientes valores para el sitio xxx.

17

18

19

Para crear la regla aplicamos el cambio en el panel de acciones.

Con esta regla de ruteo le decimos a IIS que al momento de recibir una petición para el sitio xxx.jpgarcia.cl sobre escriba la dirección de la petición hacia el sitio localhost en el puerto 80, donde está el sitio XXX en nuestra máquina virtual. Como utilicé la opción Rewrite y no Redirect, necesitamos configurar el proxy de ARR para que así el cliente no sea enviado al otro sitio, sino que el proxy llame al sitio XXX le envié la respuesta el cliente sin que el browser haga nada para esto. Esta es la forma de lograr la trasparencia para el usuario final del sitio XXX.

El proxi se active en el icono Application Request Routing Cache, acción Server Proxy Settings como se muestra en la siguiente imagen.

20

Para activar el proxy, después de seleccionar el Checkbox hacemos click en aplicar del panel de acciones.

Para completar la confiugracion creamos dos reglas más, una para el sitio YYY y otra para ZZZ. Para hacerlo seguimos el mismo procedimiento que usamos para el sitio XXX, con lo cual quedamos con las siguientes tres reglas.

21

Paso 7: Probar

Luego de toda la configuración podemos probar si las reglas están funcionando correctamente. Para eso, simplemente cargamos las 3 URL y obtenemos como resultado que cada requerimiento es respondido de manera trasparente por cada correspondiente sitio de nuestra máquina virtual. Además, podemos probar el sitio Default que sigue funcionando, lo que quiere decir que tenemos 4 Web Sites en la misma máquina virtual, funcionando con sus propios nombres de DNS.

22

Comentarios al cierre

Este es un ejemplo para ilustrar el uso de ARR en este escenario, en producción se puede usar pero hay que utilizarlo en esquema de alta disponibilidad. ARR tiene por diseño la capacidad de trabajar en HA.  Lo mismo pasa con los sitios Web, no es buena práctica tener una sola instancia de un sitio, siempre dos o más!

Links Relacionados