Escrevendo logs em formato JSON com zerolog

Algum tempo atrás fizemos um post falando sobre como escrever logs em arquivos. No post em questão, logamos algumas mensagens de forma bem simples. Normalmente esses logs em texto puro são um pouco complicados para filtrar mensagens, já que é preciso muito regex.

Nesse post vamos abordar os logs de uma forma diferente, pois vamos escreve-los em formato JSON.

Para nos auxiliar nessa tarefa, vamos utilizar um package chamado zerolog. Esse package foi criado pelo Olivier Poitrey, atual diretor de engenharia do Netflix.

Gosto muito desse package pois ele é fácil de usar e tem uma performance muito boa.

Sem mais enrolação, vamos instalar o package e começar a brincar com ele.

$ go get -u github.com/rs/zerolog/log
Leia mais »

Implementando uma API com gorilla/mux

Sem dúvidas um dos routers mais famosos e utilizados no mundo Golang, hoje vamos ver como implementar uma API utilizando gorilla/mux.

Para quem não conhecer, gorilla/mux ajuda na hora de fazer o match da URL que está sendo chamada com a função que vai tratar aquela URL. Além dessa facilidade, um dos principais benefícios de se utilizar gorilla/mux é que ele implementa a interface http.Handler nativa do Go.

Sem mais delongas, vamos começar implementar nossa API instalando o gorilla/mux.

$ go get -u github.com/gorilla/mux
Leia mais »

Escrevendo testes unitários

Testes unitários nos ajudam muito a tentar manter a quantidade de bugs baixa, já que podemos testar várias hipóteses de forma automática. E por ser automatizada, a cada mudança que fazemos, os testes unitários também nos ajudam a garantir que não quebramos o sistema em partes que nem tocamos mas que dependem das mudanças que fizemos.

Embora exista alguns packages que ajudam na escrita dos testes unitários, a recomendação do time de desenvolvimento da linguagem é que os testes sejam escritos usando o package nativo da linguagem, pelo simples fato de que um package externo pode adicionar algum bug ou realizar algum teste de forma incorreta.

Antes de começar a escrever os testes, vamos criar um arquivo chamado soma.go e escrever uma pequena função que soma N valores.

package soma


func Soma(valores ...int) (total int) {
    for _, valor := range valores {
        total += valor
    }

    return
}
Leia mais »

Carregando configurações de arquivos toml

Muitos programas que escrevemos precisam de informações para configurar uma conexão com banco de dados, enviar informações para uma API de terceiros e etc…

Existem várias formas para nosso programa receber essas informações, dentre elas, a pior sendo colocar as informações diretamente no código, pois, além de ficar difícil para manter as várias configurações por ambiente, existe o fator segurança, já que os dados ficarão expostos no seu Github, Gitlab ou qualquer outro versionador de código que você utilizar.

Outra forma para fazer isso seria utilizando variáveis de ambiente, mas caso você não esteja usando Kubernetes, essa maneira pode ser muito trabalhosa para se manter.

Por isso, nesse post vamos ver como podemos manter essas configurações fora do nosso código usando arquivos toml.

Leia mais »

Criando uma API REST em minutos com pREST

Nesse post vou falar um pouco sobre um dos projetos open source que contribuo, o pREST.

O pREST cria uma api REST expondo as tabelas de um banco postgres de forma rápida, fácil e com uma boa performance.

Embora essa prática pareça um pouco estranha e insegura, para alguns casos ela serve muito bem. Um exemplo seria um serviço interno para sua intranet ou como um micro serviço de CRUD.

Só para deixar bem claro, quando digo que parece insegura, não é que o pREST não trate questões como SQL Injection, mas sim o fato de expor todo um banco e suas tabelas de forma nua e crua.

Leia mais »