Slack을 사용하여 앱 모니터링
게시 됨: 2022-03-10이 모든 것은 콜로라도주 덴버에 있는 작은 스타트업을 방문하는 것에서 시작되었습니다. 방문하는 동안 몇 분마다 사무실 구석에서 미묘하고 매혹적인 "딩" 소리가 들리기 시작했습니다. 이 이상한 소음을 조사하러 갔을 때 회로 기판에 연결된 작은 금속 망치와 함께 Raspberry Pi에 연결된 서비스 벨을 발견했습니다. 결과적으로 Pi는 팀 서버에서 메시지를 수신하고 있었고 새로운 고객이 등록할 때마다 종을 두드리는 작은 망치를 휘둘렀습니다 .
나는 항상 그것이 훌륭한 팀 동기 부여라고 생각했고, 팀 채팅을 사용하여 유사한 경험을 달성하는 방법과 로그 데이터를 분석하고 시각화하는 방법에 대해 생각하게 되었습니다.
우리는 이미 팀 채팅에 Slack을 사용하고 있었고 API가 아름답게 문서화되어 있기 때문에 실험을 위한 확실한 선택이었습니다.
SmashingMag에 대한 추가 정보:
- 대화형 인터페이스: 오늘날 우리는 어디에 있습니까? 우리는 어디로 가고 있습니까?
- 반응형 디자인의 팀 협업 및 효율성 격차 해소
- 앱 디자인 프로세스에 대해 알아야 할 사항
- 레이스 시작하기: 디자인 스프린트 시작하기
Slack 설정
먼저, 프로그래밍 방식으로 Slack 채널에 메시지를 게시하기 위해 Slack에서 "웹훅 URL"을 가져와야 했습니다.
이제 웹훅 URL이 있으므로 Slack 메시지를 Node.js 애플리케이션에 통합할 때입니다. 이를 위해 node-slack이라는 편리한 Node.js 모듈을 찾았습니다.
먼저 Node.js 모듈을 설치했습니다.
npm install node-slack --save
이제 몇 줄의 코드로 Slack 메시지를 선택한 채널로 보낼 수 있습니다.
// 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' });
(Ruby, Python 및 거의 모든 다른 언어에 대해 유사한 Slack 통합 패키지를 찾을 수 있습니다.)
이 코드를 실행하면 #test Slack 채널에 다음 메시지가 생성됩니다.
위의 코드는 최소한이지만 Slack API 및 node-slack 모듈에만 해당됩니다. 특정 메시징 서비스에 얽매이고 싶지 않았기 때문에 서비스별 코드를 실행하는 일반 Node.js 모듈 함수를 만들었습니다.
// 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; } } };
이제 우리는 두 줄의 코드로 애플리케이션의 어느 곳에서나 이 모듈을 사용할 수 있으며, 나중에 다른 서비스로 메시지를 보내기로 결정하면 Messenger.js에서 쉽게 교체할 수 있습니다.
var messenger = require('./utilities/messenger'); messenger.sendMessage(':rocket: Nice job, I\'m all set up!', '#test');
이제 기본 설정이 완료되었으므로 애플리케이션 내에서 메시지를 시작할 준비가 되었습니다.
등록 추적
비즈니스의 첫 번째 순서는 서비스 벨 패리티를 달성하는 것이었습니다. 사용자 등록 기능의 성공 콜백을 찾았고 다음 코드를 추가했습니다.
messenger.sendMessage('New user registration! ' + user.email);
이제 누군가가 등록하면 다음 메시지가 표시됩니다.
심지어 땡! 이것은 좋은 시작이었고 만족스러운 서비스 벨 느낌을 주었지만 더 목마르게 만들었습니다.
더 깊이 잠수
땡할 때마다 궁금증이 커짐에 따라 새 사용자를 만드는 데 실패하면 어떻게 될까요? 사용자가 등록하고 로그인했지만 온보딩 프로세스를 완료하지 않은 경우 어떻게 됩니까? 예정된 작업의 결과는 무엇입니까? 이제 기초가 마련되었으므로 이러한 질문에 답하는 것은 식은 죽 먹기였습니다.
백엔드에서 예외 및 심각한 오류 모니터링
우리가 알고 싶었던 가장 중요한 오류 중 하나는 새 사용자를 만드는 데 실패한 경우였습니다. 사용자 등록 함수에서 오류 콜백을 찾고 다음 코드를 추가하기만 하면 됩니다.
messenger.sendMessage(':x: Error While adding a new user ' + formData.email + ' to the DB. Registration aborted!' + error.code + ' ' + error.message);
이제 등록이 실패했을 때, 왜 실패했는지, 더 중요하게는 등록에 실패했는지 즉시 알 수 있었습니다.
우리가 메시지를 보낼 수 있는 모든 종류의 흥미로운 장소가 있었습니다(오류 콜백이 있는 거의 모든 곳). 그 장소 중 하나는 다음과 같은 포괄적인 오류 기능이었습니다.
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 }); });
이 코드는 처리되지 않은 예외에 대한 요청이 어떻게 생겼는지 알아내는 데 도움이 되었습니다. 이러한 오류를 유발한 요청을 살펴봄으로써 근본 원인을 추적하고 더 이상 일반 오류가 없을 때까지 수정할 수 있습니다.
이러한 모든 오류 알림이 제자리에 있으면 이제 앱에서 중대한 문제가 발생하면 즉시 알 수 있다는 사실에 안심할 수 있습니다.
재무 모니터링
다음으로 애플리케이션에서 금융 이벤트가 발생하면 알림을 보내고 싶었습니다. SaaS 제품이 Stripe와 통합되기 때문에 사람들이 요금제를 업그레이드하거나, 요금제를 다운그레이드하고, 지불 정보를 추가하고, 지불 정보를 변경하고, 구독 지불과 관련된 기타 여러 이벤트가 있을 때 Stripe에서 ping을 받는 웹훅 엔드포인트를 만들었습니다. 느슨하게:
프런트 엔드에서 사용자 행동 모니터링
프론트엔드에서 백엔드가 제공할 수 없는 방식으로 사용자 행동을 이해하고자 하는 몇 가지 경우가 있었기 때문에 프론트엔드에서 직접 Slack 메시지를 보내는 엔드포인트를 만들었습니다. 우리의 Slack 웹훅 URL은 POST
끝점 뒤에서 보호되기 때문에 끝점을 통해 우리 팀에 Slack 메시지를 보내는 것이 노출될 위험을 최소화했습니다.
끝점이 제자리에 있으면 이제 간단한 AngularJS $http.post
호출로 Slack 메시지를 실행할 수 있습니다.
// send Slack notification from the front end var message = ":warning: Slack disconnected by " + $scope.user.username; $http.post('/endpoint', message);
이것은 비즈니스에 대한 중요한 질문에 답하는 데 도움이 됩니다. 사람들이 도메인 이름을 등록하고 추가하고 있습니까? 그렇지 않습니까? 누군가가 있다면 소유자가 도메인을 추가한 직후에 개인적으로 연락하고 싶은 아주 세간의 이목을 끄는 도메인을 위한 것입니까? 이제 다음을 활용할 수 있습니다.
어느 시점에서 우리는 사람들이 도메인을 추가하고 제거한 다음 몇 분 안에 도메인을 읽는 패턴을 보았고, 이는 다른 방법으로는 결코 발견하지 못했을 모호한 버그에 대한 단서를 제공했습니다.
또한 사용자가 서비스에 만족하지 못한다는 신호가 있으며 이는 알아야 할 가치가 있습니다. 누군가가 도메인 이름을 제거했습니까? 그들은 Slack의 연결을 끊었습니까?
이 피드백을 통해 가장 중요할 때 적극적으로 연락하여 즐거운 고객 지원을 제공할 수 있습니다.
예약된 작업 모니터링
Slack에서 볼 수 있는 가장 흥미로운 것 중 하나는 예약된 작업의 결과입니다. 우리의 SaaS 제품은 사람들에게 웹사이트의 성능(우리의 핵심 서비스)에 대해 알리고, 트랜잭션 이메일을 보내고, 데이터베이스 및 기타 몇 가지 작업을 정리하는 작업을 실행합니다. 이러한 작업의 실행 및 결과는 Slack에 메시지를 보냅니다.
이제 우리는 작업 기능이 실행될 때 해당 기능의 결과가 무엇인지(이 경우 여러 이메일을 보냅니다), 어떤 이유로든 실패하는지 여부를 압니다.
이 개념을 애플리케이션에 적용
위의 사례 연구는 GoFaster.io 애플리케이션 및 서비스를 모니터링하기 위해 수행한 작업의 실제 예입니다. 그것은 우리에게 환상적으로 작동했지만 이 개념이 어떻게 하루에 수백, 어쩌면 수천 개의 메시지를 보내는 대규모 응용 프로그램으로 확장될 수 있습니까? 상상할 수 있듯 이는 순식간에 "늑대를 우는 슬랙봇" 상황으로 변해 그 가치를 잃어버릴 것이다.
모든 알림을 동등하게 취급하지 마십시오
일부 알림은 다른 알림보다 더 중요하며 중요도는 직원과 역할에 따라 다릅니다. 예를 들어, 소프트웨어 개발 및 IT 운영(DevOps) 담당자는 서버 메시지에만 관심이 있는 반면 고객 서비스 담당자는 사용자에게 일어나는 일에 가장 관심이 있습니다.
운 좋게도 Slack에는 이 문제에 대한 훌륭한 솔루션이 있습니다. 바로 channel .
채널은 누구나 생성할 수 있고 조직에 공개 또는 비공개로 설정하고 누구와도 공유할 수 있습니다. 채널을 구독하면 해당 채널의 활동이 알림을 보내는 방식을 제어할 수 있습니다. 채널의 새 메시지가 매번 울리나요? 그것은 당신의 전화도 경고합니까? 채널만 굵게 표시되나요? 이 모든 것은 각 팀 구성원이 필요에 맞게 각 채널에 대해 제어할 수 있습니다.
이 아이디어를 실행하면 더 큰 조직이 채널을 통해 Slack에서 모니터 기반 알림을 구성할 수 있는 방법은 다음과 같습니다.
#Critical-Server-Errors
- 내용: 등록 오류, 로그인 오류, 데이터베이스 읽기 및 쓰기 오류
- 대상: 시스템 관리자, DevOps, CTO, CEO, 개발자
- 알림 설정: 항상 전화 또는 바탕 화면에 알립니다.
#Non-Critical-Server-Errors
- 내용: 404 오류, 포괄 서버 오류 등
- 대상: DevOps, 개발자
- 경고 설정: 굵게 표시하되 징징거리지 마십시오.
#재무
- 대상: 결제 거래, 거래 실패, 업그레이드, 다운그레이드, 만료된 카드
- 누구: CFO, CEO
- 알림 설정: 비를 내리세요.
#사용자 행동
- What: 등록, 온보딩 프로세스, 요금제 유형 업데이트, 정보 추가, 정보 제거, 계정 삭제
- 대상: 고객 지원, 소셜 미디어 관리자, 개발자, CEO
- 알림 설정: 항상 전화 또는 바탕 화면에 알립니다.
#응용 프로그램 통계
- 내용: 예약된 작업 결과, 하우스키핑, 트랜잭션 이메일 통계, 사용자 수 및 증가 메트릭
- 대상: 이메일 마케팅 담당자, 시스템 관리자, 관심 있는 모든 사람
- 경고 설정: 굵게 표시하되 징징거리지 마십시오.
결론
몇 달 동안 이 아이디어를 기반으로 하고 결과를 요약한 결과, 우리는 이것이 우리 응용 프로그램의 귀중한 확장이라는 것을 알게 되었습니다. 그것이 없으면 우리는 서비스에 무슨 일이 일어나고 있는지 느낄 수 없을 것이고 대시보드를 통해 동일한 정보를 수동으로 찾아내야 하거나 데이터베이스 쿼리가 귀찮은 일이 될 것입니다.
모든 응용 프로그램과 사용자 기반이 다르기 때문에 이 개념을 서비스에 구축하여 대중에게 제공할 수 없습니다. 가치가 있기 위해서는 애플리케이션에 깊이 통합하는 데 약간의 선행 투자 시간과 리소스가 필요합니다. 일단 가동되고 실행되면 팀이 애플리케이션 및 해당 사용자에 연결되는 형태로 투자에 대한 성과를 거둘 것입니다.
결론적으로 팀 채팅을 사용하여 애플리케이션을 모니터링할 때의 이점을 요약하면 다음과 같습니다.
사용자 및 서버 행동에 대한 새로운 관점 확보
귀하와 귀하의 비즈니스에 가장 중요한 메트릭에 대한 실시간 라이브 피드를 사용하면 사용자가 수행하는 작업과 서버가 응답하는 방식에 밀접하게 연결할 수 있습니다.
일이 실패할 때 신속하게 대응
그 어느 때보다 빠르게 대응할 수 있습니다. 사용자가 실패하는 것과 동시에 실패에 대해 알게 될 것입니다. 실패한 엔드포인트, 데이터베이스 연결 끊김 또는 DDoS 공격에 즉시 대응할 수 있습니다.
탁월한 고객 서비스 제공
방금 계정을 비활성화한 고객에게 연락하여 할인을 제공하거나, 업그레이드한 고객에게 개인적으로 감사를 표하거나, 사람들의 의도를 이해하기 위해 후속 조치를 취하십시오. 사용자가 무엇을 하고 있고 언제 하는지 알면 그 이유를 쉽게 알 수 있습니다.
애플리케이션에 대한 팀 연결은 당신을 더 효율적으로 만들 것입니다
팀이 응용 프로그램과 같은 페이지에 있는 경우 협업은 무슨 일이 일어났는지, 어디서 발생했는지, 누구에게 발생했는지 파악하는 대신 문제가 발생했을 때 해결하는 데 중점을 둘 수 있습니다.
알림 및 채널은 애플리케이션에 따라 확장 가능
애플리케이션과 팀이 성장함에 따라 모니터링 요구 사항도 커집니다. Slack은 올바른 정보가 올바른 사람에게 전달되도록 하는 데 필요한 모든 권한 및 알림 제어 기능을 제공합니다.
강력한 검색
Slack 메시지에 사용자 이름을 기록하면 Slack에서 사용자 이름을 검색하는 것만으로 사용자가 애플리케이션과 상호 작용하는 동안 생성한 모든 오류, 성공 메시지 또는 이벤트를 추적할 수 있습니다. 무료 Slack 계정을 사용하면 최근 10,000개의 메시지로 제한됩니다.
이 개념이 유용했기를 바랍니다. 유사한 형태의 모니터링 또는 이를 사용하고 구축하는 다른 흥미로운 방법을 구현한 팀의 다른 이야기를 듣고 싶습니다.