使用无服务器Flux监控网站响应时间

导航至

我在家庭假期向家人解释无服务器InfluxDB的挑战产生了一个有用的Flux脚本,任何人都可以立即投入使用。在我们深入代码之前,让我概述一下收集和可视化网站对HTTP请求响应时间的总体方法。

  1. 创建一个Flux脚本来测量网站的性能。
    • 确定要监控的URL并将其分配给theURLtoMonitor变量。
    • 记录当前时间。
    • 向网站发起HTTP请求。
    • 记录新的当前时间。
    • 通过从d中减去b计算网站响应时间。
    • 将监控的URL、响应时间和HTTP状态代码保存到InfluxDB桶中。
  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:...);当查询InfluxDB数据时,Flux会自动创建表格。第二种创建Flux表格的方法是通过csv.from(csv:...)

第二种选项是我们唯一可行的选项,我们在第18-22行将其用于构建csv.from()的原始输入以创建csv表格结构。第22行的问题是,我决定使用Strings包来创建一个更动态的表格。您可以通过使用字符串替换函数${string(v: response.statusCode)}来看到这种动态性的实际应用,以插入HTTP状态码。

将原始字符串组合好后,我们使用csv.from()在第24行创建一个表格对象。表格几乎已经准备好保存,但需要稍作调整以满足InfluxDB写入要求。第25-26行添加了所需的日期和时间戳以及_measurement名称,虽然不是强制要求,我还添加了url和http方法作为标签。最后,在第29行,我们将表格以response_time_ms字段(fieldFn: (r) => ({"response_time_ms":  uint(v: responseTime) / uint(v: 1000000)  }))的形式保存到目标桶中。

(注意将转换成毫秒,以便于人类理解测量。)

创建Flux任务

Flux脚本中发生了很多事情,但仅仅把代码拼凑起来只是刚刚开始。我们希望每5分钟收集一次响应时间,而这正是任务的最佳用途。

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

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社区中告诉我们!