Usando o Slack para monitorar seu aplicativo

Publicados: 2022-03-10
Resumo rápido ↬ Nos últimos meses, tenho construído um aplicativo de software como serviço (SaaS) e, durante todo o processo de desenvolvimento, percebi o que uma ferramenta poderosa Slack (ou bate-papo em equipe em geral) pode ser para monitorar o comportamento do usuário e do aplicativo. Após um pouco de integração, ele forneceu uma visão em tempo real do nosso aplicativo que anteriormente não existia, e foi tão inestimável que não pude deixar de escrever este show-and-tell.

Tudo começou com uma visita a uma pequena startup em Denver, Colorado. Durante minha visita, comecei a ouvir um sutil e encantador “ding” no canto do escritório a cada poucos minutos. Quando fui investigar esse barulho estranho, encontrei uma campainha de serviço conectada a um Raspberry Pi, com um minúsculo martelo de metal conectado à placa de circuito. Como se viu, o Pi estava recebendo mensagens do servidor da equipe e batia aquele pequeno martelo na campainha toda vez que um novo cliente se inscrevia .

Sempre achei que isso era um grande motivador de equipe, e isso me fez pensar em como eu poderia usar o bate-papo em equipe para obter uma experiência semelhante e como poderíamos analisar e visualizar dados de log.

Como já estávamos usando o Slack para bate-papo em equipe e porque ele tem uma API lindamente documentada, foi uma escolha óbvia para o experimento.

Leitura adicional no SmashingMag:

  • Interfaces de conversação: onde estamos hoje? Para onde estamos indo?
  • Colaboração em equipe e fechamento de lacunas de eficiência no design responsivo
  • O que você deve saber sobre o processo de design do aplicativo
  • Fora para as corridas: começando com sprints de design
Mais depois do salto! Continue lendo abaixo ↓

Configurar folga

Primeiro, tivemos que obter um "URL de webhook" do Slack para postar mensagens programaticamente em nosso canal do Slack.

Configurar o Slack
Siga as etapas acima para obter um URL de webhook do Slack (Ver versão ampliada)

Agora que tínhamos um URL de webhook, era hora de integrar as mensagens do Slack ao nosso aplicativo Node.js. Para fazer isso, encontrei um módulo útil do Node.js chamado node-slack.

Primeiro, instalamos o módulo Node.js:

 npm install node-slack --save

Agora, podemos enviar mensagens do Slack para nosso canal de escolha com algumas linhas de código.

 // dependency setup var Slack = require('node-slack'); var hook_url = 'hook_url_goes_here'; var slack = new Slack(hook_url); // send a test Slack message slack.send({ text: ':rocket: Nice job, I\'m all set up!', channel: '#test', username: 'MyApp Bot' });

(Você pode encontrar pacotes de integração Slack semelhantes para Ruby, Python e praticamente qualquer outra linguagem.)

Quando executado, esse código produziu a seguinte mensagem em nosso canal #test Slack:

Configuração do Slack

O código acima é mínimo, mas é específico para a API do Slack e o módulo node-slack. Eu não queria ficar preso a nenhum serviço de mensagens específico, então criei uma função genérica do módulo Node.js para executar o código específico do serviço:

 // Messenger.js // dependency setup var hook_url = my_hook_url; var Slack = require('node-slack'); var slack = new Slack(hook_url); module.exports = { sendMessage: function(message, channel, username) { if (!message){ console.log('Error: No message sent. You must define a message.') } else { // set defaults if username or channel is not passed in var channel = (typeof channel !== 'undefined') ? channel : "#general"; var username = (typeof username !== 'undefined') ? username : "MyApp"; // send the Slack message slack.send({ text: message, channel: channel, username: username }); return; } } };

Agora podemos usar este módulo em qualquer lugar no aplicativo com duas linhas de código, e se decidirmos enviar mensagens para outro serviço no futuro, podemos facilmente trocar isso no Messenger.js.

 var messenger = require('./utilities/messenger'); messenger.sendMessage(':rocket: Nice job, I\'m all set up!', '#test');

Agora que tínhamos o básico configurado, estávamos prontos para começar a disparar mensagens de dentro do aplicativo.

Rastrear Registros

A primeira ordem do dia era alcançar a paridade do sino de serviço. Localizei o retorno de chamada de sucesso da função de registro do usuário e adicionei este código:

 messenger.sendMessage('New user registration! ' + user.email);

Agora, quando alguém se registrava, recebíamos esta mensagem:

Mensagem de novo usuário

Dá até dó! Este foi um bom começo, e me deu aquela sensação satisfatória de sino de serviço, mas me deixou com sede de mais.

Mergulhe mais fundo

À medida que minha curiosidade crescia a cada ding, comecei a me perguntar coisas como: E se houvesse uma falha na criação de um novo usuário? E se um usuário se registrou, fez login, mas não concluiu o processo de integração? Qual é o resultado de nossas tarefas agendadas? Agora que as bases estavam prontas, responder a essas perguntas foi muito fácil.

Monitore exceções e erros críticos no back-end

Um dos erros mais importantes que queríamos saber era se houvesse uma falha na criação de um novo usuário. Tudo o que tivemos que fazer foi encontrar o retorno de chamada de erro na função de registro do usuário e adicionar este código:

 messenger.sendMessage(':x: Error While adding a new user ' + formData.email + ' to the DB. Registration aborted!' + error.code + ' ' + error.message);

Agora sabíamos instantaneamente quando os registros falhavam, por que falhavam e, mais importante, para quem falhavam:

Erro de registro do usuário
(Ver versão grande)

Havia todos os tipos de lugares interessantes onde poderíamos enviar mensagens (praticamente em qualquer lugar com um retorno de chamada de erro). Um desses lugares era esta função genérica de erro pega-tudo:

 app.use(function(err, req, res, next) { var message = ':x: Generic Server Error! '+ err + '\n Request: \n' + req.protocol + '://' + req.get('host') + req.originalUrl + '\n' + JSON.stringify(req.headers) + 'Request Payload:\n' + JSON.stringify(req.body); messenger.sendMessage(message, '#server-errors'); res.status(err.status || 500); res.json({'error': true }); });

Esse código nos ajudou a descobrir como é uma solicitação para exceções não tratadas. Observando a solicitação que acionou esses erros, pudemos rastrear as causas principais e corrigi-las até que não houvesse mais erros genéricos.

Com todas essas notificações de erro em vigor, agora tínhamos conforto em saber que, se algo importante falhasse no aplicativo, saberíamos instantaneamente.

Monitorar Finanças

Em seguida, queria enviar uma notificação quando um evento financeiro acontecer no aplicativo. Como nosso produto SaaS se integra ao Stripe, criamos um endpoint de webhook que recebe ping do Stripe quando as pessoas atualizam seu plano, fazem downgrade de seu plano, adicionam informações de pagamento, alteram informações de pagamento e muitos outros eventos relacionados a pagamentos de assinatura, todos os quais são enviados para Folga:

Mensagem de pagamento

Monitorar o comportamento do usuário no front-end

Houve alguns casos no front-end em que queríamos entender o comportamento do usuário de maneiras que o back-end não poderia fornecer, então criamos um endpoint para enviar mensagens do Slack diretamente do front-end. Como nosso URL de webhook do Slack é protegido por um endpoint POST , era um risco mínimo expor o envio de mensagens do Slack para nossa equipe por meio de um endpoint.

Com o endpoint no lugar, agora podemos disparar mensagens do Slack com uma simples chamada AngularJS $http.post :

 // send Slack notification from the front end var message = ":warning: Slack disconnected by " + $scope.user.username; $http.post('/endpoint', message);

Isso nos ajuda a responder a perguntas importantes sobre o negócio: As pessoas estão registrando e adicionando um nome de domínio? Eles não são? Se alguém for, é para um domínio de alto perfil cujo proprietário gostaríamos de entrar em contato pessoalmente logo após adicioná-lo. Agora podemos explorar isso:

Mensagens do usuário
(Ver versão grande)

A certa altura, vimos um padrão de pessoas adicionando um domínio, removendo-o e lendo-o em poucos minutos, o que nos indicou um bug obscuro que provavelmente nunca teríamos descoberto de outra forma.

Também há sinais de que um usuário está insatisfeito com o serviço, e é importante conhecer esses sinais. Alguém removeu um nome de domínio? Eles desconectaram o Slack?

Mensagens desconectadas do usuário
(Ver versão grande)

Esse feedback nos dá a oportunidade de entrar em contato de forma proativa e oferecer um excelente suporte ao cliente quando for mais importante.

Monitorar tarefas agendadas

Uma das coisas mais interessantes de se ver no Slack é o resultado das tarefas agendadas. Nosso produto SaaS executa tarefas para notificar as pessoas sobre o desempenho de seus sites (nosso serviço principal), enviar e-mails transacionais, limpar o banco de dados e algumas outras coisas. O disparo e os resultados dessas tarefas enviam uma mensagem ao Slack:

Mensagens de tarefas do servidor
(Ver versão grande)

Agora sabemos quando uma função de tarefa é acionada, qual é o resultado dessa função (neste caso, ela envia vários e-mails) e se ela falha por algum motivo.

Aplique este conceito à sua aplicação

O estudo de caso acima é um exemplo prático do que fizemos para monitorar o aplicativo e o serviço GoFaster.io. Funcionou muito bem para nós, mas como esse conceito seria dimensionado para grandes aplicativos que enviam centenas, talvez milhares, de mensagens por dia? Como você pode imaginar, isso rapidamente se transformaria em uma situação de “Slackbot que gritou lobo”, e o valor se perderia no barulho.

Não trate todas as notificações igualmente

Algumas notificações são mais importantes que outras, e a importância varia de acordo com o funcionário e sua função. Por exemplo, o pessoal de desenvolvimento de software e operações de TI (DevOps) pode se preocupar apenas com as mensagens do servidor, enquanto o pessoal de atendimento ao cliente se preocupa mais com o que está acontecendo com os usuários.

Felizmente, o Slack tem uma ótima solução para esse problema: canais .

Os canais podem ser criados por qualquer pessoa, tornados públicos ou privados para sua organização e compartilhados com qualquer pessoa. Depois de se inscrever em um canal, você pode controlar como as atividades desse canal o alertam. Uma nova mensagem no canal soa toda vez? Ele alerta seu telefone também? Será que só negrito o canal? Tudo isso pode ser controlado para cada canal por cada membro da equipe para atender às suas necessidades.

Colocando essa ideia em prática, veja como uma organização maior pode organizar notificações baseadas em monitor no Slack por meio de canais:

#Critical-Server-Errors

  • O quê: erros de registro, erros de login, erros de leitura e gravação do banco de dados
  • Quem: administradores de sistema, DevOps, CTO, CEO, desenvolvedores
  • Configurações de alerta: sempre notifique no telefone ou na área de trabalho.

#Erros não críticos do servidor

  • O quê: erros 404, erros de servidor catch-all, etc.
  • Quem: DevOps, desenvolvedores
  • Configurações de alerta: Faça negrito, mas não ding.

#Finanças

  • O quê: transações de pagamento, transações com falha, upgrades, downgrades, cartões expirados
  • Quem: CFO, CEO
  • Configurações de alerta: Faça chover.

#Comportamento do usuário

  • O que: registro, processo de integração, atualização do tipo de plano, adição de informações, remoção de informações, exclusão de conta
  • Quem: suporte ao cliente, gerentes de mídia social, desenvolvedores, CEO
  • Configurações de alerta: sempre notifique no telefone ou na área de trabalho.

#Application-Stats

  • O quê: resultados de tarefas agendadas, limpeza, estatísticas de e-mail transacionais, contagem de usuários e métricas de crescimento
  • Quem: profissionais de marketing por e-mail, administradores de sistema, qualquer pessoa interessada
  • Configurações de alerta: Faça negrito, mas não ding.

Conclusão

Tendo desenvolvido essa ideia por alguns meses e digerido os resultados, descobrimos que ela é uma extensão inestimável de nosso aplicativo. Sem ele, nos sentiríamos fora de contato com o que está acontecendo com o serviço e teríamos que caçar manualmente as mesmas informações por meio do painel, ou as consultas ao banco de dados seriam uma tarefa árdua.

Cada aplicativo e base de usuários é diferente, o que significa que esse conceito não pode ser incorporado a um serviço e oferecido às massas. Para ser valioso, requer um pequeno investimento inicial de tempo e recursos para se integrar profundamente em seu aplicativo. Quando estiver funcionando, o investimento será recompensado na forma de conexão de sua equipe com seu aplicativo e seus usuários.

Para concluir, aqui está uma recapitulação dos benefícios de usar o chat de equipe para monitorar seu aplicativo:

Obtenha uma nova perspectiva sobre o comportamento do usuário e do servidor

Ter um feed ao vivo em tempo real das métricas que mais importam para você e sua empresa o manterá conectado ao que os usuários estão fazendo e como o servidor está respondendo.

Reaja rapidamente quando as coisas falham

Você será capaz de reagir mais rápido do que nunca. Você saberá sobre as falhas ao mesmo tempo que seus usuários. Você pode reagir imediatamente a esse endpoint com falha, conexão de banco de dados perdida ou ataque DDoS.

Ofereça um Atendimento Excepcional ao Cliente

Entre em contato com o cliente que acabou de desativar sua conta para oferecer um desconto, agradeça pessoalmente aos clientes que atualizaram ou apenas acompanhe as pessoas para entender suas intenções. Quando você sabe o que os usuários estão fazendo e quando estão fazendo, pode descobrir facilmente o motivo.

A conexão da equipe com o aplicativo o tornará mais eficiente

Quando sua equipe está na mesma página com o aplicativo, a colaboração pode se concentrar na solução de problemas à medida que surgem, em vez de tentar descobrir o que aconteceu, onde aconteceu ou com quem aconteceu.

Notificações e canais podem ser dimensionados com seu aplicativo

À medida que seu aplicativo e sua equipe crescem, suas necessidades de monitoramento também aumentam. O Slack faz um ótimo trabalho ao fornecer a você todos os controles de permissão e notificação necessários para garantir que as informações certas cheguem às pessoas certas.

A pesquisa é poderosa

Ao registrar um nome de usuário em suas mensagens do Slack, você pode rastrear cada erro, mensagem de sucesso ou evento que um usuário gerou ao interagir com seu aplicativo simplesmente pesquisando seu nome de usuário no Slack. Apenas saiba que, com uma conta gratuita do Slack, isso é limitado às últimas 10.000 mensagens.

Pesquisar Slack por nome de usuário

Espero que você tenha achado esse conceito útil e adoraria ouvir outras histórias de equipes que implementaram formas semelhantes de monitoramento ou apenas outras maneiras interessantes de usá-lo e desenvolvê-lo.