配置文件本身非常脆弱!所以修改配置文件自然会引入部署失败的风险。如果能够对配置文件进行自动化测试将会极大的降低这种风险。本文将介绍一个可以自动化测试 logstash 配置文件的工具,让大家可以像写单元测试用例一样为 logstash 配置文件创建测试 case,并以快速迭代的方式变更 logstash 配置文件。

噩梦

在很多真实环境中,变更 logstash 的配置文件几乎是个噩梦。日志不是结构化的格式(甚至是乱七八糟!),导致我们几乎必须一个一个地处理日志,并对解析什么和不解析什么做出逻辑判定。这会导致我们在 logstash 的配置文件中写出复杂的日志处理逻辑。更加悲催的是,我们编写的仅仅是一个配置文件,大多数时候你找不到像 VisualStudio 那样豪华的带有拼写检查和语法检查的编辑工具。所以我们迫切的需要一个可以对 logstash 的配置文件做单元测试的工具,让我们更好的控制变更、执行迭代。

logstash-test-runner

logstash-test-runner 就是这样一个可以让我们应用 DevOps 原则来解决这个问题的工具。它具有下面几个特点:

  • 它是一个测试框架
  • 非常容易写测试用例
  • 不用学习一个新的 DSL(Domain-Specific-Language)
  • 能够快速的获得反馈

logstash-test-runner 的作者应该是饱受 logstash 的配置文件蹂躏之后创建的这个工具,所以这是一个写给自己用的工具,在使用的时候你能够切身体会到它的便利!

前提条件

运行 logstash-test-runner 依赖于下面三个条件:

  • Docker
  • NodeJS > v8
  • Bash > v4

其中 logstash 的测试用例是在 docker 容器中运行的,默认使用的镜像中 logstash 的版本为 5.5.1,我们可以通过第二个命令行参数指定其它的版本。

NodeJS 程序用来对比实际运行的输出结果与期望的输出结果。

logstash-test-runner 其实就是一个 Bash 脚本,把上面的工具组织起来完成任务。

在运行 logstash-test-runner 前请确保你的环境满足上述条件。然后从这里克隆 logstash-test-runner。如果你确定你要运行的 logstash 的版本,最好是提前先把对应的容器镜像拉下来,比如笔者最常用的是 logstash 6.2.4:

$ docker pull docker.elastic.co/logstash/logstash:6.2.

运行下内置的 demo

准备就绪,让我们先运行下 logstash-test-runner 内置的 demo 体验一下。进入到 logstash-test-runner 目录下,执行下面的命令:

$ npm install
$ ./test.sh __tests__

test.sh 脚本的第一个参数是保存测试用例的根目录,第二个参数是 logstash 的 docker 镜像。也可以不指定 logstash 镜像,默认使用的镜像中的 logstash 版本为 5.5.1。该命令执行的结果如下:

__tests__ 目录的结构如下:

每个子目录代表一个测试用例,demo 中有三个测试用例,分别是 clustering、crawlers 和 mongo。每个测试用例下有三个文件,分别是 input.log、logstash.conf 和 output.log,他们的名称是固定的。input.log 模拟日志文件,保存的是日志记录;logstash.conf 则是待测的 logstash 配置文件;output.log 中是需要我们写入的期望结果(这就是 logstash 版的单元测试呀!)。

添加自己的测试用例

下面我们添加自己的测试用例来测试 multiline 功能(把应用程序中的异常堆栈合并到一条日志记录中)。先创建目录 __nick__/mlines,然后在 __nick__/mlines 目录中创建文件 input.log、logstash.conf 和 output.log。input.log 文件的内容如下:

2019-1
hello
world
2019-2
aa
2019-3
bb
2019-4

模拟的日志记录以日期开头,非数字开头的记录则是异常堆栈。

logstash.conf 文件的内容如下:

input {
stdin {
codec => multiline {
pattern => "^\d"
negate => "true"
what => "previous"
}
}
}
filter {
mutate {
replace => {
"host" => "testing_host"
}
}
}

filter 中设置 host 主要目的是让测试用例忽略真正的 host 值(在容器中运行这个值是随机的字符串,无法执行比较操作,所以总是让他输出 testing_host)。

output.log 文件的内容如下:

{"tags":["multiline"],"host":"testing_host","message":"2019-1\nhello\nworld","@version":"","@timestamp":"2019-03-05T09:30:26.820Z"}
{"tags":["multiline"],"host":"testing_host","message":"2019-2\naa","@version":"","@timestamp":"2019-03-05T09:30:26.823Z"}
{"tags":["multiline"],"host":"testing_host","message":"2019-3\n bb","@version":"","@timestamp":"2019-03-05T09:30:26.824Z"}

这是我们期望 logstash 输出的 JSON 格式的日志记录。当然,在默认情况下 logstash-test-runner 会忽略 @timestamp。

接下来执行下面的命令运行测试:

$ ./test.sh __nick__ docker.elastic.co/logstash/logstash:6.2.

该命令中笔者指定了 logstash 镜像,所以测试用例都是由 logstash 6.2.4 执行的,结果如下:

上图显示测试用例都通过了。如果有测试用例失败,就会输出详细的失败信息,非常有助于排除问题。

难点在于写 output.log

logstash-test-runner 非常简单易用,其实在整个使用过程中,笔者觉得写 output.log 是最困难的。因为你很难根据日志记录和 logstash 的配置文件直接推导出 logstash 输出的记录应该是什么样子的。logstash-test-runner 直接把 logstash 输出的日志记录输出到了 console 中:

这样我们就可以轻松的根据 console 中的输出来调整 output.log 文件了!

总结

使用者为自己编写的工具往往是直击痛点,logstash-test-runner 就是这样的工具。它让我们可以快速迭代 logstash 的配置变更。我们还可以自动化的执行 logstash-test-runner,作为 CI/CD 的一部分,从而确保每个配置变更都通过了测试。
对 logstash 之类的基础设施工具进行测试符合 DevOps(构建→测试→发布→运行)的实践。我想测试基础设施配置的实践会越来越普遍,并且在提高基础设施可靠性和交付方面体现出巨大的价值。

参考:
Dealing with Tight-Coupling
agolo/logstash-test-runner

轻松测试 logstash 的配置文件的更多相关文章

  1. logstash 对配置文件conf敏感信息,密码等加密

    logstash的配置文件conf经常会涉及敏感信息,比如ES,mysql的账户密码等,以下使用logstash导入mysql为例子,加密隐藏mysql的密码. 在向keystore中添加key及其s ...

  2. 使用Adobe Edge Inspect在各种设备中轻松测试同一页面

    有过移动网站开发经历的开发者都知道,在各种设备中测试同一页面是一项非常繁琐的工作.现在,我们可以使用Adobe Edge Inspect来简化这一工作.如果使用Edge Inspect,可以在各种设备 ...

  3. logstash根据配置文件启动时,报异常

    请查看你的配置文件中是否包含了特殊字符,通常,复制黏贴过来的配置文件,会带有特殊字符.这个很影响logstash的启动. linux中查看文件中的特殊字符方法: 使用cat方法 cat -A 文件名 ...

  4. SpringProfile轻松切换多环境配置文件

    在项目开发的过程中,我们难免会遇到开发.测试.生产等环境的切换,而各个环境的配置肯定是不同的.传统的办法是在项目打包的时候修改配置文件.但人为做的事情难免产生意外.Spring 为我们提供了一种多环境 ...

  5. ASP.NET Core轻松入门Bind读取配置文件到C#实例

    首先新建一个ASP.NET Core空项目,命名为BindReader 然后 向项目中添加一个名为appsettings.json的json文件,为什么叫appsettings呢?  打开Progra ...

  6. Asp.Net Core 轻松学-玩转配置文件

    前言     在 .NET Core 项目中,配置文件有着举足轻重的地位:与.NetFramework 不同的是,.NET Core 的配置文件都以 .json 结尾,这表示一个标准的 json 格式 ...

  7. logstash 的 配置文件

    [root@--- etc]# cat test_front_console.conf input { beats { type => beats port => } } filter { ...

  8. 怎样测试nginx.conf配置文件的正确性

    方法: 使用 nginx -t 命令  nginx -t 如果一切正常, 则会显示:

  9. 在Logstash的配置文件中对日志事件进行区分

    1.多个日志文件作为输入源 input { # 通过给日志事件定义类型来区分 file { path => ["/var/log/nginx/access.log"] typ ...

随机推荐

  1. Java提高班(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...

  2. 用TensorFlow教你手写字识别

    博主原文链接:用TensorFlow教你做手写字识别(准确率94.09%) 如需转载,请备注出处及链接,谢谢. 2012 年,Alex Krizhevsky, Geoff Hinton, and Il ...

  3. Perl进程间数据共享

    本文介绍的Perl进程间数据共享内容主体来自于<Pro Perl>的第21章. IPC简介 通过fork创建多个子进程时,进程间的数据共享是个大问题,要么建立一个进程间通信的通道,要么找到 ...

  4. dogse入门指南

    dogse入门指南 Dogse作为游戏服务端引擎,目前只包含游戏服务端的核心部分,但这也是最核心的部分.它全部使用.net c#开发,充分兼顾了程序性能与代码编写的准确性与易用性,再加上以vs作为开发 ...

  5. (11)Microsoft office Word 2013版本操作入门_word中表格操作

    制作一个如下表格: 1. 插入一个4x4的表格或者手动绘制一个4x4表格. 1.1插入一个4x4表格或者绘制表格的按钮如下图所示 绘制表格,自己手动画比较复杂的表格 1.2对插入的表格:  点击表格的 ...

  6. 微信小程序异步请求问题

    微信小程序为了提高用户体验,提供的api大部分都是异步操作,除了数据缓存操作里面有一些同步操作.是提高了用户体验,但是在开发的时候, 就有点坑了,例如我要写一个公共方法,发起网络请求,去后台去一些数据 ...

  7. Burnside引理与Polya定理

    感觉这两个东西好鬼畜= = ,考场上出了肯定不会qwq.不过还是学一下吧用来装逼也是极好的 群的定义 与下文知识无关.. 给出一个集合$G = \{a, b, c, \dots \}$和集合上的二元运 ...

  8. SAP MM 根据采购订单反查采购申请?

    SAP MM 根据采购订单反查采购申请? 前日微信上某同行发来一个message,说是想知道如何通过采购订单号查询到其前端的采购申请号. 笔者首先想到去检查采购订单相关的常用报表ME2L/ME2M/M ...

  9. arcgis api 3.x for js入门开发系列九热力图效果(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  10. 键盘上的"整蛊专家",如何防止短信轰炸机

    "短信轰炸机",是别人通过爬虫或者其他抓取手段在网路上收集那些公司平台短信业务接口的一个集成程序,可能只需要输入一个手机号,对方一整天都会收到各大平台的注册或提醒短信,就是手机在那 ...