Métricas de Prometheus: ¿Cómo cambiar el nombre de la métrica?

Métricas de Prometheus: ¿Cómo cambiar el nombre de la métrica?

Encuentra una manera de redefinir y reorganizar el nombre de tus métricas de Prometheus para cumplir con tus requisitos

Prometheus se ha convertido en el nuevo estándar cuando hablamos de monitorear nuestra nueva arquitectura de aplicaciones modernas, y necesitamos asegurarnos de conocer todas sus opciones para asegurarnos de obtener lo mejor de él. Lo he estado usando durante algún tiempo hasta que me di cuenta de una característica que estaba desesperado por saber cómo hacer, pero no pude encontrar en ningún lugar claramente definido. Así que como no lo encontré fácilmente, pensé en escribir un pequeño artículo para mostrarte cómo hacerlo sin necesidad de gastar el mismo tiempo que yo.

Tenemos mucha información sobre cómo configurar Prometheus y usar algunos de los complementos de configuración habituales, como podemos ver en su página web oficial [1]. Incluso ya escribí sobre alguna configuración y usándolo para varios propósitos, como también puedes ver en otras publicaciones [2][3][4].

Uno de estos complementos de configuración es sobre el reetiquetado, y esto es algo genial. Tenemos que cada uno de los exportadores puede tener sus etiquetas y significado para ellas, y cuando intentas gestionar diferentes tecnologías o componentes hace complejo que todos ellos coincidan juntos incluso si todos ellos siguen la convención de nombres que tiene Prometheus [5].

Pero tuve esta situación, y estoy seguro de que tú también has pasado o pasarás por eso, que tengo métricas similares para diferentes tecnologías que para mí son las mismas, y necesito mantenerlas con el mismo nombre, pero como pertenecen a otras tecnologías no lo son. Así que necesito encontrar una manera de renombrar la métrica, y lo genial es que puedes hacer eso.

Para hacer eso, solo necesitas hacer una configuración de metric_relabel. Esta configuración se aplica para reetiquetar (como el nombre ya indica) etiquetas de tus métricas de prometheus en este caso antes de ser ingeridas, pero también nos permite usar algunos términos notables para hacer diferentes cosas, y uno de estos términos notables es __name__. __name__ es una etiqueta particular que te permitirá renombrar tus métricas de prometheus antes de ser ingeridas en la Base de Datos de Series Temporales de Prometheus. Y después de ese punto, esto será como si tuviera ese nombre desde el principio.

Cómo usar eso es relativamente fácil, es como cualquier otro proceso de reetiquetado, y me gustaría mostrarte un ejemplo sobre cómo hacerlo.

- source_labels: [__name__]
regex:  'jvm_threads_current'
target_label: __name__
replacement: 'process_thread_count'

Aquí hay un ejemplo simple para mostrar cómo podemos renombrar un nombre de métrica jvm_threads_current para contar los hilos dentro de la máquina JVM para hacerlo más genérico y poder incluir los hilos para el proceso en una métrica de prometheus process_thread_count que ahora podemos usar como si fuera el nombre original.


Referencias

[1] Prometheus: Configuración https://prometheus.io/docs/prometheus/latest/configuration/configuration/

[2] https://medium.com/@alexandrev/prometheus-monitoring-in-tibco-cloud-integration-96a6811416ce

[3] https://medium.com/@alexandrev/prometheus-monitoring-for-microservices-using-tibco-772018d093c4

[4] https://medium.com/@alexandrev/kubernetes-service-discovery-for-prometheus-fcab74237db6

[5] Prometheus: Nomenclatura de Métricas y Etiquetas https://prometheus.io/docs/practices/naming/

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Por qué deberíamos preocuparnos menos por pagar por servicios en línea

Por qué deberíamos preocuparnos menos por pagar por servicios en línea

Cuatro argumentos que cambian tu forma de pensar sobre esos gastos.

Si estás en tus treinta y tantos, probablemente seas como yo, y deberías recordar la vieja época de este mundo donde cada servicio en línea era gratuito. Vivíamos en un mundo donde la piratería era una situación normal. Todo, desde películas hasta música, desde libros hasta software era gratis. Podías encontrar rápidamente un torrent, un enlace de descarga directa, o incluso si eres más viejo, un enlace de Mule. ¿Todavía recuerdas Mule? Jaja, sí, yo también.

Nuestra generación se alejó de una era de «todo gratis sin la mejor calidad» a un enfoque de «pago por servicio». Y esta transición está siendo complicada. Así que, si ese es tu caso o conoces a alguien que usualmente tiene este tipo de pensamiento, intentaré explicar por qué deberías preocuparte menos por el costo de esos servicios.

1. No estamos evaluando esos gastos de la misma manera que lo hacemos con los servicios físicos

Ese es el primer tema, y me gustaría explicarlo un poco más. Imagina la suscripción a Medium, si no me equivoco, son 50€ al año por acceso ilimitado a esos artículos, y conozco a mucha gente que piensa que es caro, que no vale lo que ofrecen.

Las mismas personas pueden gastar 50€ al mes en una suscripción al gimnasio y no piensan que esto sea caro en absoluto. Así que, ahora, probablemente estés pensando algo como esto: ¡Vamos! ¡No eres justo! ¿Cómo te atreves a comparar la suscripción a Medium con una suscripción al gimnasio?

El gimnasio tiene una infraestructura física que necesitan mantener. Tienen personas trabajando allí, en la recepción, servicios de limpieza, entrenadores personales, etc. También tienen costos adicionales debido al uso de la infraestructura como electricidad, agua, impuestos, etc.

¡Sí, eso es cierto! ¿Y qué hay de Medium? ¿No tiene la misma situación? Tienen una infraestructura en la nube que necesitan mantener, servidores, red, almacenamiento, copias de seguridad, etc. También tienen personas trabajando en ello: en el sitio mismo, curadores, pero también desarrolladores, administradores de sistemas, etc., para realizar todas las tareas de mantenimiento para mantener el lugar al mejor nivel posible para que lo uses. Así que, esto no es diferente en absoluto en ambos casos. Pero este no es el único argumento.

2. ¡Los servicios en línea son increíblemente más baratos!

Ahora, en lugar de hablar de Medium, hablemos de una aplicación que podrías pensar que es cara. Hablemos de Netflix, que dependiendo de tu país puede tener una tarifa mensual de unos 15–20€.

Y puedes argumentar, pero no veo ni el 0.1% de su catálogo, ¿por qué debería pagar por todo si no voy a usar todo lo que ofrece?

Pero piensa en cuánto te costaron las entradas de cine la última vez que pudiste salir (Sí, sí, lo sé, este no es el mejor momento para hablar de cines y salir en esta situación, pero aguanta conmigo en esta).

Hagamos las cuentas conmigo: Dos personas yendo al cine, 10 € cada uno por las entradas. Si tienes algo más para beber o comer, podrías rápidamente gastar 35 € solo por una sesión de 2 horas.

Por supuesto, incluso con el mejor sistema de cine en casa, no es comparable en absoluto con lo que puedes sentir en una sesión de cine, pero ese no es el tema. El argumento es que si puedes permitirte una sesión de cine al mes (Sí, solo una al mes) y no sientes que estás desperdiciando tu dinero, puedes permitirte Netflix + Disney + Prime Video al mismo ritmo.

Y esto se aplica a todo. Siempre recomiendo cuando hablo de esto con otras personas comparar con algo físico que hacen sin pensarlo mucho, por ejemplo, un café matutino. Muchos de nosotros tomamos una taza de café para llevar cada día de nuestra vida laboral. Imagina un costo promedio de 1.5€, y cada mes tiene 20 días laborables, eso significa que estás gastando 30 € al mes solo en tu café matutino. Una vez más, la misma cantidad para tres servicios de streaming de video de primera.

La idea principal de este argumento no es que dejes de tomar esa primera taza de café que necesitas para que tu cuerpo funcione y se prepare para el día. Aún así, piensa que si no sientes mucho por ese café matutino, no deberías preocuparte tanto por la tarifa del servicio en línea también.

3. Puedes reevaluar tu decisión en cualquier momento

Además, otro argumento para no preocuparse mucho por esto es porque puedes revisarlo cada vez que quieras. El procedimiento aquí no es el mismo que usas para evaluar la compra de tu nuevo iPad, o si necesitas una laptop o un coche. Que necesitas estar muy seguro de que vas a sacarle el máximo provecho.

En este caso, esta es una tarifa recurrente que puedes cancelar en cualquier momento si crees que no la vas a usar o ves que no es tan útil como pensabas. Así que, no hay problema en probarlo por unos meses, y si no funciona, simplemente cancélalo. Así que, si tienes ese poder y opciones en tus manos, ¿por qué estás tan preocupado por dar ese paso de pagar por primera vez solo para probar?

Lo hacemos todo el tiempo en otros aspectos de la vida. Imagina la siguiente situación en el mercado, cuando ves una nueva marca de algo que vas a comprar. Puede ser yogur fresco, jugo fresco, o incluso una nueva cerveza. ¿Cuántas veces obtienes algo de una nueva marca, solo para probar? ¡Probablemente la respuesta sea TODO EL TIEMPO! Y sí, estás pagando por ello, no es como si fueras al cajero y le dijeras: No, no, déjame solo probar esto por varios meses y probablemente el próximo año pueda ver si vale la pena.

4. Estamos invirtiendo en nosotros mismos

Este argumento puede parecer extraño al principio porque parece más: No, no, no. Estoy invirtiendo en esta empresa, sus desarrolladores, y puedo sentirme feliz por ello, pero esto es una transacción. Sí, eso también es cierto, pero imagina eso. ¿Qué te pasa si todos los servicios que estás usando en línea desaparecen porque ya no es un negocio sustancial para ellos? ¿Va a afectar tu vida? Sí, seguro.

Solo recuerdo la primera aplicación que usé mucho que fue descontinuada y eliminada. Siempre he sido un chico de Linux, y he usado mucho una herramienta de gestión de tareas llamada BasKet como parte del entorno KDE que era similar a lo que hoy es OneNote. Podías juntar muchos tipos de contenido y gestionarlo como quisieras.

Era increíble, pero finalmente decidieron dejar de trabajar en la herramienta, y la herramienta no fue actualizada, y sí, eliminaron la herramienta. Mi vida cambió mucho. Necesitaba encontrar otra herramienta para hacer el mismo trabajo e imagina qué: No había ninguna en ese momento (estaba hablando de 2006 🙂 ). Así que mi vida fue peor porque nadie apoyó su esfuerzo al nivel que necesitaban para seguir haciéndolo. Así que, también deberías pensar eso, ¿cuánto me costará si esta aplicación X desaparece?

Conclusión

Así que, espero que estos argumentos puedan ayudarte a cambiar de opinión o ser útiles en tus conversaciones con otras personas que tienen esta idea de que todo debería ser gratis en el mundo en línea para ser más coherentes con la realidad en la que vivimos ahora. Así que, probemos nuevos servicios en línea, ¡y probablemente descubramos que nuestra vida en línea puede ser mejor!

Un nuevo concursante para destronar al Rey: Apache Pulsar

Un nuevo concursante para destronar al Rey: Apache Pulsar

Apache Kafka parece ser la solución estándar en la arquitectura actual, pero deberíamos centrarnos en si es la elección correcta para nuestras necesidades.

Hoy en día, estamos en una nueva era de Arquitectura Orientada a Eventos, y esta no es la primera vez que vivimos eso. Antes de los microservicios y la nube, EDA era la nueva normalidad en la integración empresarial. Basado en diferentes tipos de estándares, había protocolos como JMS o AMQP utilizados en productos basados en brokers como TIBCO EMS, Active MQ o IBM Websphere MQ, por lo que este enfoque no es algo nuevo.

Con el auge de las arquitecturas de microservicios y el enfoque liderado por API, parecía que habíamos olvidado la importancia de los sistemas de mensajería, y tuvimos que pasar por los mismos desafíos que vimos en el pasado para llegar a una nueva solución de mensajería para resolver ese problema. Así que estamos volviendo a la Arquitectura EDA, mecanismo pub-sub, para ayudarnos a desacoplar los consumidores y productores, moviéndonos de la orquestación a la coreografía, y todos estos conceptos encajan mejor en los mundos actuales con componentes cada vez más independientes que necesitan cooperación e integración.

Durante este esfuerzo, comenzamos a mirar nuevas tecnologías para ayudarnos a implementar eso nuevamente. Sin embargo, con la nueva realidad, olvidamos los protocolos y estándares pesados como JMS y comenzamos a pensar en otras opciones. Y debemos admitir que sentimos que hay un nuevo rey en esta área, y este es uno de los componentes críticos que parece ser, sin importar qué, en la arquitectura de hoy: Apache Kafka.

Y no me malinterpretes. Apache Kafka es fantástico, y ha sido probado durante mucho tiempo, una solución lista para producción, de alto rendimiento, con capacidades impresionantes para la reproducción y una API poderosa para facilitar la integración. Apache Kafka tiene algunos desafíos en este mundo nativo de la nube porque no se lleva tan bien con algunas de sus reglas.

Si has usado Apache Kafka durante algún tiempo, eres consciente de que hay desafíos particulares con él. Apache Kafka tiene una arquitectura que proviene de sus días en LinkedIn en 2011, donde Kubernetes o incluso Docker y las tecnologías de contenedores no eran una cosa, lo que hace que ejecutar Apache Kafka (servicio puramente con estado) de manera contenedorizada sea bastante complicado. Hay mejoras usando gráficos de helm y operadores para facilitar el viaje, pero aún así, no se siente como si las piezas pudieran integrarse bien de esa manera. Otra cosa es la geo-replicación que incluso con componentes como MirrorMaker, no es algo que se use, funcione sin problemas y se sienta integrado.

Otras tecnologías están tratando de proporcionar una solución para esas capacidades, y una de ellas es también otro proyecto de la Fundación Apache que ha sido donado por Yahoo! y se llama Apache Pulsar.

No me malinterpretes; esto no se trata de encontrar una nueva verdad, esa única solución de mensajería que es perfecta para las arquitecturas de hoy: no existe. En el mundo actual, con tantos requisitos y variables diferentes para los diferentes tipos de aplicaciones, una talla única ya no es cierta. Así que deberías dejar de pensar en cuál solución de mensajería es la mejor, y pensar más en cuál sirve mejor a tu arquitectura y cumple con los requisitos tanto técnicos como comerciales.

Hemos cubierto diferentes formas de comunicación general, con varias soluciones específicas para la comunicación sincrónica (tecnologías de malla de servicios y protocolos como REST, GraphQL o gRPC) y diferentes para la comunicación asincrónica. Necesitamos profundizar en la comunicación asincrónica para encontrar lo que funciona mejor para ti. Pero primero, hablemos un poco más sobre Apache Pulsar.

Apache Pulsar

Apache Pulsar, como se mencionó anteriormente, ha sido desarrollado internamente por Yahoo! y donado a la Fundación Apache. Como se indica en su sitio web oficial, hay varios puntos clave a mencionar al comenzar a explorar esta opción:

  • Funciones de Pulsar: Despliega fácilmente lógica de cómputo ligera usando APIs amigables para desarrolladores sin necesidad de ejecutar tu motor de procesamiento de flujos
  • Probado en producción: Apache Pulsar ha funcionado en producción a escala Yahoo durante más de tres años, con millones de mensajes por segundo a través de millones de temas
  • Escalabilidad horizontal: Expande la capacidad sin problemas a cientos de nodos
  • Baja latencia con durabilidad: Diseñado para baja latencia de publicación (< 5ms) a escala con fuertes garantías de durabilidad
  • Geo-replicación: Diseñado para replicación configurable entre centros de datos en múltiples regiones geográficas
  • Multi-tenencia: Construido desde cero como un sistema multi-tenant. Soporta Aislamiento, Autenticación, Autorización y Cuotas
  • Almacenamiento persistente: Almacenamiento persistente de mensajes basado en Apache BookKeeper. Proporciona aislamiento a nivel de IO entre operaciones de escritura y lectura
  • Bibliotecas de clientes: Modelos de mensajería flexibles con APIs de alto nivel para Java, C++, Python y GO
  • Operabilidad: API de administración REST para aprovisionamiento, administración, herramientas y monitoreo. Despliega en metal desnudo o Kubernetes.

Como podemos ver, en su diseño, Apache Pulsar está abordando algunas de las principales debilidades de Apache Kafka como la Geo-replicación y su enfoque nativo de la nube.

Apache Pulsar proporciona soporte para el patrón pub/sub, pero también ofrece muchas capacidades que también lo colocan como un sistema de mensajería de cola tradicional con su concepto de temas exclusivos donde solo uno de los suscriptores recibirá el mensaje. También proporciona conceptos y características interesantes utilizados en otros sistemas de mensajería:

  • Temas de Carta Muerta: Para mensajes que no pudieron ser procesados por el consumidor.
  • Temas Persistentes y No Persistentes: Para decidir si deseas persistir tus mensajes o no durante la transición.
  • Espacios de Nombres: Para tener una distribución lógica de tus temas, de modo que una aplicación pueda agruparse en espacios de nombres como lo hacemos, por ejemplo, en Kubernetes para poder aislar algunas aplicaciones de las otras.
  • Failover: Similar a exclusivo, pero cuando el consumidor adjunto falla al procesar, otro toma la oportunidad de procesar los mensajes.
  • Compartido: Para poder proporcionar un enfoque de round-robin similar al sistema de mensajería de cola tradicional donde todos los suscriptores estarán adjuntos al tema, pero solo uno recibirá el mensaje, y distribuirá la carga entre todos ellos.
  • Suscripciones Multi-tema: Para poder suscribirse a varios temas usando una expresión regular (similar al enfoque de Subject de TIBCO Rendezvous, por ejemplo, en los años 90) que ha sido tan poderoso y popular.

Pero también, si requieres características de Apache Kafka, aún tendrás conceptos similares como temas particionados, temas compartidos por clave, y así sucesivamente. Así que tienes todo a tu disposición para elegir qué tipo de configuración funciona mejor para ti y tus casos de uso específicos, también tienes la opción de mezclar y combinar.

Arquitectura de Apache Pulsar

La Arquitectura de Apache Pulsar es similar a otros sistemas de mensajería comparables hoy en día. Como puedes ver en la imagen a continuación del sitio web de Apache Pulsar, estos son los componentes principales de la arquitectura:

Un nuevo concursante para destronar al Rey: Apache Pulsar
  • Brokers: Uno o más brokers manejan mensajes entrantes de productores, despachan mensajes a consumidores
  • Cluster de BookKeeper para almacenamiento persistente de gestión de mensajes
  • Cluster de ZooKeeper para propósitos de gestión.

Así que puedes ver que esta arquitectura también es bastante similar a la de Apache Kafka nuevamente con la adición de un nuevo concepto del Cluster de BookKeeper.

El Broker en Apache Pulsar son componentes sin estado que principalmente ejecutarán dos piezas

  • Servidor HTTP que expone una API REST para gestión y es utilizado por consumidores y productores para búsqueda de temas.
  • Servidor TCP usando un protocolo binario llamado dispatcher que se utiliza para todas las transferencias de datos. Por lo general, los mensajes se despachan desde un caché de libro mayor gestionado por razones de rendimiento. Pero también si este caché crece demasiado, interactuará con el cluster de BookKeeper por razones de persistencia.

Para soportar la Replicación Global (Geo-Replicación), los Brokers gestionan replicadores que siguen las entradas publicadas en la región local y las republican en las regiones remotas.

El Cluster de Apache BookKeeper se utiliza como almacenamiento persistente de mensajes. Apache BookKeeper es un sistema de registro de escritura anticipada (WAL) distribuido que gestiona cuándo los mensajes deben ser persistidos. También soporta escalado horizontal basado en la carga y soporte multi-log. No solo los mensajes son persistentes sino también los cursores que son la posición del consumidor para un tema específico (similar al offset en la terminología de Apache Kafka)

Finalmente, el Cluster de Zookeeper se utiliza en el mismo rol que Apache Kafka como un cluster de almacenamiento de configuración de metadatos para todo el sistema.

Hola Mundo usando Apache Pulsar

Veamos cómo podemos crear un caso rápido de «Hola Mundo» usando Apache Pulsar como protocolo, y para hacer eso, vamos a intentar implementarlo de manera nativa en la nube. Así que haremos un cluster de un solo nodo de Apache Pulsar en una instalación de Kubernetes y desplegaremos una aplicación productora usando la tecnología Flogo y una aplicación consumidora usando Go. Algo similar a lo que puedes ver en el diagrama a continuación:

Un nuevo concursante para destronar al Rey: Apache Pulsar
Diagrama sobre el caso de prueba que estamos haciendo

Y vamos a intentar mantenerlo simple, así que solo usaremos docker puro esta vez. Así que, primero que nada, solo inicia el servidor de Apache Pulsar y para hacer eso usaremos el siguiente comando:

docker run -it -p 6650:6650 -p 8080:8080 --mount source=pulsardata,target=/pulsar/data --mount source=pulsarconf,target=/pulsar/conf apachepulsar/pulsar:2.5.1   bin/pulsar standalone

Y veremos una salida similar a esta:

Un nuevo concursante para destronar al Rey: Apache Pulsar

Ahora, necesitamos crear aplicaciones simples, y para eso, se utilizarán Flogo y Go.

Comencemos con el productor, y en este caso, usaremos la versión de código abierto para crear una aplicación rápida.

Primero que nada, solo usaremos la interfaz web (dockerizada) para hacer eso. Ejecuta el comando:

docker run -it -p 3303:3303 flogo/flogo-docker eula-accept

E instalamos una nueva contribución para habilitar la actividad del publicador de Pulsar. Para hacer eso, haremos clic en el botón «Instalar nueva contribución» y proporcionaremos la siguiente URL:

flogo install github.com/mmussett/flogo-components/activity/pulsar

Y ahora crearemos un flujo simple como puedes ver en la imagen a continuación:

Un nuevo concursante para destronar al Rey: Apache Pulsar

Ahora construiremos la aplicación usando el menú, ¡y eso es todo!

Un nuevo concursante para destronar al Rey: Apache Pulsar

Para poder ejecutar, solo lanza la aplicación como puedes ver aquí:

./sample-app_linux_amd64

Ahora, solo necesitamos crear el consumidor en Go-lang para poder hacer eso necesitamos instalar el paquete golang:

go get github.com/apache/pulsar-client-go/pulsar

Y ahora necesitamos crear el siguiente código:

package main
import (
 “fmt”
 “log”
 “github.com/apache/pulsar-client-go/pulsar”
)
func main() {
 client, err := pulsar.NewClient(pulsar.ClientOptions{URL: “pulsar://localhost:6650”})
 if err != nil {
 log.Fatal(err)
 }
defer client.Close()
channel := make(chan pulsar.ConsumerMessage, 100)
options := pulsar.ConsumerOptions{
 Topic: “counter”,
 SubscriptionName: “my-subscription”,
 Type: pulsar.Shared,
 }
options.MessageChannel = channel
consumer, err := client.Subscribe(options)
 if err != nil {
 log.Fatal(err)
 }
defer consumer.Close()
// Recibe mensajes del canal. El canal devuelve una estructura que contiene el mensaje y el consumidor de donde
 // se recibió el mensaje. No es necesario aquí ya que tenemos un solo consumidor, pero el canal podría ser
 // compartido entre múltiples consumidores también
 for cm := range channel {
 msg := cm.Message
 fmt.Printf(“Mensaje recibido msgId: %v — contenido: ‘%s’n”,
 msg.ID(), string(msg.Payload()))
consumer.Ack(msg)
}
}

Y después de ejecutar ambos programas, puedes ver la siguiente salida como puedes ver, pudimos comunicar ambas aplicaciones en un flujo sin esfuerzo.

Un nuevo concursante para destronar al Rey: Apache Pulsar

Este artículo es solo un punto de partida, y continuaremos hablando sobre cómo usar Apache Pulsar en tus arquitecturas. Si deseas echar un vistazo al código que hemos utilizado en este ejemplo, puedes encontrarlo aquí:

Estamos haciendo mal el enfoque del trabajo remoto

Estamos haciendo mal el enfoque del trabajo remoto

Sé que todos vivimos en una situación muy complicada que nos ha obligado a trabajar bajo un conjunto diferente de reglas, tratando de ponernos al día para ser productivos y trabajar como solíamos hacerlo, pero en modo de trabajo completamente remoto.

Para algunos de nosotros, esto ha sido bastante fácil porque las personas que trabajan en la industria tecnológica, en cierto nivel, ya trabajan de forma remota. Especialmente las personas, como yo, que trabajan para empresas internacionales con equipos de diferentes ubicaciones, zonas horarias, etc., estábamos acostumbrados a algunas partes del proceso. Las herramientas que usábamos como Slack, Zoom, Microsoft Team o Google Meet no eran algo nuevo para nosotros.

Además, estábamos acostumbrados a gestionar diferentes zonas horarias en nuestras reuniones para poder encontrar un momento adecuado para todos nosotros y poder compartir nuestra experiencia, etc. Así que parecía que íbamos a hacerlo perfectamente. Pero, ese no es el caso, y ha sido bastante para todos.

Solo déjame hacerte una pregunta: ¿Cómo está tu calendario ahora comparado con cómo estaba antes de la pandemia? ¿Cuántas horas tienes dedicadas solo a reuniones internas?

Si buscas un poco, incluso aquí en Medium, podrías encontrar muchos ejemplos sobre esto, también si escuchas el podcast ya estás al tanto de esta situación, cada uno de nosotros sabe sobre esa situación o simplemente la hemos experimentado nosotros mismos.

Parece que estábamos tratando de cambiar de las conversaciones habituales que teníamos en la oficina o con clientes a una conferencia en línea de unos 30 minutos para ponernos al día sobre cualquier otro tema que solíamos manejar en un café rápido en la oficina o simplemente una llamada rápida de 2 minutos.

Aunque la mayoría de nosotros hemos crecido en el mundo de la mensajería instantánea y no quiero hablar de las «nuevas cosas» si podemos llamar a WhatsApp, Telegram o Slack de esa manera, lo estábamos haciendo desde hace mucho tiempo, con AOL, ICQ o IRC.

Nos hemos entrenado en la comunicación asincrónica, pero parece que no aprendimos nada de ella. ¿Cuántas reuniones podrían ser reemplazadas por un hilo de correo electrónico? ¿Cuántas reuniones podrían ser reemplazadas por un canal de Slack?

Estamos acostumbrados a pensar de la otra manera, que la reunión es mucho más efectiva que un hilo de correo, y eso posiblemente sea cierto en algunos casos. Finalmente, tenemos a todos los interesados al mismo tiempo en el mismo lugar hablando sobre el mismo tema, lo que hace que el tiempo dedicado al asunto sea menor.

Pero el problema es cuando el número de conversaciones y temas crece exponencialmente porque también necesitamos trabajar en base a eso. Acabamos de escuchar a un colega mío hace unos días decir algo como esto:

  • Ahora tengo todo el día bloqueado con reuniones
  • Para cada una de estas reuniones, termino con tareas que necesito trabajar.
  • Pero basado en lo lleno que está mi calendario, tengo menos tiempo para trabajar en ellas
  • Cada día tengo más trabajo por hacer y no puedo cumplir con mis plazos

Y este ciclo se repite una y otra vez y empeora la situación cada día, porque es cierto que estamos pasando mucho tiempo en reuniones, pero no solo eso, también las reuniones son bastante más agotadoras, lo que te deja con menos energía para trabajar en esos puntos de acción que recopilaste.

Además, está el horario del calendario, ya que tienes tantas reuniones que no puedes bloquear parte de tu tiempo más productivo para trabajar en esos elementos, y te ves obligado a trabajar en ellos solo en los espacios libres que tienes disponibles entre todas esas reuniones. Eso significa que no estás eligiendo lo que vas a hacer ahora, solo necesitas luchar para poder encontrar algún espacio para poder despejar un poco tu escritorio de esas tareas pendientes.

Entonces, ¿parece que el correo electrónico y la comunicación asincrónica son la respuesta a todo lo que estamos sufriendo ahora? No. Probablemente no, pero al menos la comunicación asincrónica se centra en varios conceptos clave que son importantes tener en cuenta:

Tu tiempo es tan valioso como el de cualquier otro.

Cuando eres el organizador de una reunión y tienes una lista de asistentes, probablemente la importancia del tema a discutir no será la misma para cada uno de ellos. Probablemente para ti como organizador eres el más interesado en organizar esa reunión y obtener algún resultado de ella, pero otros probablemente tengan otras cosas importantes en sus mentes también a esos niveles.

Por lo tanto, la comunicación asincrónica permite a todos manejar sus prioridades y actuar sobre cada elemento según puedan basarse en su lista de prioridades.

La flexibilidad es la clave

No estoy obligado a estar a las 9 PM mi hora para poder reunirme con mis colegas de EE. UU. o mis colegas indios no están obligados a hacerlo al mismo tiempo conmigo. La comunicación asincrónica permite a cualquiera atender los asuntos importantes durante el tiempo en que son más productivos y también poder gestionar su propio horario y tiempo.

Para mí puede ser mejor responder a esas preguntas durante mis horas de la mañana o al revés, prefiero centrarme en algunas tareas al comienzo de mi día y usar la tarde para cubrir esas.

La gestión también es necesaria para las conversaciones asincrónicas

El problema de la comunicación asincrónica, como sabemos, es que las cosas pueden ralentizarse porque, basándonos en los temas anteriores, las preguntas podrían necesitar más tiempo para responderse, pero esto se puede resolver utilizando la gestión de esas conversaciones. Cosas como plazos, recordatorios, conversaciones de seguimiento 1 a 1 podrían ayudar a cerrar los temas. El rol es el mismo que el del organizador de la reunión en la reunión en línea, pero utilizando herramientas asincrónicas.

Malentendidos entre lo escrito y lo hablado

Usualmente decimos que es más fácil no captar el significado completo de la conversación en un mundo asincrónico porque carecemos de muchos recursos que tenemos en nuestra reunión en línea o incluso mejor en nuestras reuniones cara a cara. Y eso es cierto. Incluso, con emojis y demás, no tenemos la misma caja de herramientas que tenemos usando nuestra voz o nuestro cuerpo para hacerlo, pero esto no es algo que no se resuelva también en los otros tipos de comunicación. ¿Cuántas veces pensamos que lo que otra persona estaba diciendo usando su voz tiene un significado diferente comparado con lo que realmente intentó decir? Tratamos de resolver eso con las actas de la reunión y tratando de ponerlo por escrito para poder tener un entendimiento común. Y probablemente esto es algo que evitamos en la comunicación asincrónica porque esto ya está escrito, pero esto no debería evitarse ya que también nos ayuda a poner todo junto nuevamente en la misma página sobre nuestro entendimiento común.

Conclusión

Así que, espero que todos aprendamos de esta situación para tratar de mejorar la forma en que nos comunicamos entre nosotros para ser más productivos y más eficientes y también para mejorar nuestro propósito de gestión del tiempo. Y soy consciente de que probablemente esta no sea la situación para todos nosotros, pero esto es bastante común y es importante tenerlo en cuenta incluso si somos capaces de tener éxito durante este tsunami de reuniones que enfrentamos cada día.

Además, mis expectativas son que probablemente todo lo que aprendamos en esta situación pueda ayudarnos a estar más preparados para la próxima o para nuestro trabajo diario cuando volvamos a la nueva situación normal si esto va a suceder en algún momento.

Aplicaciones Flogo ejecutándose como Funciones de Azure

Aplicaciones Flogo ejecutándose como Funciones de Azure

Serverless ya está aquí. Lo sabemos. Incluso para las empresas que están comenzando su viaje en la nube moviéndose a plataformas basadas en contenedores, ya saben que serverless está en su visión futura al menos para algunos casos de uso específicos.

Su simplicidad sin necesidad de preocuparse por nada relacionado con la plataforma solo se enfoca en el código y también la economía que viene con ellos hace que este modelo de computación sea un cambio de juego.

La plataforma principal para este enfoque en este momento es AWS Lambda de Amazon, hemos leído y escuchado mucho sobre AWS Lambda, pero todas las plataformas van por ese camino. Google con sus Google Functions, Microsoft con su Azure. Esto no es solo una cosa para los proveedores de nube pública, también si estás operando en un enfoque de nube privada puedes usar este modo de implementación usando frameworks como KNative o OpenFaaS. Si necesitas más detalles al respecto, también tuvimos algunos artículos sobre este tema:

Todas estas plataformas están actualizando y mejorando su opción para ejecutar cualquier tipo de código que desees en ellas, y esto es lo que Azure Function acaba de anunciar hace unas semanas, el lanzamiento de un enfoque de Custom Handler para soportar cualquier tipo de lenguaje que puedas imaginar:

Y vamos a probar eso haciendo lo que más nos gusta ………..

…. ¡Ejecutar una aplicación Flogo sobre eso!

Así que, ¡empecemos a trabajar!

Aplicaciones Flogo ejecutándose como Funciones de Azure
Foto de Serghei Trofimov en Unsplash

Lo primero que necesitamos hacer es crear nuestra aplicación Flogo. Voy a usar Flogo Enterprise para hacer eso, pero puedes hacer lo mismo usando la versión de código abierto también:

Vamos a crear una aplicación simple, solo un servicio REST de Hello World. Como puedes ver aquí:

Aplicaciones Flogo ejecutándose como Funciones de Azure

El archivo JSON de la aplicación Flogo puedes encontrarlo en el repositorio de GitHub que se muestra a continuación:

Pero las configuraciones principales son las siguientes:

  • El servidor escuchará en el puerto especificado por la variable de entorno FUNCTIONS_HTTPWORKER_PORT
  • El servidor escuchará una solicitud GET en la URI /hello-world
  • La respuesta será bastante simple “Invocando una aplicación Flogo dentro de Azure Functions”

Ahora, que tenemos el archivo JSON, solo necesitamos comenzar a crear los artefactos necesarios para ejecutar una función de Azure.

Necesitaremos instalar el paquete npm para las Azure Functions. Para hacer eso necesitamos ejecutar el siguiente comando:

npm i -g azure-functions-core-tools@3 --unsafe-perm true

Es importante tener el “@3” porque de esa manera hacemos referencia a la versión que tiene esta nueva lógica de Custom Handler para poder ejecutarla.

Crearemos una nueva carpeta llamada flogo-func y ejecutaremos el siguiente comando dentro de esa carpeta:

func init --docker

Ahora deberíamos seleccionar node como el entorno de ejecución a usar y javascript como el lenguaje. Eso podría ser algo extraño porque no vamos a usar ni node, ni dotnet ni python ni powershell. Pero seleccionaremos eso para mantenerlo simple ya que solo intentamos enfocarnos en el enfoque de Docker para hacerlo.

Después de eso solo necesitamos crear una nueva función, y para hacer eso necesitamos escribir el siguiente comando:

func new

En la interfaz basada en CLI que nos muestra las Azure Function Core Tools, solo necesitamos seleccionar HTTP trigger y proporcionar un nombre.

Aplicaciones Flogo ejecutándose como Funciones de Azure

En nuestro caso, usaremos hello-world como el nombre para mantenerlo similar a lo que definimos como parte de nuestra aplicación Flogo. Terminaremos con la siguiente estructura de carpetas:

Aplicaciones Flogo ejecutándose como Funciones de Azure

Ahora necesitamos abrir la carpeta que se ha creado y necesitamos hacer varias cosas:

  • Primero que todo, necesitamos eliminar el archivo index.js porque no necesitamos ese archivo ya que esta no será una función de node JS.
  • Necesitamos copiar el HelloWorld.json (nuestra aplicación Flogo) a la carpeta raíz de la función.
  • Necesitamos cambiar el archivo host.json al siguiente contenido:
{
  "version": "2.0",
  "httpWorker": {
     "description": {
            "arguments": ["-app"],
            "defaultExecutablePath": "engine-windows-amd64.exe",
            "defaultWorkerPath": "HelloWorld.json"
      }
   }
}

Ahora, necesitamos generar el engine-windows-amd64.exe y para poder hacer eso necesitamos ir al FLOGO_HOME en nuestra máquina e ir a la carpeta FLOGO_HOME/flogo/<VERSION>/bin y lanzar el siguiente comando:

./builder-windows-amd64.exe build

Y deberías obtener el engine-windows-amd64.exe como salida como puedes ver en la imagen a continuación:

Aplicaciones Flogo ejecutándose como Funciones de Azure

Ahora, solo necesitas copiar ese archivo dentro de la carpeta de tu función, y deberías tener la siguiente estructura de carpetas como puedes ver aquí:

Aplicaciones Flogo ejecutándose como Funciones de Azure

Y una vez que tengas eso, solo necesitas ejecutar tu función para poder probarla localmente:

func start

Después de ejecutar ese comando deberías ver una salida similar a la que se muestra a continuación:

Aplicaciones Flogo ejecutándose como Funciones de Azure

¡Solo me gustaría resaltar el tiempo de inicio para nuestra aplicación Flogo alrededor de 15 milisegundos! Ahora, solo necesitas probarlo usando cualquier navegador y solo ir a la siguiente URL:

http://localhost:7071/api/hello-world
Aplicaciones Flogo ejecutándose como Funciones de Azure

Este ha sido solo el primer paso en nuestro viaje, pero fueron los pasos necesarios para poder ejecutar nuestra aplicación Flogo como parte de tu entorno serverless alojado por la plataforma Microsoft Azure!

¡Bienvenido a la Revolución AsyncAPI!

¡Bienvenido a la Revolución AsyncAPI!

Estamos viviendo en una era donde las tecnologías están cambiando estándares todo el tiempo. Olvidas leer Medium/Stackoverflow/Reddit y descubres que hay al menos cinco (5) nuevos estándares de la industria que están reemplazando a los existentes que conoces (aquellos que han sido lanzados hace algo así como un año 🙂 ).

¿Todavía recuerdas los viejos tiempos cuando SOAP era el formato imbatible? ¿Cuánto tiempo pasamos construyendo nuestros Servicios SOAP en nuestras empresas? REST lo reemplazó como el nuevo estándar… pero solo unos pocos años y estamos de vuelta en una nueva batalla solo por la comunicación sincrónica: gRPC, GraphQL, están aquí para conquistar todo de nuevo. Es una locura, ¿eh?

Pero la situación es similar para la comunicación asincrónica. La comunicación asincrónica ha estado aquí por mucho tiempo. Incluso, mucho antes de que los términos Arquitectura Orientada a Eventos o Streaming fueran realmente un término «cool» o algo de lo que estuvieras al tanto.

Hemos estado usando estos patrones durante tanto tiempo en nuestras empresas. Las grandes empresas han estado usando este modelo en sus integraciones empresariales durante mucho tiempo. Protocolos y tecnologías basados en Pub/Sub como TIBCO Rendezvous se han estado usando desde finales de los 90, y luego también incorporamos enfoques más estándar como JMS usando diferentes tipos de servidores para tener todas estas comunicaciones basadas en eventos.

Pero ahora con la revolución nativa de la nube, la necesidad de computación distribuida, más agilidad, más escalabilidad, las soluciones centralizadas ya no son válidas, y hemos visto una explosión en el número de opciones para comunicarse basadas en estos patrones.

Podrías pensar que esta es la misma situación que estábamos discutiendo al principio de este artículo con respecto a la predominancia de REST y las nuevas tecnologías de vanguardia tratando de reemplazarlo, pero esto es algo bastante diferente. Porque la experiencia nos ha dicho que una sola talla no sirve para todos.

No puedes encontrar una sola tecnología o componente que pueda proporcionar todas las necesidades de comunicación que necesitas para todos tus casos de uso. Puedes nombrar cualquier tecnología o protocolo que desees: Kafka, Pulsar, JMS, MQTT, AMQP, Thrift, FTL, y así sucesivamente.

Piense en cada uno de ellos y probablemente encontrará algunos casos de uso en los que una tecnología funciona mejor que las otras, por lo que no tiene sentido tratar de encontrar una solución tecnológica única para cubrir todas las necesidades. Lo que se necesita es más un enfoque políglota cuando tienes diferentes tecnologías que funcionan bien juntas y usas la que mejor funciona para tu caso de uso (el enfoque de la herramienta adecuada para el trabajo adecuado) como estamos haciendo para las diferentes tecnologías que estamos desplegando en nuestro clúster.

Probablemente no vamos a usar la misma tecnología para hacer un Microservicio basado en Aprendizaje Automático, que una Aplicación de Streaming, ¿verdad? El mismo principio se aplica aquí.

Pero el problema aquí cuando intentamos hablar sobre diferentes tecnologías trabajando juntas es sobre la estandarización. Si pensamos en REST, gRPC o GraphQL, aunque son diferentes, juegan basados en algunos fundamentos comunes. Se basan en el mismo protocolo HTTP para un estándar, por lo que es fácil soportar todos ellos en la misma arquitectura.

Pero esto no es cierto con las tecnologías sobre Comunicación Asincrónica. Y me gustaría centrarme en la estandarización y especificación hoy. Y eso es lo que la Iniciativa AsyncAPI está tratando de resolver. Y para definir qué es AsyncAPI me gustaría usar sus propias palabras de su sitio web oficial:

AsyncAPI es una iniciativa de código abierto que busca mejorar el estado actual de las Arquitecturas Orientadas a Eventos (EDA). Nuestro objetivo a largo plazo es hacer que trabajar con EDA sea tan fácil como trabajar con APIs REST. Eso va desde la documentación hasta la generación de código, desde el descubrimiento hasta la gestión de eventos. La mayoría de los procesos que aplicas a tus APIs REST hoy en día también serían aplicables a tus APIs orientadas a eventos/asincrónicas.

Entonces, su objetivo es proporcionar un conjunto de herramientas para tener un mundo mejor en todas esas arquitecturas EDA que todas las empresas tienen o están comenzando a tener en este momento y todo gira en torno a una cosa: La Especificación OpenAPI.

Similar a la especificación OpenAPI, nos permite definir una interfaz común para nuestras Interfaces EDA y la parte más importante es que esto es multicanal. Así que la misma especificación puede ser utilizada para tu API basada en MQTT o tu API de Kafka. Veamos cómo se ve esta Especificación AsyncAPI:

¡Bienvenido a la Revolución AsyncAPI!
Definición AsyncAPI 2.0 (de https://www.asyncapi.com/docs/getting-started/coming-from-openapi/)

Como puedes ver, es muy similar a OpenAPI 3.0 y ya lo han hecho con el propósito de facilitar la transición entre OpenAPI 3.0 y AsyncAPI y también para tratar de unir ambos mundos: Se trata más de solo API, no importa si son sincrónicas o asincrónicas y proporcionar los mismos beneficios con respecto al ecosistema de una a otra.

¡Muéstrame el código!

Pero dejemos de hablar y comencemos a codificar y para hacer eso me gustaría usar una de las herramientas que en mi opinión tiene el mayor soporte para AsyncAPI, y eso es Project Flogo.

Probablemente recuerdes algunas de las diferentes publicaciones que he hecho con respecto a Project Flogo y TIBCO Flogo Enterprise como una gran tecnología para usar en el desarrollo de tus microservicios (enfoque de bajo código/todo código, basado en Golang, muchos conectores y extensiones de código abierto también).

Pero hoy vamos a usarlo para crear nuestro primer microservicio compatible con AsyncAPI. Y vamos a confiar en eso porque proporciona un conjunto de extensiones para apoyar la iniciativa AsyncAPI como puedes ver aquí:

Así que lo primero que vamos a hacer es crear nuestra definición AsyncAPI y para hacerlo más simple, vamos a usar la muestra que tenemos disponible en el OpenAsync API con un simple cambio: Vamos a cambiar del protocolo AMQP al protocolo Kafka porque esto es genial en estos días, ¿no? 😉

asyncapi: '2.0.0'
info:
  title: Aplicación Hola Mundo
  version: '0.1.0'
servers:
  production:
    url: broker.mycompany.com
    protocol: kafka
    description: Este es el broker de "Mi Empresa".
    security:
      - user-password: []
channels:
  hello:
    publish:
      message:
        $ref: '#/components/messages/hello-msg'
  goodbye:
    publish:
      message:
        $ref: '#/components/messages/goodbye-msg'
components:
  messages:
    hello-msg:
      payload:
        type: object
        properties:
          name:
            type: string
          sentAt:
            $ref: '#/components/schemas/sent-at'
    goodbye-msg:
      payload:
        type: object
        properties:
          sentAt:
            $ref: '#/components/schemas/sent-at'
  schemas:
    sent-at:
      type: string
      description: La fecha y hora en que se envió un mensaje.
      format: datetime
  securitySchemes:
    user-password:
      type: userPassword

Como puedes ver, algo simple. Dos operaciones «hello» y «goodbye» con carga útil sencilla:

  • name: Nombre que vamos a usar para el saludo.
  • sentAt: La fecha y hora en que se envió un mensaje.

Así que lo primero que vamos a hacer es crear una Aplicación Flogo que cumpla con esa especificación AsyncAPI:

git clone https://github.com/project-flogo/asyncapi.git
cd asyncapi/
go install

Ahora tenemos el instalador del generador, así que solo necesitamos ejecutar y proporcionar nuestro YML como entrada en el siguiente comando:

asyncapi -input helloworld.yml -type flogodescriptor

Y crearemos una aplicación HelloWorld para nosotros, que necesitamos ajustar un poco. Solo para que puedas estar en funcionamiento rápidamente, solo estoy compartiendo el código en mi repositorio de GitHub que puedes tomar de allí (Pero realmente te animo a que te tomes el tiempo para echar un vistazo al código para ver la belleza del Desarrollo de Aplicaciones Flogo 🙂 )

https://github.com/project-flogo/asyncapi

Ahora, que ya tenemos la aplicación, tenemos solo una aplicación simple que nos permite recibir el mensaje que cumple con la especificación, y en nuestro caso solo registrar la carga útil, lo que puede ser nuestro punto de partida para construir nuestros nuevos Microservicios Orientados a Eventos compatibles con AsyncAPI.

Así que, probémoslo, pero para hacerlo, necesitamos algunas cosas. Primero que nada, necesitamos un servidor Kafka en funcionamiento y para hacerlo de manera rápida vamos a aprovechar el siguiente archivo docker-compose.yml:

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    expose:
    - "2181"
  kafka:
    image: wurstmeister/kafka:2.11-2.0.0
    depends_on:
    - zookeeper
    ports:
    - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

Y para ejecutar eso solo necesitamos lanzar el siguiente comando desde la misma carpeta donde tenemos este archivo llamado docker-compose.yml:

docker-compose up -d

Y después de hacer eso, solo necesitamos una aplicación de muestra y qué mejor que usar Flogo nuevamente para crearla, pero esta vez, usemos el Visor Gráfico para crearla de inmediato:

¡Bienvenido a la Revolución AsyncAPI!
Aplicación Flogo Simple para enviar un mensaje compatible con AsyncAPI cada minuto usando Kafka como protocolo

Así que solo necesitamos configurar la actividad Publicar Kafka para proporcionar el broker (localhost:9092), el tema (hello) y el mensaje :

{
"name": "hola mundo",
"sentAt": "2020-04-24T00:00:00"
}

¡Y eso es todo! ¡Ejecutémoslo!:

Primero iniciamos el Microservicio Flogo AsyncAPI:

¡Bienvenido a la Revolución AsyncAPI!
¡Microservicios Flogo AsyncAPI Iniciados!

Y luego solo lanzamos el probador, que va a enviar el mismo mensaje cada minuto, como puedes ver en la imagen a continuación:

¡Bienvenido a la Revolución AsyncAPI!
Probador de Muestra enviando mensajes de muestra

Y cada vez que enviamos ese mensaje, va a ser recibido en nuestro Microservicio Flogo AsyncAPI:

¡Bienvenido a la Revolución AsyncAPI!

Así que, espero que esta primera introducción al mundo AsyncAPI haya sido de tu interés, pero no olvides echar un vistazo a más recursos en su propio sitio web:

Procesamiento por lotes de Kubernetes usando TIBCO BW

Procesamiento por lotes de Kubernetes usando TIBCO BW

Todos sabemos que con el auge del desarrollo y las arquitecturas nativas de la nube, hemos visto plataformas basadas en Kubernetes como el nuevo estándar, todas enfocándose en nuevos desarrollos siguiendo los nuevos paradigmas y mejores prácticas: Microservicios, Arquitecturas impulsadas por eventos, nuevos protocolos brillantes como GraphQL o gRPC, y así sucesivamente.

Pero debemos ser conscientes de que la mayoría de las empresas que hoy están adoptando estas tecnologías no son oportunidades de campo verde. Tienen muchos sistemas ya en funcionamiento con los que todos los nuevos desarrollos en las nuevas arquitecturas nativas de la nube necesitan interactuar, por lo que las reglas se vuelven más complejas y hay muchas tonalidades de gris cuando estamos creando nuestra aplicación en Kubernetes.

Y basado en mi experiencia, cuando estamos hablando con el cliente sobre la nueva arquitectura en la nube, la mayoría de ellos traen aquí el patrón por lotes. Saben que esto ya no es una mejor práctica, que no pueden seguir construyendo sus sistemas de manera por lotes tratando de hacer por la noche lo que deberíamos estar haciendo en tiempo real. Pero, la mayoría de las veces necesitan coexistir con los sistemas que ya tienen y podría ser necesario este tipo de procedimiento. Así que necesitamos encontrar una manera de proporcionar Procesamiento por Lotes en Kubernetes.

También para los clientes que ya tienen sus aplicaciones existentes usando ese patrón y quieren moverse al nuevo mundo, es mejor para ellos que puedan hacerlo sin necesidad de re-arquitectar su aplicación existente. Algo que probablemente terminarán haciendo pero a su propio ritmo.

Los patrones de procesamiento por lotes en el desarrollo de TIBCO son un patrón bastante utilizado y tenemos clientes en todo el mundo con este tipo de desarrollo usado en producción durante muchos años. Ya sabes, este tipo de proceso que se ejecuta en un momento específico (semanalmente los lunes, cada día a las 3 PM… o simplemente cada hora para hacer algún trabajo regular).

Es un patrón sencillo aquí. Simplemente agrega un temporizador que puedes configurar cuándo se lanzará y agrega tu lógica. Eso es todo. Tan simple como eso:

Procesamiento por lotes de Kubernetes usando TIBCO BW
Patrón por Lotes Simple usando TIBCO BusinessWorks

Pero, ¿cómo se puede traducir esto a un enfoque de Kubernetes? ¿Cómo podemos crear aplicaciones que funcionen con este patrón y aún así ser gestionadas por nuestra plataforma? Afortunadamente, esto es algo que se puede hacer, y también tienes diferentes maneras de hacerlo dependiendo de lo que quieras lograr.

Principalmente hoy vamos a describir dos maneras de poder hacer eso y tratar de explicar las principales diferencias entre una y otra para que puedas saber cuál deberías usar dependiendo de tu caso de uso. A esos dos métodos los voy a llamar de esta manera: Lote gestionado por TIBCO Kubernetes y enfoque de API de Cron Job


Lote Gestionado por TIBCO

Este es el más simple. Es exactamente el mismo enfoque que tienes en tu aplicación BusinessWorks existente en las instalaciones, solo que desplegado en el clúster de Kubernetes.

Así que, no necesitas cambiar nada en tu lógica, solo tendrás una aplicación que es iniciada por un Temporizador con su configuración respecto a la programación dentro del alcance de la aplicación BusinessWorks y eso es todo.

Solo necesitas proporcionar los artefactos necesarios para desplegar tu aplicación en Kubernetes como cualquier otra aplicación de TIBCO BusinessWorks y eso es todo. Eso significa que estás creando un Despliegue para lanzar este componente y siempre tendrás un pod en ejecución evaluando cuándo la condición es verdadera para lanzar el proceso como lo tienes en tu enfoque en las instalaciones.

API de Cron-Job de Kubernetes

El patrón de procesamiento por lotes es algo que ya está cubierto de manera predeterminada por la API de Kubernetes y por eso tenemos el concepto de Cron-Job. Probablemente recuerdes los Cron Jobs que tenemos en nuestras máquinas Linux. Si eres un desarrollador o un administrador de sistemas, estoy seguro de que has jugado con estos cronjobs para programar tareas o comandos para que se ejecuten en un momento determinado. Si eres una persona basada en Windows, este es el equivalente en Linux de tus Trabajos del Programador de Tareas de Windows. Mismo enfoque.

Procesamiento por lotes de Kubernetes usando TIBCO BW
crontab en un Sistema Linux

Y esto es muy simple, solo necesitas crear un nuevo artefacto usando esta API de Cron Job que principalmente dice el trabajo a ejecutar y la programación de ese trabajo similar a lo que hemos hecho en el pasado con el cronjob en nuestra máquina Linux:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hola desde el clúster de Kubernetes
          restartPolicy: OnFailure

Los trabajos que podemos usar aquí deben cumplir con una regla única que también se aplica en los trabajos cron de Unix: El comando debe terminar cuando el trabajo esté hecho.

Y esto es algo que es crítico, lo que significa que nuestro contenedor debe salir cuando el trabajo esté hecho para poder ser usado dentro de este enfoque. Eso significa que no podemos usar un “enfoque de servidor” como estamos haciendo en el enfoque anterior porque en ese caso, el pod nunca termina. ¿Significa eso que no puedo usar una aplicación de TIBCO BusinessWorks como parte de un Cron Job de Kubernetes? ¡Absolutamente no! Veamos cómo puedes hacerlo.

Así que, deberíamos centrarnos en dos cosas, la lógica de negocio debería poder ejecutarse tan pronto como el proceso comience y el contenedor debería terminar tan pronto como el trabajo esté hecho. Comencemos con la primera.

La primera es fácil. Usemos nuestro ejemplo anterior: Enfoque por lotes simple que escribe una traza de registro cada minuto. Necesitamos hacer que comience tan pronto como el proceso haya comenzado, pero esto es bastante de serie (OOTB) con TIBCO BusinessWorks, solo necesitamos configurar ese temporizador para que se ejecute solo una vez y eso comenzará tan pronto como la aplicación esté en ejecución:

Procesamiento por lotes de Kubernetes usando TIBCO BW

Así que, ya tenemos el primer requisito solucionado, veamos con el otro.

Deberíamos poder terminar el contenedor completamente cuando el proceso termine y eso es un desafío porque la aplicación BusinessWorks no se comporta de esa manera. Se supone que deben estar siempre en ejecución. Pero esto también se puede resolver.

Lo único que necesitamos es hacer uso de un comando al final del flujo. Es como un comando de salida en nuestro script de shell o código Java para terminar el proceso y el contenedor. Para hacer eso, deberíamos agregar una Actividad de “Ejecutar Comando Externo” y simplemente configurarla para enviar una señal al proceso BusinessWorks que se ejecuta dentro del contenedor.

La señal que vamos a enviar es SIGINT, que es similar a la que enviamos cuando presionamos CTRL+C en un Terminal para requerir que el proceso se detenga. Vamos a hacer lo mismo. Para hacer eso, vamos a usar el comando kill que se incluye en todas las máquinas Unix y en la mayoría de las imágenes base de docker también. Y el comando kill requiere dos argumentos:

kill -s <SIGNAL_NAME> <PID>
  • SIGNAL_NAME: Ya cubrimos esa parte y vamos a usar la señal llamada SIGINT.
  • PID: En cuanto al PID, necesitamos proporcionar el PID del proceso BusinessWorks que se ejecuta dentro del contenedor.

La parte de encontrar el PID para ese proceso que ejecuta BusinessWorks dentro del contenedor puede ser difícil de localizar, pero si ves los procesos en ejecución dentro de un contenedor de BusinessWorks, puedes ver que no es tan complicado de encontrar:

Procesamiento por lotes de Kubernetes usando TIBCO BW

Si entramos dentro de un contenedor en ejecución de una aplicación BusinessWorks, verificaremos que este PID siempre es el número 1. Así que ya tenemos todo listo para configurar la actividad como se muestra a continuación:

Procesamiento por lotes de Kubernetes usando TIBCO BW

Y eso es todo, con estos dos cambios podemos desplegar esto usando la API de CronJob y usarlo como parte de tu conjunto de herramientas de patrones de aplicación.

Pros y Contras de cada enfoque

Como puedes imaginar, no hay una solución única sobre cuándo usar uno u otro porque va a depender de tu caso de uso y tus requisitos. Así que intentaré enumerar aquí las principales diferencias entre ambos enfoques para que puedas elegir mejor cuando esté en tus manos:

  • El enfoque gestionado por TIBCO es más rápido porque el pod ya está en ejecución y tan pronto como se cumple la condición, la lógica comienza. Usar la API de Cron Job requiere un período de calentamiento porque el pod comienza cuando se cumple la condición, por lo que se puede aplicar algún retraso aquí.
  • El enfoque gestionado por TIBCO requiere que el pod esté en ejecución todo el tiempo, por lo que utiliza más recursos cuando la condición no se alcanza. Así que en caso de que estés ejecutando contenedores sin estado como AWS Fargate o similar, la API de Cron JOB es una mejor opción.
  • La API de CronJob es una API estándar de Kubernetes, lo que significa que se integra completamente con el ecosistema, mientras que el enfoque gestionado por TIBCO es gestionado por TIBCO usando configuraciones de aplicación.
  • El enfoque gestionado por TIBCO no es consciente de otras instancias de la misma aplicación en ejecución, por lo que gestionas mantener una sola instancia en ejecución para evitar ejecutar la misma lógica muchas veces. En el caso de la API de Cron Job, esto es gestionado por la propia plataforma de Kubernetes.

Monitoreo de Prometheus en TIBCO Cloud Integration

Monitoreo de Prometheus en TIBCO Cloud Integration

En publicaciones anteriores, he explicado cómo integrar aplicaciones de TIBCO BusinessWorks 6.x / BusinessWorks Container Edition (BWCE) con Prometheus, uno de los sistemas de monitoreo más populares para capas en la nube. Prometheus es una de las soluciones más utilizadas para monitorear tus microservicios dentro de un clúster de Kubernetes. En esta publicación, explicaré los pasos para aprovechar Prometheus para integrarse con aplicaciones que se ejecutan en TIBCO Cloud Integration (TCI).

TCI es el iPaaS de TIBCO y principalmente oculta la complejidad de gestión de aplicaciones de una app para los usuarios. Necesitas tu aplicación empaquetada (también conocida como EAR) y manifest.json, ambos generados por el producto para simplemente desplegar la aplicación.

¿No es mágico? ¡Sí, lo es! Como expliqué en mi publicación anterior relacionada con la integración de Prometheus con BWCE, que te permite personalizar tus imágenes base, TCI permite la integración con Prometheus de una manera ligeramente diferente. Vamos a recorrer los pasos.

TCI tiene sus propias herramientas de monitoreo integradas (mostradas a continuación) para proporcionar información sobre la utilización de Memoria y CPU, además del rendimiento de la red, lo cual es muy útil.

Aunque las métricas de monitoreo proporcionadas de fábrica por TCI son suficientes para la mayoría de los escenarios, hay casos de uso de conectividad híbrida (aplicación ejecutándose en las instalaciones y microservicios ejecutándose en tu propio clúster que podría estar en una nube privada o pública) que podrían requerir una vista unificada de monitoreo.

Paso uno es importar el plugin de Prometheus desde la ubicación actual de GitHub a tu espacio de trabajo de BusinessStudio. Para hacer eso, solo necesitas clonar el Repositorio de GitHub disponible aquí: https://github.com/TIBCOSoftware/bw-tooling O https://github.com/alexandrev/bw-tooling

Importa el plugin de Prometheus eligiendo la opción Importar → Plug-ins y Fragmentos y especificando el directorio descargado de la ubicación de GitHub mencionada anteriormente. (mostrado abajo)

Monitoreo de Prometheus en TIBCO Cloud Integration
Monitoreo de Prometheus en TIBCO Cloud Integration

Paso dos implica agregar el módulo de Prometheus previamente importado a la aplicación específica como se muestra a continuación:

Monitoreo de Prometheus en TIBCO Cloud Integration

Paso tres es simplemente construir el archivo EAR junto con manifest.json.

NOTA: Si el EAR no se genera una vez que agregas el plugin de Prometheus, por favor sigue los pasos a continuación:

  • Exporta el proyecto con el módulo de Prometheus a un archivo zip.
  • Elimina el proyecto de Prometheus del espacio de trabajo.
  • Importa el proyecto desde el archivo zip generado antes.

Antes de desplegar la aplicación BW en TCI, necesitamos habilitar un puerto adicional en TCI para extraer las métricas de Prometheus.

Paso cuatro Actualización del archivo manifest.json.

Por defecto, una app de TCI que usa el archivo manifest.json solo expone un puerto para ser consumido desde afuera (relacionado con servicios funcionales) y otro para ser usado internamente para verificaciones de salud.

Monitoreo de Prometheus en TIBCO Cloud Integration

Para la integración de Prometheus con TCI, necesitamos un puerto adicional escuchando en 9095, para que el servidor de Prometheus pueda acceder a los endpoints de métricas para extraer las métricas requeridas para nuestra aplicación TCI.

Nota: Este documento no cubre los detalles sobre la configuración del servidor de Prometheus (NO es necesario para este PoC) pero puedes encontrar la información relevante en https://prometheus.io/docs/prometheus/latest/installation/

Necesitamos modificar ligeramente el archivo manifest.json generado (de la app BW) para exponer un puerto adicional, 9095 (mostrado abajo).

Monitoreo de Prometheus en TIBCO Cloud Integration

Además, para decirle a TCI que queremos habilitar el endpoint de Prometheus necesitamos establecer una propiedad en el archivo manifest.json. La propiedad es TCI_BW_CONFIG_OVERRIDES y proporciona el siguiente valor: BW_PROMETHEUS_ENABLE=true, como se muestra a continuación:

Monitoreo de Prometheus en TIBCO Cloud Integration

También necesitamos agregar una línea adicional (propertyPrefix) en el archivo manifest.json como se muestra a continuación.

Monitoreo de Prometheus en TIBCO Cloud Integration

Ahora, estamos listos para desplegar la aplicación BW en TCI y una vez que esté desplegada podemos ver que hay dos endpoints

Monitoreo de Prometheus en TIBCO Cloud Integration

Si expandimos las opciones de Endpoints a la derecha (mostrado arriba), puedes ver que uno de ellos se llama “prometheus” y ese es nuestro endpoint de métricas de Prometheus:

Simplemente copia la URL de prometheus y añádela con /metrics (URL en la captura de pantalla a continuación) — esto mostrará las métricas de Prometheus para la aplicación BW específica desplegada en TCI.

Nota: añadir /metrics no es obligatorio, la URL tal cual para el endpoint de Prometheus también funcionará.

Monitoreo de Prometheus en TIBCO Cloud Integration

En la lista encontrarás el siguiente tipo de métricas para poder crear los dashboards y análisis más increíbles basados en ese tipo de información:

  • Métricas JVM sobre memoria utilizada, rendimiento de GC y conteos de pools de hilos
  • Uso de CPU por la aplicación
  • Conteos de ejecución de Procesos y Actividades por Estado (Iniciado, Completado, Fallido, Programado..)
  • Duración por Actividad y Proceso.

Con toda esta información disponible puedes crear dashboards similares al que se muestra a continuación, en este caso usando Spotfire como la herramienta de Dashboard:

Monitoreo de Prometheus en TIBCO Cloud Integration

Pero también puedes integrar esas métricas con Grafana o cualquier otra herramienta que pueda leer datos de la base de datos de series temporales de Prometheus.

Monitoreo de Prometheus en TIBCO Cloud Integration

Desplegando la aplicación Flogo en OpenFaaS

Desplegando la aplicación Flogo en OpenFaaS

OpenFaaS es una alternativa para habilitar el enfoque sin servidor en tu infraestructura cuando no estás operando en la nube pública y no tienes disponibles esas otras opciones como AWS Lambda Functions o Azure Functions, o incluso en la nube pública, te gustaría las características y opciones de personalización que proporciona.

OpenFaaS® (Funciones como Servicio) es un marco para construir funciones sin servidor con Docker y Kubernetes que tiene soporte de primera clase para métricas. Cualquier proceso puede ser empaquetado como una función, permitiéndote consumir una variedad de eventos web sin codificación repetitiva de plantilla.

Hay buen contenido en Medium sobre OpenFaaS, así que no me gusta pasar mucho tiempo en esto, pero me gustaría dejarte aquí algunos enlaces como referencia:

Ya tenemos mucha información sobre cómo ejecutar una aplicación Flogo como una función Lambda, como puedes ver aquí:

https://www.youtube.com/watch?v=TysuwbXODQI

Pero… ¿qué pasa con OpenFaaS? ¿Podemos ejecutar nuestra aplicación Flogo dentro de OpenFaaS? ¡Claro! Déjame explicarte cómo.

OpenFaaS es un marco muy personalizable para construir funciones de escala cero y podría necesitar algo de tiempo para familiarizarse con los conceptos. Todo se basa en watchdogs que son los componentes que escuchan las solicitudes y son responsables de lanzar los forks para manejar las solicitudes:

Vamos a usar el nuevo watchdog llamado of-watchdog que se espera sea el predeterminado en el futuro y toda la información está aquí:

Este watchdog proporciona varios modos, uno de ellos se llama HTTP y es el predeterminado, y se basa en un reenvío HTTP al servidor interno que se ejecuta en el contenedor. Eso encaja perfectamente con nuestra aplicación Flogo y significa que lo único que necesitamos es desplegar un disparador de solicitud HTTP Receive en nuestra aplicación Flogo y eso es todo.

Desplegando la aplicación Flogo en OpenFaaS

Las únicas cosas que necesitas configurar son el método (POST) y la Ruta (/) para poder manejar las solicitudes. En nuestro caso vamos a hacer una aplicación simple de Hola Mundo como puedes ver aquí:

Desplegando la aplicación Flogo en OpenFaaS

Para poder ejecutar esta aplicación necesitamos usar varias cosas, y vamos a explicarlo aquí:

Primero que nada, necesitamos hacer la instalación del entorno OpenFaaS, voy a omitir todos los detalles sobre este proceso y solo señalarte al tutorial detallado sobre ello:

Ahora necesitamos crear nuestra plantilla y para hacerlo, vamos a usar una plantilla de Dockerfile. Para crearla vamos a ejecutar:

faas-cli new --lang dockerfile

Vamos a nombrar la función flogo-test. Y ahora vamos a actualizar el Dockerfile para que sea así:

Desplegando la aplicación Flogo en OpenFaaS

La mayor parte de este contenido es común para cualquier otra plantilla que use el nuevo of-watchdog y el modo HTTP.

Me gustaría resaltar las siguientes cosas:

Usamos varias variables de entorno para definir el comportamiento:

  • mode = HTTP para definir que vamos a usar este método
  • upstream_url = URL a la que vamos a reenviar la solicitud
  • fprocess = Comando del sistema operativo que necesitamos ejecutar, en nuestro caso significa ejecutar la aplicación Flogo.

Otras cosas son las mismas que deberías hacer en caso de que quieras ejecutar aplicaciones Flogo en Docker:

  • Agregar el ejecutable del motor para tu plataforma (UNIX en la mayoría de los casos ya que la base de la imagen es casi siempre basada en Linux)
  • Agregar el archivo JSON de la aplicación que deseas usar.

También necesitamos cambiar el archivo yml para que se vea así:

version: 1.0
provider:
  name: openfaas
  gateway: http://abc59586cc33f11e9941b069251daa7b-1114483165.eu-west-2.elb.amazonaws.com:8080
functions:
  flogo-test:
    lang: dockerfile
    handler: ./flogo-test
    image: alexandrev/flogo-test:1.7

¡Y eso es todo! Ahora, solo necesitamos ejecutar el siguiente comando:

faas-cli up -f .flogo-test.yml

Y la función se va a desplegar en tu entorno y podemos ejecutarla usando el portal de OpenFaaS directamente:

Desplegando la aplicación Flogo en OpenFaaS

Todo el código está disponible aquí (lo único que falta es el Flogo Enterprise Engine que necesitas usar para poder construirlo y subirlo)

Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Generalmente, cuando estás desarrollando o ejecutando tu aplicación de contenedores, llegarás a un momento en que algo sale mal. Pero no de una manera que puedas resolver con tu sistema de registro y con pruebas.

Un momento en el que hay algún cuello de botella, algo que no está funcionando tan bien como deseas, y te gustaría echar un vistazo adentro. Y eso es lo que vamos a hacer. Vamos a mirar adentro.

Porque nuestra BusinessWorks Container Edition proporciona características tan buenas para hacerlo que necesitas usarlo a tu favor porque me lo vas a agradecer por el resto de tu vida. Así que no quiero pasar un minuto más en esto. Me gustaría comenzar a contarte ahora mismo.

Lo primero que necesitamos hacer es entrar en la consola OSGi desde el contenedor. Entonces, lo primero que hacemos es exponer el puerto 8090 como puedes ver en la imagen a continuación

Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Ahora, podemos exponer ese puerto a tu host, usando el comando port-forward

kubectl port-forward deploy/phenix-test-project-v1 8090:8090

Y luego podemos ejecutar una solicitud HTTP para ejecutar cualquier información usando comandos como este:

curl -v http://localhost:8090/bw/framework.json/osgi?command=<command>

Y vamos a ejecutar primero la activación de las estadísticas del proceso así:

curl -v http://localhost:8090/bw/framework.json/osgi?command=startpsc
Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Y como puedes ver, dice que las estadísticas han sido habilitadas para la aplicación echo, así que usando ese nombre de aplicación vamos a recopilar las estadísticas a nivel

curl -v http://localhost:8090/bw/framework.json/osgi?command=lpis%20echo
Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Y puedes ver las estadísticas a nivel de proceso donde puedes ver las siguientes métricas:

  • Metadatos del proceso (nombre, proceso padre y versión)
  • Total de instancias por estado (creado, suspendido, fallido y ejecutado)
  • Tiempo de ejecución (total, promedio, mínimo, máximo, más reciente)
  • Tiempo transcurrido (total, promedio, mínimo, máximo, más reciente)

Y podemos obtener las estadísticas a nivel de actividad:

Usar estadísticas a tu favor para detectar cuellos de botella en TIBCO BusinessWorks Container Edition

Y con eso, puedes detectar cualquier cuello de botella que estés enfrentando en tu aplicación y también estar seguro de qué actividad o qué proceso es responsable de ello. Así que puedes resolverlo de una manera rápida.

¡Diviértete y usa las herramientas a tu disposición!