使用InfluxDB监控Jenkins

导航到

DevOps的关键部分是持续集成/持续部署。Jenkins是最受欢迎的持续集成工具。Jenkins是一个开源的基于Java的自动化工具,能够帮助组织持续构建、测试和部署软件。Jenkins插件(其中超过14,000个)简化了各种开发任务的自动化。监控Jenkins对于管理Jenkins节点和执行自动化愿景至关重要。

InfluxData的Telegraf Jenkins插件可为您提供以下关于您的Jenkins节点和作业的洞察

  • Jenkins_node
    • 磁盘可用空间
    • 温度可用空间
    • 内存可用空间
    • 内存总量
    • 交换空间可用空间
    • 交换空间总量
    • 响应时间
  • Jenkins_job
    • 持续时间
    • 结果代码(0 = SUCCESS,1 = FAILURE,2 = NOT_BUILD,3 = UNSTABLE,4 = ABORTED)

InfluxDB的免费云版本和开源版本使InfluxDB成为任何想要监控Jenkins的人的选择,但Flux帮助它脱颖而出。Flux是一种轻量级的脚本语言,用于查询数据库和处理数据。包括InfluxDB在内的几种监控工具允许您设置对重要构建失败的警报,或将构建与性能指标关联起来以解决问题。然而,Flux使对Jenkins事件的复杂分析成为可能,以在问题发生之前预见问题。

在本教程中,我们将学习如何使用Jenkins插件与InfluxDB Cloud 2.0和开源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 = "https://127.0.0.1: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>“持续时间”流的图形视图</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 - “持续时间”流的表格视图” width=”1600” height=”385” /><figcaption>“持续时间”流的表格视图</figcaption>

通过视觉检查,我们发现大多数作业的平均构建持续时间大约为50ms。然而,也有一些作业构建时间很长。本练习的目标是隔离这些作业。《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>“平均值”流的表格视图</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()`函数如何向表格流添加额外的列,就像应用在“持续时间”流上一样。

现在我们可以找到我们的异常作业。我们将“持续时间”和“正常”流连接起来,并将异常定义为任何大于限制的值。

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配置在此存储库中。

吞吐量和结论

InfluxDB UI 允许我们这些不擅长编程的人快速构建 Flux 脚本并可视化 Jenkins 指标。Flux 还允许我们对 Jenkins 指标进行复杂的分析,以便识别可能存在问题的节点并轻松隔离作业失败。InfluxDB Cloud 2.0 免费版可以让我们以非常好的吞吐量进行操作。考虑到限制,假设您已将 Telegraf 配置为node_exclude = ["*"],您仍然可以每5分钟写入超过25000个包含作业指标的点,或每秒800个。希望您喜欢这个教程。如果您遇到障碍,请在我们社区网站Slack频道上分享它们。