使用无服务器Flux监控网站响应时间
作者:Nate Isley / 用例,开发者,产品
2020年1月8日
导航至
我在家庭假期向家人解释无服务器InfluxDB的挑战产生了一个有用的Flux脚本,任何人都可以立即投入使用。在我们深入代码之前,让我概述一下收集和可视化网站对HTTP请求响应时间的总体方法。
- 创建一个Flux脚本来测量网站的性能。
- 确定要监控的URL并将其分配给
theURLtoMonitor
变量。 - 记录当前时间。
- 向网站发起HTTP请求。
- 记录新的当前时间。
- 通过从d中减去b计算网站响应时间。
- 将监控的URL、响应时间和HTTP状态代码保存到InfluxDB桶中。
- 确定要监控的URL并将其分配给
- 创建一个任务,每5分钟运行此Flux脚本一次。
- 构建一个仪表板来可视化网站的性能。
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和桶名称来验证上述代码。
确认脚本运行成功后,将更新的脚本复制并粘贴到任务中。要做到这一点,请转到左侧的任务选项卡,然后在上右角选择创建任务 -> 新任务以打开一个空白任务编辑器。粘贴代码,命名任务,并指定每5分钟运行一次,“5m”。
保存后,任务将每5分钟运行一次,以收集和存储response_time_ns中的响应时间。
构建仪表板以可视化响应时间
可视化的方法几乎无限,但最简单的方法是转到数据探索器,找到响应时间度量值,然后使用右上角的另存为按钮创建一个新的仪表板。
结果
告诉我们您的看法!
今天尝试上面的示例,方法是注册一个免费的Cloud 2账户或下载最新的OSS版本以本地运行。一如既往,如果您有任何问题或反馈,请在我们社区论坛或Slack社区中告诉我们!