使用 InfluxDB 监控 Jenkins
作者:Anais Dotis-Georgiou / 产品, 用例, 开发者
2019 年 9 月 18 日
导航至
DevOps 的关键部分是持续集成/持续部署。Jenkins 是最流行的持续集成工具。Jenkins 是一款开源的、基于 Java 的自动化工具,使组织能够持续构建、测试和部署软件。Jenkins 插件(超过 14,000 个)促进了各种开发任务的自动化。监控 Jenkins 对于管理 Jenkins 节点和执行自动化愿景至关重要。
InfluxData 的 Telegraf Jenkins 插件 开箱即用地为您提供关于 Jenkins 节点和作业的以下见解
- Jenkins_node
- disk_available
- temp_available
- memory_available
- memory_total
- swap_available
- swap_total
- response_time
- Jenkins_job
- duration
- result_code (0 = 成功, 1 = 失败, 2 = 未构建, 3 = 不稳定, 4 = 中止)
InfluxDB 的免费云层和 OSS 版本使 InfluxDB 对任何想要监控 Jenkins 的人都有吸引力,但 Flux 使其脱颖而出。Flux 是一种轻量级脚本语言,用于查询数据库和处理数据。包括 InfluxDB 在内的几种监控工具使您能够为重要的构建失败设置警报,或将构建与性能指标关联起来以解决问题。然而,Flux 有助于对 Jenkins 事件进行复杂的分析,以便在问题发生之前预测问题。
在本教程中,我们将学习如何将 Jenkins 插件与 InfluxDB Cloud 2.0 和 OSS InfluxDB 2.0 一起使用。接下来,我们将发现使用 UI 识别任何作业失败是多么容易。最后,我们将编写一个 Flux 脚本来隔离持续时间大于相似作业平均持续时间两个标准差的作业。
使用 InfluxDB Cloud 2.0 设置 Jenkins Telegraf 插件
首先,注册一个免费的 InfluxDB Cloud 2.0 帐户。登录后,生成一个 Telegraf 配置以获取 Jenkins 指标
telegraf --config jenkins_cloud.conf --input-filter jenkins --output-filter influxdb_v2.0
现在,将适当的配置变量放入配置的输出部分
[[outputs.influxdb_v2]]
## The URLs of the InfluxDB cluster nodes.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"]
## Token for authentication.
token = "$token"
## Organization is the name of the organization you wish to write to; must exist.
organization = "[email protected]"
## Destination bucket to write into.
bucket = "Jenkins"
您可以在 https://us-west-2-1.aws.cloud2.influxdata.com 的“加载数据”选项卡中创建存储桶、查找令牌和设置权限。
接下来,填写配置的输入部分
[[inputs.jenkins]]
## The Jenkins URL
url = "http://localhost:8080"
username = "admin"
password = "$jenkins"
最后,使用适当的配置运行 Telegraf
telegraf -config jenkins_cloud.conf
有关设置和使用 UI 的更详细说明,请参阅 2.0 文档。
一目了然地查找失败
使用 InfluxDB 2.0 可非常轻松地可视化 Jenkins 作业和节点。我可以转到数据探索选项卡,点击 4 次即可可视化所有 200 个成功作业的持续时间
我还可以立即可视化任何失败
在按结果代码“FAILURE”过滤作业后,我看到标题为“Test”的作业失败了。我可以深入挖掘,隔离作业的状态以识别失败时间。
我还可以在仪表板选项卡中使用所有这些信息创建自定义仪表板,这样我就可以一目了然地查看任何查询。
使用 Flux 脚本识别潜在的问题作业
能够查看作业持续时间和作业状态很有用,但我们可以使用 Flux 做更多的事情。我将把我的分析更进一步。我将找到持续时间大于平均作业持续时间两个标准差的作业。然后我可以按节点对这些作业进行分组,以识别潜在的问题节点。
首先,让我们看一下我们的数据。以下查询让我查看所有作业的构建持续时间。
duration =
from(bucket: "Jenkins")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "jenkins_job")
|> filter(fn: (r) => r._field == "duration")
|> toFloat()
|> keep(columns: ["_value", "name", "_time"])
|> set(key: "mykey", value: "myvalue")
<figcaption> “duration”流的图形视图</figcaption>
<img class=”wp-image-237015 size-full” src=”https://w2.influxdata.com/wp-content/uploads/jenkins-table-view-of-duration-stream.png” alt=”Jenkins - “duration”流的表格视图” width=”1600” height=”385” /><figcaption> “duration”流的表格视图</figcaption>
从目视检查来看,我们注意到大多数作业的平均构建持续时间约为 50 毫秒。但是,有很多作业花费了更长的时间来构建。此练习的目标是隔离这些作业。toFloat()
函数用于帮助应用 map()
函数。 keep()
函数消除了不需要的列并清理了表流。应用 set()
函数以便稍后进行连接。
首先,使用以下方法计算平均值
mean =
from(bucket: "Jenkins")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "jenkins_job")
|> filter(fn: (r) => r._field == "duration")
|> group()
|> mean(column: "_value")
|> keep(columns: ["_value", "name", "_time"])
<figcaption> “mean”流的表格视图</figcaption>
我们看到平均值接近 50,正如预期的那样。
接下来,使用以下方法计算标准差
duration_stddev =
from(bucket: "Jenkins")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "jenkins_job")
|> group()
|> stddev(column: "_value", mode: "sample")
|> keep(columns: ["_value", "name", "_time"])
<figcaption> “duration_stddev”流的表格视图</figcaption>
接下来,我们将计算“_limit”,即我们的异常阈值,作为偏离平均值两个标准差。此计算通过连接我们的标准差表和平均值表,然后计算限制来实现。
normal =
join(tables: {duration_stddev: duration_stddev , mean: mean}, on: ["name"])
|> map(fn: (r) => ({r with _limit:(r._value_duration_stddev*2.0 + r._value_mean)}))
|> keep(columns: ["_limit", "mykey"])
|> set(key: "mykey", value: "myvalue")
<img class=”size-full wp-image-237022” src=”https://w2.influxdata.com/wp-content/uploads/Table-view-of-the-normal-stream.png” alt=”“normal”流的表格视图” width=”1600” height=”385” /><figcaption> “normal”流的表格视图</figcaption>
我们可以看到 set()
函数如何向表流添加额外的列,就像应用于“duration”流一样。
现在我们可以找到我们的异常作业。我们将“duration”和“normal”流连接在一起,并将异常定义为任何大于限制的值。
anomaly =
join(tables: {duration: duration , normal: normal}, on: ["mykey"])
|> map(fn: (r) => ({r with _anomaly:(r._value - r._limit)}))
|> filter(fn: (r) => r._anomaly > 0)
|> keep(columns: ["_anomaly", "name", "_time"])
<img class=”size-full wp-image-237023” src=”https://w2.influxdata.com/wp-content/uploads/scatter-plot-view-of-the-anomaly-stream.png” alt=”“anomaly”流的散点图视图” width=”1600” height=”758” /><figcaption> “anomaly”流的散点图视图</figcaption>
我们可以看到大约有 20 个作业的构建时间超过了我们的限制。符号形状和符号颜色已配置为按作业名称分组,因此我们可以轻松识别有问题的作业。
注意事项
请注意,本教程中使用的数据是为演示某些 Flux 功能而生成的虚拟数据。这有助于解释为什么如此多的作业具有“异常”构建时间。我使用 Jenkins UI 创建了一个非常简单的作业,并使用 Python-Jenkins CL 将该作业复制了 200 次。Python 脚本和 Telegraf 配置在此 repo 中。
吞吐量和结论
InfluxDB UI 使即使我们这些不编写代码的人也能够快速构建 Flux 脚本并可视化 Jenkins 指标。Flux 还允许我们对 Jenkins 指标执行复杂的分析,以便轻松识别潜在的问题节点并隔离作业失败。InfluxDB Cloud 2.0 免费层允许您以非常好的吞吐量执行此操作。考虑到 限制 并假设您配置 Telegraf 为 node_exclude = [ "*" ]
,您仍然可以每 5 分钟写入超过 25000 个包含作业指标的点,或每秒 800 个点。我希望你喜欢这个教程。如果您遇到障碍,请在我们的 社区站点 或 Slack 频道上分享它们。