使用 Slack 监控您的应用程序

已发表: 2022-03-10
快速总结 ↬在过去的几个月里,我一直在构建一个软件即服务 (SaaS) 应用程序,并且在整个开发过程中,我意识到 Slack(或一般的团队聊天)可以是多么强大的工具监控用户和应用程序的行为。 经过一些集成后,它为我们的应用程序提供了一个以前不存在的实时视图,它非常宝贵,我忍不住写了这个展示和讲述。

这一切都始于参观科罗拉多州丹佛市的一家小型初创公司。 在我访问期间,我开始每隔几分钟就听到办公室角落里传来微妙而迷人的“叮”声。 当我去调查这个奇怪的噪音时,我发现了一个连接到树莓派的服务铃,一个小金属锤连接到电路板上。 事实证明,Pi 正在接收来自团队服务器的消息,每次有新客户注册时,它都会敲响铃铛。

我一直认为这是一个很好的团队激励因素,它让我思考如何使用团队聊天来获得类似的体验,以及我们如何分析和可视化日志数据。

因为我们已经在使用 Slack 进行团队聊天,并且因为它有一个文档精美的 API,所以它是实验的明显选择。

关于 SmashingMag 的进一步阅读

  • 对话界面:我们今天在哪里? 我们将走向何方?
  • 团队协作和缩小响应式设计中的效率差距
  • 您应该了解的应用程序设计过程
  • 参加比赛:设计冲刺入门
跳跃后更多! 继续往下看↓

设置松弛

首先,我们必须从 Slack 获取一个“webhook URL”,以便以编程方式将消息发布到我们的 Slack 频道。

设置松弛
按照上述步骤从 Slack 获取 webhook URL(查看大图)

现在我们有了一个 webhook URL,是时候将 Slack 消息集成到我们的 Node.js 应用程序中了。 为此,我找到了一个方便的 No​​de.js 模块,名为 node-slack。

首先,我们安装了 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 集成,所以我们创建了一个 webhook 端点,当人们升级他们的计划、降级他们的计划、添加付款信息、更改付款信息和许多其他与订阅付款相关的事件时,它会从 Stripe 得到 ping,所有这些都发送到松弛:

支付信息

在前端监控用户行为

在前端有一些案例,我们希望以后端无法提供的方式了解用户行为,因此我们创建了一个端点来直接从前端发送 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 中看到的最有趣的事情之一是计划任务的结果。 我们的 SaaS 产品运行任务来通知人们他们网站的性能(我们的核心服务)、发送交易电子邮件、清理数据库和其他一些事情。 这些任务的触发和结果会向 Slack 发送一条消息:

服务器任务消息
(查看大图)

现在我们知道任务函数何时触发,该函数的结果是什么(在这种情况下,它会发送几封电子邮件)以及它是否因任何原因而失败。

将此概念应用于您的应用程序

上面的案例研究是我们监控 GoFaster.io 应用程序和服务的实际示例。 它对我们来说非常有效,但是这个概念如何扩展到每天发送数百甚至数千条消息的大型应用程序? 可以想象,这很快就会变成“狼来了”的情况,价值就会消失在噪音中。

不要平等对待所有通知

一些通知比其他通知更重要,并且重要性会因员工及其角色而异。 例如,软件开发和 IT 运营 (DevOps) 人员可能只关心服务器消息,而客户服务人员最关心用户的情况。

幸运的是,Slack 有一个很好的解决方案:渠道

频道可以由任何人创建,对您的组织公开或私有,并与任何人共享。 订阅频道后,您可以控制该频道的活动如何提醒您。 频道里每次都有新消息响吗? 它也会提醒您的手机吗? 它只加粗频道吗? 所有这些都可以由每个团队成员针对每个渠道进行控制,以满足他们的需求。

将这个想法付诸实践,一个更大的组织可以通过渠道在 Slack 中组织基于监视器的通知:

#Critical-Server-Errors

  • 什么:注册错误、登录错误、数据库读写错误
  • 谁:系统管理员、DevOps、CTO、CEO、开发人员
  • 警报设置:始终在手机或桌面上通知。

#Non-Critical-Server-Errors

  • 内容: 404 错误、包罗万象的服务器错误等。
  • 谁: DevOps、开发人员
  • 警报设置:加粗但不要叮当。

#金融

  • 内容:支付交易、交易失败、升级、降级、过期卡
  • 谁:首席财务官,首席执行官
  • 警报设置:下雨。

#用户行为

  • 内容注册、入职流程、更新计划类型、添加信息、删除信息、删除帐户
  • 谁:客户支持、社交媒体经理、开发人员、CEO
  • 警报设置:始终在手机或桌面上通知。

#Application-统计

  • 内容计划任务结果、内务管理、事务性电子邮件统计、用户数量和增长指标
  • 谁:电子邮件营销人员、系统管理员、任何感兴趣的人
  • 警报设置:加粗但不要叮当。

结论

在这个想法的基础上建立了几个月并消化了结果,我们发现它是我们应用程序的宝贵扩展。 如果没有它,我们会感觉与服务正在发生的事情脱节,并且必须通过仪表板手动搜索相同的信息,否则数据库查询将是一件苦差事。

每个应用程序和用户群都是不同的,这意味着这个概念不能构建到服务中并提供给大众。 为了有价值,它需要前期投入少量的时间和资源来深度集成到您的应用程序中。 一旦它启动并运行,投资将以您的团队与您的应用程序及其用户的连接形式获得回报。

总之,以下是使用团队聊天来监控您的应用程序的好处的回顾:

获得有关用户和服务器行为的全新视角

拥有对您和您的业务最重要的指标的实时实时馈送将使您与用户正在做什么以及服务器如何响应保持密切联系。

当事情失败时快速反应

您将能够比以往更快地做出反应。 您将在用户知道失败的同时知道失败。 您可以立即对失败的端点、丢失的数据库连接或 DDoS 攻击做出反应。

提供卓越的客户服务

联系刚刚禁用帐户的客户,为他们提供折扣,对升级的客户表示个人感谢,或者只是跟进人们以了解他们的意图。 当您知道用户在做什么以及他们在做什么时,您可以轻松找出原因。

团队与应用程序的联系将使您更有效率

当您的团队与应用程序在同一页面上时,协作可以集中在解决出现的问题上,而不是试图弄清楚发生了什么、发生在哪里或发生在谁身上。

通知和渠道​​可以随您的应用程序扩展

随着您的应用程序和团队的增长,您的监控需求也会增长。 Slack 在为您提供所有必要的权限和通知控制方面做得很好,以确保正确的信息到达正确的人。

搜索功能强大

通过在 Slack 消息中记录用户名,您可以跟踪用户在与您的应用程序交互时生成的每个错误、成功消息或事件,只需在 Slack 中搜索用户名即可。 只要知道,使用免费的 Slack 帐户,这仅限于最后 10,000 条消息。

按用户名搜索 Slack

我希望您发现这个概念很有用,并且我很想听听其他团队实施了类似形式的监控的故事,或者只是其他有趣的使用和构建方式的故事。