Slackを使用してアプリを監視する
公開: 2022-03-10それはすべて、コロラド州デンバーの小さなスタートアップへの訪問から始まりました。 訪問中、私は数分ごとにオフィスの隅で微妙で魅惑的な「音」を聞き始めました。 この奇妙なノイズを調べに行ったところ、回路基板に接続された小さな金属ハンマーで、サービスベルがラズベリーパイに接続されているのを見つけました。 結局のところ、Piはチームのサーバーからメッセージを受信しており、新しい顧客がサインアップするたびに、ベルに小さなハンマーを振っていました。
それは素晴らしいチームのモチベーションだといつも思っていました。チームチャットを使用して同様のエクスペリエンスを実現する方法と、ログデータを分析および視覚化する方法について考えさせられました。
すでにチームチャットにSlackを使用しており、APIが美しく文書化されているため、実験では当然の選択でした。
SmashingMagの詳細:
- 会話型インターフェース:私たちは今日どこにいますか? 私たちはどこに向かっていますか?
- レスポンシブデザインにおけるチームコラボレーションとクロージング効率のギャップ
- アプリの設計プロセスについて知っておくべきこと
- オフ・トゥ・ザ・レース:デザインスプリント入門
Slackを設定する
まず、Slackチャネルにプログラムでメッセージを投稿するために、Slackから「webhookURL」を取得する必要がありました。
Webhook 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統合パッケージを見つけることができます。)
このコードを実行すると、#testSlackチャネルで次のメッセージが生成されました。
上記のコードは最小限ですが、SlackAPIと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; } } };
これで、このモジュールをアプリケーションのどこでも2行のコードで使用できます。将来、別のサービスにメッセージを送信することにした場合は、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);
これで、誰かが登録すると、次のメッセージが表示されます。
それも鳴ります! これは良いスタートであり、満足のいくサービスベルの感覚を私に与えましたが、それは私をもっと渇望させました。
深く掘り下げる
好奇心が高まるにつれ、「新しいユーザーを作成できなかった場合はどうなるのか」などと疑問に思い始めました。 ユーザーが登録し、ログインしたが、オンボーディングプロセスを完了しなかった場合はどうなりますか? スケジュールされたタスクの結果は何ですか? 基礎が整ったので、これらの質問に答えるのは簡単なことでした。
バックエンドで例外と重大なエラーを監視する
私たちが知りたかった最も重要なエラーの1つは、新しいユーザーの作成に失敗したかどうかでした。 ユーザー登録関数でエラーコールバックを見つけて、次のコードを追加するだけで済みました。
messenger.sendMessage(':x: Error While adding a new user ' + formData.email + ' to the DB. Registration aborted!' + error.code + ' ' + error.message);
これで、登録が失敗したとき、なぜ失敗したのか、さらに重要なことに、誰のために失敗したのかがすぐにわかりました。
私たちがメッセージを送ることができるあらゆる種類の興味深い場所がありました(エラーコールバックのあるほとんどどこでも)。 それらの場所の1つは、この一般的なキャッチオールエラー関数でした。
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を送信するWebhookエンドポイントを作成しました。スラック:
フロントエンドでのユーザーの行動を監視する
フロントエンドでは、バックエンドでは提供できない方法でユーザーの行動を理解したい場合がいくつかあったため、フロントエンドから直接Slackメッセージを送信するエンドポイントを作成しました。 Slack Webhook 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で最も興味深いものの1つは、スケジュールされたタスクの結果です。 当社のSaaS製品は、Webサイトのパフォーマンス(コアサービス)についてユーザーに通知するタスク、トランザクションメールを送信するタスク、データベースをクリーンアップするタスクなどを実行します。 これらのタスクの起動と結果は、Slackにメッセージを送信します。
これで、タスク関数がいつ起動するか、その関数の結果(この場合は複数の電子メールを送信する)、および何らかの理由で失敗するかどうかがわかります。
この概念をアプリケーションに適用する
上記のケーススタディは、GoFaster.ioアプリケーションとサービスを監視するために行ったことの実際的な例です。 それは私たちにとって素晴らしい働きをしましたが、この概念は、1日に数百、場合によっては数千ものメッセージを送信する大規模なアプリケーションにどのように拡張できるでしょうか。 ご想像のとおり、これはすぐに「オオカミを泣いたスラックボット」の状況に変わり、ノイズの中で価値が失われます。
すべての通知を平等に扱わないでください
一部の通知は他の通知よりも重要であり、重要性は従業員とその役割によって異なります。 たとえば、ソフトウェア開発とIT運用(DevOps)の人々はサーバーメッセージのみを気にするかもしれませんが、カスタマーサービスの人々はユーザーに何が起こっているかを最も気にするでしょう。
幸いなことに、Slackにはこの問題に対する優れた解決策があります:チャネル。
チャンネルは誰でも作成でき、組織に対して公開または非公開にし、誰とでも共有できます。 チャンネルに登録すると、そのチャンネルのアクティビティがどのようにアラートを出すかを制御できます。 チャンネル内の新しいメッセージは毎回鳴りますか? それはあなたの電話にも警告しますか? チャンネルを太字にするだけですか? これらはすべて、各チームメンバーがニーズに合わせてチャネルごとに制御できます。
このアイデアを実践するために、大規模な組織がチャネルを介してSlackでモニターベースの通知を整理する方法を次に示します。
#Critical-Server-エラー
- 内容:登録エラー、ログインエラー、データベースの読み取りおよび書き込みエラー
- 担当者:システム管理者、DevOps、CTO、CEO、開発者
- アラート設定:常に電話またはデスクトップで通知します。
#Non-Critical-Server-Errors
- 内容: 404エラー、キャッチオールサーバーエラーなど。
- 誰が: DevOps、開発者
- アラート設定:太字にしますが、音を立てないでください。
#財務
- 内容:支払い取引、失敗した取引、アップグレード、ダウングレード、期限切れのカード
- 担当者: CFO、CEO
- アラート設定:雨を降らせます。
#ユーザー-行動
- 内容:登録、オンボーディングプロセス、プランタイプの更新、情報の追加、情報の削除、アカウントの削除
- 担当者:カスタマーサポート、ソーシャルメディアマネージャー、開発者、CEO
- アラート設定:常に電話またはデスクトップで通知します。
#アプリケーション-統計
- 内容:スケジュールされたタスクの結果、ハウスキーピング、トランザクションメールの統計、ユーザー数、成長の指標
- 対象者:メールマーケター、システム管理者、興味のある人
- アラート設定:太字にしますが、音を立てないでください。
結論
このアイデアを数か月間構築し、結果を要約した結果、このアイデアはアプリケーションの非常に貴重な拡張であることがわかりました。 これがないと、サービスで何が起こっているのかわからなくなってしまい、ダッシュボードを介して同じ情報を手動で探し出す必要があります。そうしないと、データベースクエリが面倒になります。
アプリケーションとユーザーベースはそれぞれ異なります。つまり、この概念をサービスに組み込んで大衆に提供することはできません。 価値のあるものにするためには、アプリケーションに深く統合するための時間とリソースのわずかな先行投資が必要です。 稼働すると、投資は、アプリケーションとそのユーザーへのチームの接続性という形で報われます。
結論として、チームチャットを使用してアプリケーションを監視することの利点の要約を次に示します。
ユーザーとサーバーの動作に関する新たな視点を得る
あなたとあなたのビジネスにとって最も重要なメトリックのリアルタイムのライブフィードを持つことで、ユーザーが行っていることとサーバーがどのように応答しているかに密接につながることができます。
物事が失敗したときに迅速に対応する
これまで以上に速く反応できるようになります。 ユーザーが行うのと同時に、障害について知ることができます。 障害が発生したエンドポイント、データベース接続の喪失、またはDDoS攻撃に即座に対応できます。
卓越したカスタマーサービスを提供する
アカウントを無効にしたばかりの顧客に連絡して割引を提供したり、アップグレードした顧客に個人的に感謝したり、単に人々にフォローアップして彼らの意図を理解したりします。 ユーザーが何をしているのか、いつそれをしているのかがわかれば、その理由を簡単に見つけることができます。
アプリケーションへのチームの接続性により、効率が向上します
チームがアプリケーションと同じページにいる場合、コラボレーションは、何が起こったのか、どこで起こったのか、誰に起こったのかを理解しようとするのではなく、問題が発生したときにそれを解決することに集中できます。
通知とチャネルはアプリケーションに合わせて拡張できます
アプリケーションとチームが成長するにつれて、監視のニーズも高まります。 Slackは、適切な情報が適切な人に確実に届くようにするために必要なすべての許可と通知の制御を提供するという素晴らしい仕事をします。
検索は強力です
Slackメッセージにユーザー名を記録することで、Slackでユーザー名を検索するだけで、アプリケーションの操作中にユーザーが生成したすべてのエラー、成功メッセージ、またはイベントを追跡できます。 無料のSlackアカウントでは、これは最後の10,000メッセージに制限されていることを知っておいてください。
この概念がお役に立てば幸いです。同様の形式の監視を実装したチームの他の話や、それを使用して構築するための他の興味深い方法を聞いてみたいと思います。