Banner_Etool

México, Guatemala y Belice

Por: Emilio Torrens  /  En: , , ,

Hace unos meses nos hicimos una ruta de 21 días por estos 3 países, hay cientos de posts hablando sobre esta ruta así que no voy a escribir uno mas, solo unos tips, alguna foto y un mapa con los sitios que visitamos.

Moverse, aunque sopesamos el alquilar un coche para todo el viaje nos lo desaconsejaron si íbamos a Chiapas o cruzábamos a Guatemala y Belice, así que todo fue en autobús (la referencia es ADO) o en furgoneta (Contratas los transfer en cualquier agencia), en los buses nocturnos hace frio así que llévate algo para taparte.

G0471257Ruinas, para nosotros las mejores ruinas son, sin duda, las de Palenque y las de Tikal, aunque con todo lo que se habla de Chichen Itzá es parada obligada, puedes aprovechar visitarla cuando vas de camino hacia arriba (Mérida o Campeche) y te ahorras un día, tiene un sitio donde dejar las mochilas y de allí, cuando termines, puedes pillar el bus a Mérida, nosotros las visitamos aprovechando que nos movíamos de Valladolid a Mérida.

GOPR1466Palenque, en realidad quitado de las ruinas tampoco hay mucho que hacer allí, lo que hicimos fue llegar ver las ruinas y contratar una excursión que salía al día siguiente pronto por la mañana, te sirve de excursión y traslado a San Cristóbal, sales pronto, te llevan a ver las cascadas de Misol-Hay, las de  Agua Azul y te dejan en San Cristóbal, es la mejor opción para moverse desde Palenque a San Cristóbal, contratarlo es fácil, cuando bajes del autobús en Palenque ya encontraras gente ofreciéndote esta opción.

Cruzar a Guatemala, nosotros fuimos en furgoneta desde San Cristóbal, lo puedes contratar en cualquier agencia de allí y van a Panajachel o Antigua, nosotros GOPR1742fuimos directos a Antigua, salen pronto por la mañana y tardas mucho, otra opción, si no quieres ir a Antigua ni al lago, es volver a Palenque y desde allí cruzar directo a Flores, nosotros queríamos ver Antigua, en ambos casos calcula todo el día.

En Guatemala, para mi Antigua, Flores y Tikal son imprescindibles,  para moverte de Antigua a Flores puedes coger un avión que tarda 1 hora o un bus que tarda 10 horas, la segunda opción es valida te ahorras una noche de hotel, puedes compra un billete “VIP” y vas casi en una cama, nosotros fuimos en Bus, en Antigua ya compramos el tour para Tikal, así que al llegar a Flores, prontísimo por la mañana, dejamos las mochilas en el Hotel y fuimos directos a Tikal.

GOPR2511Cruzar a Belice, en Flores encontraras agencias que organizan traslados a San Pedro y a Cayo Caulker, te incluyen el bus y el billete de barco, nosotros fuimos a Cayo Caulker.

Volver a México, si estas en Cayo Caulker o en San Pedro sin duda la mejor opción es ir en barco hasta Chetumal, hay 2  compañías que lo hacen en días alternos y hay varios sitios de venta en las Islas, al llegar a Chetumal, en el mismo puerto, encontraras furgonetas para seguir la ruta, en nuestro caso nos fuimos a Tulum.

Y aquí el mapa Sonrisa

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)