使用 Serverless Flux 监控网站响应时间

导航至

我的假期挑战是向我的家人解释 Serverless InfluxDB,这产生了一个有用的 Flux 脚本,任何人今天都可以使用。在我们深入代码之前,让我概述一下收集和可视化网站响应 HTTP 请求所需时间的高级方法

  1. 创建一个 Flux 脚本来测量网站的性能。
    • 确定要监控的 URL 并将其分配给 theURLtoMonitor 变量。
    • 记录当前时间。
    • 向网站发出 HTTP 调用。
    • 记录新的当前时间。
    • 通过将 d 减去 b 来计算网站响应时间。
    • 将监控的 URL、响应时间和 HTTP 状态代码保存到 InfluxDB bucket 中。
  2. 创建一个任务,每 5 分钟运行一次此 Flux 脚本。
  3. 构建一个仪表板来可视化网站的性能。

Flux 脚本

import "strings"
import "csv"
import "experimental/http"
import "system"

differenceInNanosec = (earlierTime, laterTime) => {
	return uint(v: laterTime) - uint(v: earlierTime)
}

theURLtoMonitor = "https://v2.docs.influxdata.com/v2.0/"

timeBeforeCall = system.time()
response = http.get(url: theURLtoMonitor)
timeAfterCall = system.time()

responseTime = differenceInNanosec(earlierTime: timeBeforeCall, laterTime: timeAfterCall)

data = "#group,false,false,true,true
#datatype,string,long,string,string
#default,mean,,,
,result,table,service,response_code
,,0,http_ping,${string(v: response.statusCode)}"

csv.from(csv: data)
	|> map(fn: (r) => ({r with _time: now()}))
	|> map(fn: (r) =>
		({r with _measurement: "PingService", url: theURLtoMonitor, method: "GET"}))
	|> to(bucket: "<bucket_name>", orgID: "<orgID>", fieldFn: (r) =>
		({"response_time_ms":  uint(v: responseTime) / uint(v: 1000000)  }))

解读 Flux 脚本

在样板导入 @1-4 之后,我们有一个名为 differenceInNanosec 的自定义函数 @6。这是一个辅助函数,用于将时间转换为整数以进行减法运算,并有助于理清要从哪个时间测量值中减去哪个。

算法的大部分工作在接下来完成,仅在几行 @10-16 中完成。@10 将网站 URL 分配给变量。@12-14 行在记录调用前后的时间之间执行实际的 HTTP 请求,我们使用 differenceInNanosec 中的时间来计算网站的响应时间 @16。

在获得响应时间后,我们需要将其保存到 InfluxDB。但是,我们需要跳过几个障碍。复杂之处在于我们的变量是简单的数据值,但 Flux 的 InfluxDB 连接器仅将 Flux 表写入 InfluxDB。

保存 Flux 表听起来很简单,但我们需要先创建它,并且截至今天(Flux 版本 0.57),只有两种创建 Flux 表的方法。第一种是 from(bucket:...);Flux 在查询 InfluxDB 数据时自动创建表。第二种创建 Flux 表的方法是通过 csv.from(csv:...)

第二种选择是我们唯一可行的选择,我们通过构建 csv.from() 的原始输入来构建 csv 表结构,从而将其投入使用 @18-22。@22 的难点是我决定使用 Strings 包来创建更动态的表。您可以通过使用字符串替换函数 ${string(v: response.statusCode)} 来插入 HTTP 状态代码,从而看到这种动态性。

一旦原始字符串组合在一起,我们就可以使用 csv.from() 创建一个表对象 @24。该表已接近可以保存的状态,但还需要进行一些调整才能满足 InfluxDB 写入要求。@25-26 添加了必需的时间戳和 _measurement 名称,虽然不是严格要求,但我还添加了 url 和 http 方法作为标签。最后,@29 我们将表保存到目标 bucket 中,响应时间位于 response_time_ms 字段中 — fieldFn: (r) => ({"response_time_ms":  uint(v: responseTime) / uint(v: 1000000)  }))

(请注意转换为毫秒,以便人类更容易理解测量值。)

创建 Flux 任务

Flux 脚本中发生了很多事情,但是将代码放在一起只是让我们到达了起跑线。我们希望每 5 分钟收集一次响应时间,这对于任务来说是完美的工作。

创建任务的第一步是将您的代码粘贴/写入脚本编辑器,并确保您的代码成功保存单个数据点。您可以通过复制和粘贴上面的代码到脚本编辑器并更改 URL、组织 ID 和 bucket 名称来验证上面的网站响应时间 Flux

Create Flux Task - screenshot

在确认脚本成功运行后,将您更新的脚本复制并粘贴到任务中。为此,请转到左侧的“任务”选项卡,然后选择右上角的创建任务 -> “新建任务”以打开空白任务编辑器。粘贴代码,命名任务,并指定它每 5 分钟运行一次,使用“5m”

create new Flux task screenshot

保存后,任务将每 5 分钟运行一次,以收集响应时间并将其存储在 response_time_ns 中。

构建仪表板以可视化响应时间

可视化收集的数据的方法几乎是无限的,但最简单的方法是转到数据浏览器,找到响应时间指标,并使用右上角的另存为按钮创建一个新的仪表板。

visualize response time

结果

monitor website response time dashboard

告诉我们您的想法!

立即注册免费的 Cloud 2 帐户或下载最新的 OSS 版本以在本地运行上述示例。与往常一样,如果您有任何问题或反馈,请在我们的社区论坛中告诉我们,或加入我们的 Slack