如何使用 MongoDB Stitch 集成 MongoDB Atlas 和 Segment





0/5 (0投票)
整合多个系统、API 和第三方服务可能非常困难。最近,我们在内部遇到了这个确切的问题,当时我们想将数据从 Segment 导入 MongoDB,以便我们可以利用 MongoDB 的原生分析功能和丰富的查询语言。
整合多个系统、API 和第三方服务可能非常困难。最近,我们在内部遇到了这个确切的问题,当时我们想将数据从 Segment 导入 MongoDB,以便我们可以利用 MongoDB 的原生分析功能和丰富的查询语言。使用一些巧妙的工具,我们能在不到一个小时的时间内完成这项工作——这是第一次。
虽然这篇博文内容详细,但实际实施应该只需要大约 20 分钟。我将首先介绍我们的主要角色(我们用来做这件事的工具),然后我们将一起探讨我们是如何完成的。
主要角色
自 2011 年以来,开发人员一直转向Segment来收集来自各种来源(包括移动、Web、云应用程序和服务器)的数据。Segment 将多个数据源生成的事件整合为单一的点击流。然后,您可以轻松地将数据路由到 200 多个集成。DigitalOcean、New Relic、InVision 和 Instacart 等公司都依赖 Segment 来实现其增长战略的各个部分。
要存储 Segment 生成的数据,我们转向MongoDB Atlas – MongoDB 的数据库即服务。Atlas 提供了 MongoDB 的最佳特性
- 简单易用的查询语言,方便您处理数据
- 原生复制和分片,确保数据可以放置在需要的地方
- 灵活的数据模型,允许您轻松地从各种来源摄取数据,而无需确切了解数据的结构(其形状)
所有这些都封装在一个完全托管的服务中,该服务由构建数据库的同一团队设计和运行,这意味着作为开发人员,您可以兼得鱼与熊掌。
最后一个角色是MongoDB Stitch,MongoDB 的无服务器平台。Stitch 通过简单、安全的数据和服务访问来简化应用程序开发和部署,从而加快应用程序上市速度,同时降低运营成本。Stitch 允许我们实现服务器端逻辑,将 Segment 等第三方工具与 MongoDB 连接起来,同时确保从安全到性能的方方面面都得到优化。
操作顺序
我们将按以下步骤进行。如果您已经完成了其中一些步骤,请随时只选择您需要帮助的相关项目
- 设置 Segment 工作区
- 将 Segment 的 JavaScript 库添加到您的前端应用程序——我还构建了一个极其简单的 HTML 页面供您测试
- 在用户点击按钮时向 Segment 发送事件
- 注册 MongoDB Atlas
- 创建集群,以便您的数据有存储位置
- 创建一个 MongoDB Stitch 应用程序,该应用程序接受来自 Segment 的数据并将其保存到您的MongoDB Atlas集群
虽然这篇博文侧重于将 Segment 与 MongoDB 集成,但我们下面概述的过程也可用于与其他 API 和 Web 服务集成。如果您正尝试使用不同的服务进行集成,请加入社区 Slack并提问。
每次 Segment 接收到新数据时,都会触发一个 webhook,向 Stitch 发送一个 HTTP POST 请求。然后,Stitch 函数处理请求的身份验证,并且在不执行任何数据操作的情况下,将请求的正文直接保存到数据库中——为进一步分析做好准备。
在 Segment 中设置工作区
前往Segment.com并注册一个帐户。完成后,Segment 将自动为您创建一个工作区。工作区允许您与团队成员协作、控制权限以及在整个团队共享数据源。单击您刚刚创建的工作区。
为了开始在您的工作区中收集数据,我们需要添加一个源。在这种情况下,我将从网站收集数据,所以我将选择该选项,然后在下一个屏幕上,Segment 将在我的工作区中添加一个 JavaScript 源。来自我们网站的任何数据都将归因于此源。源中有一个蓝色的切换链接,点击它可以获取添加到我的网站的代码,以便它可以向 Segment 发送数据。请注意这一点,因为我们很快就会需要它。
将 Segment 添加到您的网站
我之前提到过一个简单的示例页面,如果您想在您正在处理的其他代码之外测试此集成,可以使用它。您可以从这个 GitHub 仓库获取它。
在我的示例页面中,您会看到我已经复制并粘贴了 Segment 代码,并将其放在页面<head>
标签之间。您需要对您正在使用的任何代码或语言执行相同的操作。
如果在浏览器中打开该页面,它应该会自动开始向 Segment 发送数据。最简单的方法是打开另一个窗口中的 Segment,然后单击调试器。
在 Segment UI 中点击调试器按钮会带您进入应用程序发送的事件的实时流。
自定义发送到 Segment 的事件
Segment 库允许您尽可能细粒度地控制从应用程序发送的数据。
随着应用程序的增长,您可能会想扩展跟踪的范围。最佳实践要求您仔细考虑如何命名事件以及发送什么数据。否则,不同的开发人员将以不同的方式命名事件并在不同时间发送它们——阅读这篇博文以了解更多关于此主题的内容。
为了开始,我假设我们想跟踪每次用户在网页上点击收藏按钮。我们将使用一些简单的 JavaScript 来调用 Segment 的分析跟踪代码,并向 Segment API 发送一个名为“track”的事件。这样,每次有人点击我们的收藏按钮时,我们都会知道。
您会看到,在我的网页底部,有一个附加到 .btn
类的 jQuery 函数。让我们在 alert()
函数之后添加以下内容。
analytics.track("Favorited", { itemId: this.id, itemName: itemName });
现在,在浏览器中刷新页面并点击其中一个收藏按钮。您应该会看到一个警报框弹出。如果您转向 Segment 中的调试器窗口,您将观察到 track 事件也在流式传输。很酷,对吧!
您可能已经注意到上面的分析代码正在将您想要发送的数据存储在 JSON 文档中。您可以随时添加带有更具体信息的字段。传统上,这些数据会发送到某种表格数据存储,如 MySQL 或 PostgreSQL,但每次添加新信息时,您都必须执行迁移才能为表添加新列。除此之外,您可能还需要更新负责将事件保存在数据库中的对象关系映射代码。MongoDB 是一个灵活的数据存储,这意味着不需要迁移或转换,因为我们将以您发送数据的确切形式存储它。
开始使用 MongoDB Atlas 和 Stitch
如前所述,我们将使用 MongoDB 的两个不同服务。第一个是 MongoDB Atlas,它是一个数据库即服务。所有由 Segment 生成的数据都将长期保存在这里。第二个是 MongoDB Stitch,它将充当我们的后端。我们将使用 Stitch 设置一个端点,Segment 可以将数据发送到该端点。接收数据后,Stitch 会验证请求是否来自 Segment,然后协调所有逻辑将此数据保存到 MongoDB Atlas 以供以后分析和其他活动。
首次使用 MongoDB Atlas?
请点击此处在 MongoDB Atlas 中设置一个帐户。
创建帐户后,我们将使用 Atlas 的 Cluster Builder 来设置我们的第一个集群(每个 MongoDB Atlas 部署由多个节点组成,以提高高可用性,这就是为什么我们称之为集群)。对于此演示,我们可以使用 M0 实例——它永远免费,非常适合沙盒环境。它不在专用基础设施上,因此对于任何生产工作负载,都值得研究其他实例大小。
当 Cluster Builder 出现在屏幕上时,默认云提供商是 AWS,选定的区域是 North Virginia。保持不变。向下滚动并点击 Cluster Tier 部分,这将展开显示不同的尺寸选项。选择列表顶部的 M0。
您也可以通过点击 Cluster Name 部分来定制集群的名称。
完成后,点击 Create Cluster。设置集群需要 7-10 分钟,所以您不妨去喝杯饮料,伸伸腿,然后再回来……准备好后,继续阅读。
创建 Stitch 应用程序
在集群构建期间,在左侧菜单中,点击 Stitch Apps。您将被带到 Stitch 应用程序页面,然后可以点击 Create New Application。
为您的应用程序命名,在此示例中,我将其命名为“SegmentIntegration”,并将其链接到正确的集群。点击 Create。
应用程序准备好后,您将被带到 Stitch 欢迎页面。在此示例中,我们可以关闭匿名身份验证。
我们需要启用对 MongoDB 集合的访问权限,以存储来自 Segment 的数据。数据库名称我使用“segment”,集合我使用“events”。点击 Add Collection。
接下来,我们需要添加一个服务。在这种情况下,我们将手动配置一个 HTTP 服务,该服务可以与 Segment 的服务进行 Web 通信。向下滚动并点击 Add Service。
您将跳转到一个页面,上面会显示一条大标语:“This application has no services”……很快就会有。再次点击 Add a Service。
从现在可见的选项中,选择 HTTP,然后为服务命名。我将使用“SegmentHTTP”。点击 Add Service。
接下来,我们需要添加一个 Incoming Webhook。Webhook 是一个 HTTP 端点,它将持续监听来自 Segment 的传入调用,当调用时,它将触发 Stitch 中的一个函数来运行。
点击 Add Incoming Webhook
- 保持默认名称不变,并更改以下字段
- 启用 Respond with Result,这将返回我们插入操作的结果
- 将 Request Validation 更改为“Require Secret as Query Param”
- 在页面上的最后一个字段中添加一个秘密代码。重要提示:我们将此称为我们的“公共密钥”,因为它不受外部世界保护,它更多的是 Stitch 在运行我们将创建的函数之前可以使用的一个简单验证。稍后,我们还将定义一个“私有密钥”,它不会在 Stitch 和 Segment 之外可见。
最后,点击“Save”。
使用 Stitch 中的函数定义请求处理逻辑
我们在 Stitch 中使用函数定义自定义行为,这些函数是简单的 JavaScript (ES6),可用于实现逻辑并处理与 Stitch 集成的所有不同服务。
值得庆幸的是,我们在这里不需要做太多工作。Stitch 已经为我们设置了基础。我们需要定义执行以下操作的逻辑:
- 从 HTTP 标头获取请求签名
- 使用签名验证请求的真实性(即,它来自 Segment)
- 将请求写入 MongoDB Atlas 中的
segment.events
集合
获取 HTTP 标头并生成 HMAC 签名
在第 8 行,花括号 } 之后,添加以下内容。
const signature = payload.headers['X-Signature'];
然后使用 Stitch 内置的Crypto 库生成一个摘要,我们将用它与签名进行比较。
const digest = utils.crypto.hmac(payload.body.text(), context.values.get("segment_shared_secret"), "sha1", "hex");
这里有很多内容,我将逐步解释。Segment 使用一个签名来签名请求,该签名是 HTTP 主体和共享密钥的组合。如果我们知道请求的主体、共享密钥、Segment 用于创建其签名的哈希函数以及输出格式,我们可以使用 utils.crytop.hmac
函数尝试生成一个相同的签名。如果我们能够复制 Segment 的 X-Signature 标头中的内容,我们将认为这是一个经过身份验证的请求。
注意:这将使用私有密钥,而不是我们在创建 webhook 时在“Settings”页面定义的公共密钥。此密钥绝不应公开可见。Stitch 允许我们定义可用于存储 API 密钥和密钥等变量的值。我们稍后会这样做。
验证请求的真实性并将数据写入 MongoDB Atlas
为了验证请求,我们只需要比较 digest
和 signature
。如果它们相等,我们将写入数据库。在生成 digest
的代码之后直接添加以下代码。
if (digest == signature) { // Request is valid } else { // Request is invalid console.log("Request is invalid"); }
最后,我们将使用适当的行为来增强 if 语句,以保存我们的数据。在 if 语句的第一行,我们将获取我们的“mongodb-atlas”服务。添加以下代码
let mongodb = context.services.get("mongodb-atlas");
接下来,我们将获取数据库集合,以便能够向其中写入数据。
let events = mongodb.db("segment").collection("events");
最后,我们写入数据。
events.insertOne(body);
点击左上角的 Save 按钮。到最后,我们的整个函数应该如下所示
exports = function(payload) { var queryArg = payload.query.arg || ''; var body = {}; if (payload.body) { body = JSON.parse(payload.body.text()); } // Get x-signature header and create digest for comparison const signature = payload.headers['X-Signature']; const digest = utils.crypto.hmac(payload.body.text(), context.values.get("segment_shared_secret"), "sha1", "hex"); //Only write the data if the digest matches Segment's x-signature! if (digest == signature) { let mongodb = context.services.get("mongodb-atlas"); // Set the collection up to write data let events = mongodb.db("segment").collection("events"); // Write the data events.insertOne(body); } else { console.log("Digest didn't match"); } return queryArg + ' ' + body.msg; };
为 MongoDB Atlas 集合定义规则
接下来,我们需要更新允许 Stitch 写入我们的数据库集合的规则。为此,在左侧菜单中,点击“mongodb-atlas”。
选择我们之前创建的名为“segment.events
”的集合。这将显示我们顶级文档的字段规则。我们可以使用这些规则来定义我们的 Stitch 函数能够读取或写入集合必须满足的条件。
目前我们将保持读取规则不变,因为我们将不直接从我们的 Stitch 应用程序读取。但是,我们将更改写入规则以“evaluate”(求值),以便我们的函数可以写入数据库。
更改“Write”框中的内容
- 在文档级别将空 JSON 文档 {} 指定为写入规则。
- 如果尚未设置,请将 Allow All Other Fields 设置为 Enabled。
点击编辑器顶部的 Save。
在 MongoDB Stitch 中添加密钥值
作为常用做法,API 密钥和密码存储为变量,这意味着它们永远不会提交到代码仓库——可见性降低。Stitch 允许我们创建私有变量(值),这些变量只能由传入的 webhook、规则和命名函数访问。
我们通过点击 Stitch 菜单上的 Values,然后点击 Create New Value,并为我们的值命名——在此示例中为 segment_shared_secret
(我们将此称为我们的私有密钥)。我们在大文本框中输入内容。完成后请务必点击 Save。
获取我们的 Webhook URL
要将 webhook URL 从 Stitch 复制到 Segment,请使用控制菜单进行导航:Services > SegmentHTTP > webhook0 > Settings(在页面顶部)。现在复制“Webhook URL”。
在我们的示例中,Webhook 看起来如下
https://webhooks.mongodb-stitch.com/api/client/v2.0/app/segmentintegration/service/SegmentHTTP/incoming_webhook/webhook0
将 Webhook URL 添加到 Segment
前往 Segment 并登录您的工作区。在 destinations(目的地)中,我们将点击 Add Destination。
在目的地目录中搜索 Webhook 并点击 Webhooks。进入下一页后,点击 Configure Webhooks。然后选择您想要发送数据的任何源。选择后,点击 Confirm Source。
接下来,我们将进入目的地设置页面。我们需要配置我们的连接设置。点击标有 Webhooks (max 5) 的框。
复制您在 Stitch 中的 webhook URL,并确保使用以下语法在末尾附加您的公共密钥
初始 URL
https://webhooks.mongodb-stitch.com/api/client/v2.0/app/segmentintegration/service/SegmentHTTP/incoming_webhook/webhook0
在末尾添加:?secret=<YOUR_PUBLIC_SECRET_HERE>
最终 URL
https://webhooks.mongodb-stitch.com/api/client/v2.0/app/segmentintegration/service/SegmentHTTP/incoming_webhook/webhook0?secret=PUBLIC_SECRET
点击“保存”
我们还需要告诉 Segment 我们的私有密钥是什么,以便它能够创建一个可以在 Stitch 中验证的签名。为此,请点击 Shared Secret 字段并输入您用于 segment_shared_secret
的值。点击 Save。
最后,我们所要做的就是通过点击目的地设置页面顶部的开关来激活 webhook
生成事件,并在 MongoDB 中查看您的数据
现在,我们所要做的就是使用我们的测试 HTML 页面生成一些发送到 Segment 的事件——我们可以使用 Segment 的调试器来确保它们正在进入。一旦我们看到它们流动,它们也将被发送到 MongoDB Stitch,Stitch 会将事件写入 MongoDB Atlas。
我们将使用Compass快速查看,以确保我们的数据可见。连接到我们的集群后,我们应该会看到一个名为“segment”的数据库。点击 segment,然后您会看到我们名为“events”的集合。如果您点击它,您将看到我们前端生成的数据样本!
结束
感谢您的阅读——希望您觉得这很有帮助。如果您正在使用 MongoDB Stitch 构建新东西,我们很乐意听到您的反馈。加入社区 Slack并在 #stitch 频道提问!