
Hoje vamos falar de um tema muito interessante quando precisamos lidar com a verificação da saúde do nosso ambiente de produção: a instrumentação.
Antes de começar a falar sobre instrumentação, queremos dizer que esse post está seguindo a linha de uma palestra excelente apresentada pelo André Luis na Ruby Conf 2017.
O que vamos aprender?
- O que é instrumentação e porque ela é importante
- Como usar o ActiveSupport::TaggedLogging
- Como usar o New Relic
- Como usar o Rollbar
Ferramentas
- Rails 5.1.4
- Tagged Logging (nativo do Rails)
- gem newrelic_rpm
- gem rollbar
O que é instrumentação?
Instrumentar é um termo médico usado para definir a ajuda que é prestada a um cirurgião durante uma operação, onde os instrumentos são passados para ele. Pra gente, é algo parecido, é a aplicação de ferramentas que nos apoiem na verificação da saúde da nossa aplicação (para verificar os erros em produção, consumo de memória e etc).
O que faremos?
Neste post, nós vamos criar um app que será utilizado por uma empresa de locação de carros. Após a criação do app, vamos ver a implementação de cada uma das ferramentas que utilizaremos.
Então, vamos ao app.
Construindo o App para Locação de Carros
1. Primeiro vamos criar nosso app:
1 |
rails new rent_cars |
2. Entrar no diretório do app:
1 |
cd rent_cars |
3. Inserir a gem do Devise no Gemfile:
1 |
gem 'devise' |
4. Instalar as gems com o Bundle:
1 |
bundle install |
5. Instalar o Devise com o comando:
1 |
rails g devise:install |
6. Agora vamos gerar o model User pelo Devise com o comando:
1 |
rails g devise User |
7. Criaremos dois scaffolds, um para cadastrarmos os carros e outro para criarmos o aluguel. Para isso, executaremos os comandos:
1 |
rails g scaffold Car name manufacturer year:integer additional_information:text |
1 |
rails g scaffold Rental start_date:datetime end_date:datetime user:references car:references |
8. Agora vamos executar as migrations:
1 |
rails db:migrate |
9. Precisamos atualizar a partial com o formulário de aluguel para exibir um select box para Usuários e Carros. A nossa partial ficará desse jeito (app/views/rentals/_form.html.erb):
10. Vamos adicionar um filtro no ApplicationController para verificar a autenticação do usuário. Ele ficará desse jeito: (app/controllers/application_controller.rb):
1 2 3 4 |
class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :authenticate_user! end |
11. Agora, só pra facilitar a nossa navegabilidade quando quisermos testar o app, vamos adicionar um pequeno menu no topo do app. Para isso, vamos alterar o body do layout do nosso app, que ficará assim (app/views/layouts/application.html.erb):
1 2 3 4 5 6 7 8 |
<body> <% if user_signed_in? %> <%= link_to "Cars", cars_path %> <%= link_to "Rentals", rentals_path %> <%= link_to "Logout", destroy_user_session_path, method: :delete %> <% end %> <%= yield %> </body> |
12. Por último, vamos configurar a nossa rota raiz para a lista de alugueis feitos. Então, nosso arquivos de rotas ficará desse jeito (config/routes.rb):
1 2 3 4 5 6 |
Rails.application.routes.draw do root to: "rentals#index" resources :rentals resources :cars devise_for :users end |
Utilizando as ferramentas o/
Agora vamos começar a utilizar as ferramentas de instrumentação. Passaremos por cada uma explicando como implementar.
A. Tagged Logging
O Tagged Logging é um recurso nativo do Rails e é fornecido através do ActiveSupport. O que ele faz é identificar trechos do log com Tags definidas por nós.
Como exemplo, vamos inserir um carro no nosso app via interface. Agora daremos um start no servidor e depois vamos clicar item “Cars” no menu, clicar em “New Card” página que foi carrega e criar um novo com as seguintes informações:
- Name: Palio 1.0
- Manufacturer: Fiat
- Year: 2016
- Additional information: Awesome car with Power Steering, Air Conditioning and and much more
Se formos verificar os logs, temos uma parte que trata especificamente da operação de inserção do banco, que é:
1 2 3 4 |
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] (0.1ms) begin transaction SQL (0.4ms) INSERT INTO "cars" ("name", "manufacturer", "year", "additional_information", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["name", "Palio 1.0"], ["manufacturer", "Fiat"], ["year", 2016], ["additional_information", "Awesome car with ar condiotining, eletric direction and more"], ["created_at", "2017-12-28 15:10:42.266209"], ["updated_at", "2017-12-28 15:10:42.266209"]] (244.3ms) commit transaction |
Agora vamos imaginar o trabalho necessário pra identificar este INSERT no meio de dezenas de outras informações inseridas no log.
É nessa parte que o Tagged Logging pode ser colocado em ação. Com ele nós conseguimos adicionar uma Tag de identificação para este trecho específico dos logs. Então, vamos lá.
1. Primeiro, vamos atualizar a nossa action create que deverá ficar assim (app/controllers/cars_controller.rb):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def create logger.tagged "Add CAR" do logger.info "Creating object" @car = Car.new(car_params) logger.info "Saving a car" @saved = @car.save end respond_to do |format| if @saved format.html { redirect_to @car, notice: 'Car was successfully created.' } format.json { render :show, status: :created, location: @car } else format.html { render :new } format.json { render json: @car.errors, status: :unprocessable_entity } end end end |
Neste trecho de código, nós utilizamos o recurso logger.tagged que vai utilizar o ActiveSupport::TaggedLogging para adicionar uma tag em algum trecho do nosso log.
Como nós queríamos adicionar no momento da criação do Carro, eu coloquei este trecho dentro um bloco que do logger.tagged. Ou seja, todas as operações que forem feitas dentro deste bloco terão a tags “Add CAR”. Utilizei também logger.info para acrescentar ao log uma mensagem informando que o objeto foi criado e que estava sendo salvo.
2. Agora vamos tentar adicionar mais um carro via interface. Adicionei com um as seguintes informações:
- Name: Gol G5
- Manufacturer: Volkswagen
- Year: 2017
- Additional information: Nice car!
3. Vamos procurar agora nos logs o trecho que exibe a inserção. Este é o trecho que foi gerado no meu console: ( procure também no seu : ] )
1 2 3 4 5 |
[Add CAR] Creating object [Add CAR] Saving a car [Add CAR] (0.1ms) begin transaction [Add CAR] SQL (1.8ms) INSERT INTO "cars" ("name", "manufacturer", "year", "additional_information", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["name", "Gol G5"], ["manufacturer", "Wolkswagen"], ["year", 2017], ["additional_information", "Nice car!"], ["created_at", "2017-12-28 15:22:33.161102"], ["updated_at", "2017-12-28 15:22:33.161102"]] [Add CAR] (182.5ms) commit transaction |
4. Além dessa inserção “manual” de tags, também podemos configurar o ambiente para exibir tags utilizando atributos do request. Por exemplo, vamos adicionar o a seguinte linha no nosso arquivo de configuração de desenvolvimento (config/environments/development.rb):
1 |
config.log_tags = [ :uuid ] |
Este log_tags recebe uma lista com todos os atributos da variável request do Rails que queremos adicionar na tag. Nós poderíamos, por exemplo, ter adicionado também o atributo subdomain do request que ele também seria apresentado nas tags caso exista.
5. Vamos reiniciar o servidor e excluir o carro que criamos anteriormente.
6. Se voltarmos nos logs, perceberemos que a parte que diz respeito a exclusão ficou desse jeito:
1 2 3 4 |
[e9fc49f3-939a-463b-add4-79e53f1a5a74] Car Load (0.3ms) SELECT "cars".* FROM "cars" WHERE "cars"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] [e9fc49f3-939a-463b-add4-79e53f1a5a74] (0.1ms) begin transaction [e9fc49f3-939a-463b-add4-79e53f1a5a74] SQL (0.2ms) DELETE FROM "cars" WHERE "cars"."id" = ? [["id", 2]] [e9fc49f3-939a-463b-add4-79e53f1a5a74] (123.5ms) commit transaction |
Como vimos, usando o Tagged Logging, podemos tornar a leitura de alguns trechos do log rastreáveis de uma maneira fácil.
B. Rollbar
O Rollbar é uma ferramenta que nos permite enviar os logs para um dashboard online para análises futuras. Para isso, precisamos fazer um cadastro no Rollbar, instalar a gem e depois adicionar os trechos que código com o que queremos enviar pro dashboard.
Lembrando que o Rollbar não é uma ferramenta totalmente grátis. A partir de uma quantidade de envio de logs e dependendo do tempo que eles ficarão armazenados, alguma quantia pode passar a ser cobrada. Mas para o nosso caso, a versão grátis está excelente.
Então bora!
1. Primeiro é necessário fazermos o cadastro no Rollbar pelo link https://rollbar.com
2. Após criar a conta, vamos criar um projeto com o nome “Rent Cars” e escolher como backend “Rails”
3. Feito isso, vamos seguir alguns passos que também estão na própria página do Rollbar.
4. Primeiro, vamos adicionar a gem do Rollbar ao nosso Gemfile
1 |
gem 'rollbar' |
5. Agora vamos instalar a gem com o comando:
1 |
bundle install |
6. Instalada a gem, agora vamos gerar as configs do Rollbar:
1 |
rails g rollbar <seu_token_do_rollbar> |
O token to Rollbar pode ser obtido no menu Project Access Token nas configurações do projeto. Nesta página há 4 tokens. Para enviar as informações a partir do nosso servidor, precisaremos usar o token post_server_item. Este token que colocaremos no lugar de <seu_token_do_rollbar>.
Ao executar este comando, será criado um arquivo de inicializaçao do Rollbar.
7. Agora vamos adicionar o Rollbar em alguns trechos do nosso código para podermos ver o resultado no dashboard.
8. Primeiro, vamos criar uma notificação para nos informar quando um aluguel der erro na hora de salvar. Então, em nosso controller de aluguéis, a nossa action create ficará desse jeito (app/controllers/rentals_controller.rb):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def create @rental = Rental.new(rental_params) respond_to do |format| if @rental.save format.html { redirect_to @rental, notice: 'Rental was successfully created.' } format.json { render :show, status: :created, location: @rental } else Rollbar.error("Error when trying to rent the car #{@rental.car.name}") format.html { render :new } format.json { render json: @rental.errors, status: :unprocessable_entity } end end end |
9. Agora vamos restartar o nosso servidor e tentar criar um aluguel. Mas para que seja gerado um erro, vamos deixar o carro em branco e ver o que acontece.
10. Ao tentar criar o aluguel com o campo do carro em branco, percebemos que ele nos retorna um erro na página. Se formos até o nosso dashboard no Rollbar, a mensagem que nós colocamos lá também vai aparecer \o/.
Além de Rollbar.error, podemos chamar outras funções como info e warning (dentre outras) para que possamos classificar os logs no Dashboard para melhor organização.
11. Este é um print da tela do Rollbar. Se dermos uma olhada na área Top 5 active items, o item #4 é o que diz respeito ao log que inseri na action.
12. Se nós buscarmos os detalhes do log que criamos, veremos que ele traz bastante informação. Conseguimos até ver quem foi o usuário que executou a açao.
Para fazer isso, o Rollbar utiliza por padrão método current_user no controller onde ele está sendo chamado. É possível alterar o método que será chamado nas configurações do Rollbar no app.
O Rollbar é uma ferramentas que nos traz detalhes organizados de forma mais amigável, sem que precisemos ficar monitorando logs do servidor.
Além disso, não são exibidos os logs apenas do que configuramos. Este logs adicionais são customizações que fizemos. Mas por padrão, o Rollbar envia para o dashboard os erros que gerados durante a operação do app.
Ele também permite integrações com APIs externas como o Slack, por exemplo. Imagine como seria incrível ter notificações a respeito do seu negócio sendo lançados para o canal do seu time.
C. New Relic
O New Relic também é uma ferramenta online. Igualmente ao Rollbar, informações são envidas para um serviço externo à aplicação, porém o New Relic possui informações mais aprofundadas a respeito do servidor como um todo.
Para começar a usar o New Relic, vamos seguir os passos a seguir
1. Primeiro, vamos criar uma conta no New Relic no site https://newrelic.com/
2. Depois de criar a conta, vamos selecionar o agente New Relic APM
3. Nele existe a opção de configuração de um ambiente Ruby. Na seção Get you License Key nós vamos clicar em Reveal license key e guardar este número que foi gerado.
4. Agora vamos adicionar a gem no New Relic no nosso Gemfile
1 |
gem 'newrelic_rpm' |
5. Instalar a gem
1 |
bundle install |
6. Vamos gerar o arquivo de configuração do New Relic do nosso app
1 |
newrelic install --license_key="<sua_license_key>" "Rent Cars" |
Onde está o conteúdo <sua_license_key> nós vamos colocar a chave que nós guardamos no item 3. O atributo seguinte “Rent Cars” é o nome da nossa aplicação e aqui pode ter qualquer valor.
7. Vamos reiniciar o nosso server.
8. De volta à página do New Relic, na última seçao vamos clicar no botão Listen for my application.
9. Após isso, na mesma página do New Relic, vamos na opção Tools no menu superior e clicar em Create custom Dashboard.
Ao criarmos um dashboard no New Relic e adicionamos uma novo gráfico ou tabela, perceberemos que ele possui uma profundidade maior de informações. Não apenas com informações sobre requisições client-server mas também informações como consumo de memória, VM Ruby etc.
Este é um exemplo do meu dashboard com um gráfico de memória do meu servidor
Nós vimos apenas uma parte do New Relic neste post. Ele possui diversos outros dados como Brower, acesso a URLS, sessões etc.
E assim como o Rollbar, o New Relic também pode gerar notificações no Slack e em diversas outras ferramentas, embora possua recursos mais avançamos para captação dos gatilhos de notificações.

Não perca nenhum conteúdo
Receba nosso resumo semanal com os novos posts, cursos, talks e vagas o/
Mas, qual eu vou utilizar?
Existem dois pontos relevantes que devemos considerar para poder escolher uma solução para instrumentação: política interna da empresa e necessidade.
Se a sua empresa possui uma política de segurança bem fechada e não permite envio de informações do servidor para terceiros você não terá outra escolha senão usar o TaggedLogging.
Caso queira apenas monitorar as requisições do servidor e possuir um acesso mais fácil e legível para os seus logs, a simplicidade do Rollbar te atenderá muito bom.
Mas, se o seu foco por monitorar seu servidor e seu serviço como um todo, opte pelo New Relic. Nele além de poder customizar seu proprio dashboard, ele possui recursos avançados para definição de gatilhos de notificações para manter a equipe bem alerta tanto ao app quando à saúde do ambiente como um todo.
O que nós vimos aqui foi um exemplo básico para aplicarmos as ferramentas, mas elas podem ser usadas para soluções ainda maiores. Imagine você ter uma dessas técnicas monitorando uma API de pagamento do seu app, ou até mesmo monitorando processos de alto valor para o negócio.
Bem, galera, essa foi passagem bem rápida sobre estes recusos que nos permitem fazer uma ótima Instrumentação no nosso ambiente Rails.
Pra quem quiser ir mais a fundo, segue os readmes das gems do Rollbar e do New Relic e o link do Github do codigo do nosso app.
- https://github.com/rollbar/rollbar-gem
- https://github.com/newrelic/rpm
- https://github.com/OneBitCodeBlog/rent_cards
E é claro que não pode faltar o link do vídeo do André Luis que inspirou este post. Valeu, André!! =D
Finalizamos por aqui, galera. Quem tiver dúvidas, à vontade para me contactar! : )
Você é novo por aqui?
Primeira vez no OneBitCode? Curtiu esse conteúdo?
O OneBitCode tem muito mais para você!
O OneBitCode trás conteúdos de qualidade e em português sobre programação com foco em Ruby on Rails e outras tecnologias como Angular, Ionic, React, desenvolvimento de Chatbots e etc.
Se você deseja aprender mais, de uma forma natural e dentro de uma comunidade ativa, visite nosso pune dating sites free e nosso dating in canada, veja os screencasts e talks no https://onebitcode.com/current-dating-site-in-usa/, alguns acontecimentos no https://onebitcode.com/free-dating-site-in-asia/, ouça os Podcasts e faça parte de nossa Newsletter.
Além disso, também estamos com alguns e-Books muito interessantes para quem deseja se aprimorar como programador e também como freelancer (os e-Books são gratuitos!):
- WorkFlow Super Full Stack
- Desenvolvendo seus projetos como um profissional
- Guia do Freelancer
- PDF com links fundamentais para quem quer ser um freelancer de sucesso
- Guia One Bit Code de Gems
- Baixe gratuitamente seu e-Book com 60 Gems separadas por categorias
Espero que curta nossos conteúdos e sempre que precisar de ajuda com os tutoriais, fala com a gente!
Seja por pune dating sites free ou e-mail, estamos aqui para você 🙂
Bem-vindo à família OneBitCode \o/
Usamos esse no nosso sistema: https://instrumentalapp.com/
Não tem um track tão bom, mas para ver alguns números é bem interessante, por exemplo: uso de cpu, número de erros 5**, número queries, número de requests…
Opa legal essa ferramenta em Lucas 🙂
Eu nunca utilizei-o mas devo testar no meu próximo projeto: https://github.com/smartinez87/exception_notification
Para aplicações pequenas que não quer um serviço pago de monitoramento de erros, pode ser uma boa saída.