Banner_Etool

Fitur 2015

Por: Emilio Torrens  /  En: , , ,

MongoMapper.NET 1.1

Por: Emilio Torrens  /  En: , , , ,

Antes de irme de vacaciones dejo publicado un nuevo reléase de MongoMapper.NET, hay muchos cambios pequeños, ninguno de rotura, esta es la lista de los mas “importantes”:

La configuración en base de datos quizás sea el cambio mas útil, ya que donde antes había tropecientas líneas de XML de configuración ahora puedes dejarlo en una key en el appSettings:

<add key=”MongoMapperDbConfig” value=”mongodb://127.0.0.1|TestDotNET|MongoMapperConfig|1″/>

Y le indicamos la cadena de conexión, la base de datos, la colección y la Key del documento con la configuración, puedes ver como funciona en el GetConfig de MongoMapperConfiguration.

El Documento tiene que ser el siguiente:

MongoMapper_db_config

Como siempre espero vuestros comentarios Sonrisa

Circuito Prinsotel, Torneo Clausura

Por: Emilio Torrens  /  En: , ,

Este fin de semana Joan y yo jugamos el clausura del circuito prinsotel, en las semifinales nos mandaron a casa, lastima, el año que viene mas Sonrisa

IMG_20141221_100012~2 IMG_20141221_100834
IMG_20141221_105551 IMG_20141221_105624

AWS: Escalar detrás de un ELB x Métricas de CPU/Memoria

Por: Emilio Torrens  /  En: , ,

.

auto-scaling-aws-374x258

Para escalar instancias detrás de un balanceador lo mas natural, por lo menos en nuestro caso, seria auto escalar instancias por la media de utilización de CPU o Memoria de las instancias que hay detrás de un Balanceador.

Eso en AWS no se puede hacer ya que no te dan esa métrica, puedes escalar por las métricas de una de las instancias, cosa que no me parece optima ni recomendable ya que ese server podría estar sirviendo un request pesado y los demás estar sin hacer nada, o escalar por las métricas propias del ELB, latencia, numero de requests etc .. pero para nosotros cuando saltan esas alarma ya es tarde.

La solución, crear una métrica personalizada que mande la media de utilización de CPU/Memoria de las instancias que hay detrás del balanceador y escalar por esa métrica.

Aquí dejo un script de Python para poder tener esas métricas, tiene dos modos:

1- Si no le pasas parámetros busca todos los balanceadores de una cuenta de AWS y manda métricas personalizadas para tener la media de uso de CPU y Memoria de las instancias que tiene detrás.

2- Para que te haga la métrica de un grupo de servidores aunque no estén en un balanceador le has de pasar el nombre de la métrica y los ids de los servidores separados por ; (Ejemplo: python aws-elb-metrics.py ELASTICSEARCH-CLUSTER i-73f85435430;i-88cc6sdasd4cb;i-99c06dasd8da;i-7addd0239)

Ojo que las métricas de memoria no aparecen en AWS, hay que instalar unos scripts en los servidores para que se manden aquí dejo los enlaces por si lo queréis instalar Amazon CloudWatch Monitoring Scripts for WindowsAmazon CloudWatch Monitoring Scripts for Linux

__author__ = 'emilio.torrens'
 
access_key = 'TU_KEY
access_secret = 'TU_SECRET'
 
import sys
import datetime
from time import sleep
import threading
import boto.ec2.elb
import boto.ec2.cloudwatch
 
c = boto.ec2.cloudwatch.connect_to_region('eu-west-1', aws_access_key_id=access_key, aws_secret_access_key=access_secret)
elb = boto.ec2.elb.connect_to_region('eu-west-1', aws_access_key_id=access_key, aws_secret_access_key=access_secret)
 
 
def put_metric_cpu_from_instances(name, instance_ids):
    print name
    total_avg = 0
    metric_count = 0
    max_datetime = datetime.datetime.utcnow() - datetime.timedelta(hours=600)
    for instance_id in instance_ids:
        metrics = c.get_metric_statistics(
            300,
            datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
            datetime.datetime.utcnow(),
            'CPUUtilization',
            'AWS/EC2',
            'Average',
            dimensions={'InstanceId': [instance_id]}
        )
 
        if len(metrics) != 0:
            m = max(metrics, key=lambda x: x['Timestamp'])
            if m['Timestamp'] > max_datetime:
                max_datetime = m['Timestamp']
 
            #print str(instance_id) + " : " + str(m)
            avg = float(m['Average'])
            total_avg += avg
            metric_count += 1
 
    if metric_count != 0:
        print 'Sending CPUUtilization data - DateTime: ' + str(max_datetime) + " Value: " + str(total_avg / metric_count)
        result = c.put_metric_data('e-tooltech', name + '-CPUUtilization', value=total_avg / metric_count,
                                   timestamp=max_datetime)
        print 'Result: ' + str(result)
 
 
def put_metric_memory_from_instances(name, instance_ids):
    print name
    total_avg = 0
    metric_count = 0
    max_datetime = datetime.datetime.utcnow() - datetime.timedelta(hours=600)
    for instance_id in instance_ids:
        # print instance.id
        metrics = c.get_metric_statistics(
            300,
            datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
            datetime.datetime.utcnow(),
            'MemoryUtilization',
            'System/Windows',
            'Average',
            dimensions={'InstanceId': [instance_id]}
        )
 
        metrics += c.get_metric_statistics(
            300,
            datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
            datetime.datetime.utcnow(),
            'MemoryUtilization',
            'System/Linux',
            'Average',
            dimensions={'InstanceId': [instance_id]}
        )
 
        if len(metrics) != 0:
            m = max(metrics, key=lambda x: x['Timestamp'])
            if m['Timestamp'] > max_datetime:
                max_datetime = m['Timestamp']
 
            #print str(instance_id) + " : " + str(m)
            avg = float(m['Average'])
            total_avg += avg
            metric_count += 1
 
    if metric_count != 0:
        print 'Sending MemoryUtilization data - DateTime: ' + str(max_datetime) + " Value: " + str(total_avg / metric_count)
        result = c.put_metric_data('e-tooltech', name + '-MemoryUtilization', value=total_avg / metric_count,
                                   timestamp=max_datetime)
        print 'Result: ' + str(result)
 
while True:
 
    try:
 
        if len(sys.argv) == 1:
 
            for lb in elb.get_all_load_balancers():
                ids = []
                for instance in lb.instances:
                    ids.append(instance.id)
 
                t2 = threading.Thread(target=put_metric_memory_from_instances(lb.name, ids))
                t2.start()
                t3 = threading.Thread(target=put_metric_cpu_from_instances(lb.name, ids))
                t3.start()
 
                t2.join()
                t3.join()
 
        else:
 
            metric_name = sys.argv[1]
            ids = sys.argv[2].split(';')
 
            put_metric_cpu_from_instances(metric_name, ids)
            put_metric_memory_from_instances(metric_name, ids)
 
        print 'Sleep for 60 seconds'
        sleep(60)
 
    except Exception, e:
        print str(e)

Padel, III Prueba Ruta Solidaria Trofeo BP

Por: Emilio Torrens  /  En: ,

Cincopa WordPress plugin