使用 InfluxDB 监控 Jenkins

导航至

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 的“加载数据”选项卡中创建存储桶、查找令牌和设置权限。

InfluxDB - load data tab US west

接下来,填写配置的输入部分

[[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 个成功作业的持续时间

 Visualizing Jenkins jobs and nodes with InfluxDB

我还可以立即可视化任何失败

Visualizing Jenkins jobs - visualizing failures

在按结果代码“FAILURE”过滤作业后,我看到标题为“Test”的作业失败了。我可以深入挖掘,隔离作业的状态以识别失败时间。

Visualizing Jenkins jobs - identifying time of failure

我还可以在仪表板选项卡中使用所有这些信息创建自定义仪表板,这样我就可以一目了然地查看任何查询。

InfluxDB - Jenkins custom dashboards

使用 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")

Jenkins 作业的构建持续时间<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"])

Jenkins - 平均值流的表格视图<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"])

duration_stddev 流的表格视图<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 频道上分享它们。