Analizar el rendimiento de una aplicación Go(lang)

A veces, es necesario analizar el rendimiento de nuestra aplicación para que funcione más rápido o simplemente para que no se caiga después de un tiempo debido a un memory leak. Afortunadamente, Go ya incluye herramientas para depurar estos problemas de manera nativa, una de esas es el paquete pprof, el cual genera un formato estándar que puede ser interpretado por diferentes aplicaciones y hasta puede ser graficado. Para analizar este código usaremos el paquete github. [Leer más]

JSONs con múltiples tags en Go

La librería estándar para manejar JSONs en Go, encoding/json, es bastante completa y cumple su función en la mayoría de los casos. Sus funcionalidades más utilizadas son Marshal y Unmarshal, que respectivamente se encargan de convertir una esctructura de Go a su representación en JSON y viceversa. Existen, sin embargo, situaciones en las que esta librería no es suficiente. Por ejemplo, el caso en que se quieran manejar múltiples tags para una misma estructura. [Leer más]
go  json  jsoniter 

Capturar excepciones en Go

En muchos lugares vas a leer que Go no tiene excepciones. Esto no es cierto. En Go si hay excepciones, la diferencia es que se llaman panics. La razón es que desde la popularidad de Java, las excepciones ya no se usan para situaciones excepciones sino para cualquier error, y todo el tiempo hay errores. Los autores de Go querían dar a entender que las excepciones deberían ser excepcionales y por eso eligieron la palabra panic para representarlas. [Leer más]

Maneras de implementar timeouts en Go

Fallar rápido y no bloquear son conceptos muy importantes cuando implementamos arquitecturas distribuidas. Evita malgastar recursos y tener fallos en cascada que impactan todo el sistema. En un sistema robusto todo debería estar limitado: llamados externos, operaciones, número de recursos que se pueden crear, etc… Poner un tiempo máximo para las operaciones es entonces una de las cosas más importantes a tener en cuenta cuando estamos desarrollando y desafortunadamente es, a menudo, olvidado. [Leer más]
go 

Optimizando costos y redimiento de AWS Lambda

Optimizar el costo de AWS Lambda no es trivial, se sabe que el CPU asignado a la función sube a medida que la memoria aumenta. AWS Lambda cobra por memoria asignada y por tiempo de ejecución, entonces si podemos bajar el tiempo subiendo la memoria, sería posible ahorrar dinero y además aumentar el rendimiento. Una forma de saber más o menos cómo está funcionando la función es analizar los logs de CloudWatch logs, podemos bajar los logs y mirar como se distribuyen las duraciones para la memoria asignada. [Leer más]
aws  lambda 

Configurar VS Code para Go(lang)

Visual Studio Code es un editor de código muy bueno gracias a su ecosistema de extensiones que nos permiten extender las funcionalidades del editor según se necesite. En este artículo vamos a discutir qué extensiones nos sirven para trabajar con Go y cómo configurarlas. Extensión Go por Microsoft La extensión más importante que debemos instalar es Go. Esta extensión, mantenida por Microsoft, añade las funcionalidades más importantes al editor: IntelliSense Code Navigation Code Editing Diagnostics Testing Debugging Others Abrimos vscode. [Leer más]
code  vscode  golang  go  config 

Procesando logs de Cloudwatch

Cloudwatch Logs es la herramienta de AWS para coleccionar los de diversos sistemas, su usabilidad no es la mejor pero es económico y escalable. A veces vale la pena procesar los logs de Cloudwatch para hacer ciertos análisis sobre lo que está sucediendo con la aplicación y poder tomar mejores decisiones. En este artículo vamos a discutir cómo conectarnos al servicio por medio del API y cómo filtrar los logs. [Leer más]

Qué es un data race?

Un data race en su definición más básica es una condición que ocurre cuando 2 o más hilos acceden una variable compartida/global y al menos uno de los hilos la escribe. El siguiente ejemplo es exagerado para mostrar cómo ocurre: package main import ( "fmt" "sync" ) func main() { counter := 0 wg := sync.WaitGroup{} for i := 0; i < 1000; i++ { wg.Add(1) go func() { counter++; wg. [Leer más]

Creando una app de linea de comandos con cobra

Para crear una herramienta de línea de comandos con cobra primero debemos crear el directorio dónde el código va a estar alojado. $ mkdir mycli $ go mod init github.com/truora/mycli go: creating new go.mod: module github.com/truora/mycli $ go get -u github.com/spf13/cobra/cobra $ cobra init --pkg-name=github.com/truora/mycli -a 'My Name' . Your Cobra application is ready at … Después de ejecutar estos pasos, ya tendremos la base de nuestra aplicación, podemos correrla con: [Leer más]
cli  cobra  golang 

Maneras de optimizar gzip en Go(lang)

Gzip es un programa que nos permite comprimir información y es usado principalmente para reducir el tamaño de los payload en la red. Internamente lo usamos para ahorrar almacenamiento, pero sus casos de usos varían. Para empezar, podemos escribir una función que reciba nuestro mensaje en bytes y retorna []byte con nuestra información ya codificada, la llamaremos compressData. func compressData(b []byte) ([]byte, error) { var buf bytes.Buffer zw := gzip.NewWriter(&buf) if _, err := zw. [Leer más]
gzip  io  server  golang