配置文件本身非常脆弱!所以修改配置文件自然会引入部署失败的风险。如果能够对配置文件进行自动化测试将会极大的降低这种风险。本文将介绍一个可以自动化测试 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.4

运行下内置的 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-1helloworld2019-2aa2019-3  bb2019-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":"1","@timestamp":"2019-03-05T09:30:26.820Z"}{"tags":["multiline"],"host":"testing_host","message":"2019-2\naa","@version":"1","@timestamp":"2019-03-05T09:30:26.823Z"}{"tags":["multiline"],"host":"testing_host","message":"2019-3\n  bb","@version":"1","@timestamp":"2019-03-05T09:30:26.824Z"}

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

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

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

该命令中笔者指定了 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(https://blog.agolo.com/the-easy-way-to-test-your-logstash-configuration-3f80eb5ffd59)

  • agolo/logstash-test-runner(https://github.com/agolo/logstash-test-runner)

出处:http://rrd.me/egMpX

最新课程通知

Golang 零基础入门课程

本课程为:网络班(腾讯课堂)

https://ke.qq.com/course/406096?tuin=6ceacb80

51reboot 运维前端课程正在火热招生和中,

8.21号开课

51reboot Devops 课程 九月下旬开课,

AWS中国区资深架构师带你领略云计算鼻祖的自动化架构

51reboot Python 实战课程 八月下旬开课,

想要学习的小伙伴可以扫码咨询

添加小助手WeChat:17812796384

docker logstash_学会这一招,轻松测试 logstash 的配置文件相关推荐

  1. MacBook Pro如何切换独立显卡?学会这一招轻松解决

    MacBook 系列中,MacBook Pro 的16 英寸版本是标配独立显示卡的,不过在预设中不会默认启用独立显卡. 很多不明真相的小白用户就会一头雾水:为什么 16 英寸版本实际 GPU 性能比 ...

  2. 怎么制作画中画视频?学会这几招轻松实现

      大家平时有看过画中画视频吗?其实这种视频常见于一些球赛解说.游戏直播.reaction回放等等,同样也适用于视频剪辑中.如果大家想要在自己的vlog里面加入画中画视频,会是一种很新奇的创意.想知道 ...

  3. 如何在Excel表格中输入分数?学会这几招轻松搞定!

    大家知道如何在Excel中输入分数吗?前段时间一个朋友输入数据时,发现数据中有分数,可把它给难住了,弄了半天弄不好,最后找到了小编:今天小编给大家分享几种Excel表格中输入分数的方法,希望能帮助到你 ...

  4. airpods安卓延迟怎么解决_安卓手机获取root权限失败怎么办 学会这几招轻松解决 - 手机教程...

    安卓手机获取root权限失败怎么办?目前在国内大部分的用户用的都是安卓手机,虽然使用的人数很多的,但是在安卓手机上想要卸载一些系统自带的软件,是需要获取ROOT权限的,就有用户遇到获取ROOT权限失败 ...

  5. 苹果备忘录误删了怎么恢复,学会这2招轻松找回

    苹果备忘录误删了怎么恢复?"误删"乃是兵家常事,但是不要害怕误删的资料永远回不来,恢复的方法千千万万,重点是要选择一种最适合自己,并且好用的恢复方法,这才是最重要的.小编在这里为大 ...

  6. GIF动态图是怎么制作出来的?学会这几招轻松做出表情包

    GIF动态图是怎么制作出来的呢?GIF动态图可以用于很多方面.例如,如果你需要向别人展示某个产品的功能或者演示某个过程,你可以使用GIF动态图来说明.此外,如果你想分享一些有趣的内容,你也可以使用GI ...

  7. 学会人际关系三招 轻松走职场

    要想成功,仅有专业能力是不够的,处理好与老板.同事及下属的人际关系也是门大学问.如何才能在职场如鱼得水.游刃有余呢?在此,教您简单实用的三个窍门. 第一,多汇报 最近,管理学又提出了一个新名词&quo ...

  8. 音频怎么转文字?学会这3招,轻松拉满你的工作效率

    音频转文字怎么转?掌握这三个方法,帮你跟加班说拜拜! 今日技巧分享之:音频转文字怎么操作? 不要再烦恼录音转文字怎么转啦,学会这3招轻松掌握 如何把音频转文字?有什么软件能实现这一操作? 1分钟教会你 ...

  9. 03人脉搜索:学会这一招,就能轻松找到90%的人的联系方式

    人脉搜索:学会这一招,就能轻松找到90%的人的联系方式 在我们进行人脉搜索之前,我们要做一下相关的准备工作 (1)我有哪几个待解决的问题? (2)能解决的人掌握什么资源和能力? (3)这样的人供职于怎 ...

最新文章

  1. 一图看懂《中关村人工智能产业培育行动计划》
  2. 位运算及在java中的应用整理
  3. Linux系统新建用户用ssh远程登陆显示-bash-4.1$
  4. Centos配置在线yum源
  5. SAP S/4HANA是如何通过SADL框架加CDS view读取销售订单数据的
  6. BZOJ1566 [NOI2009]管道取珠
  7. iOS内存管理(ARC,MRC)
  8. 计算机网络——物理层设备
  9. 公司的Java框架应具备的通用功能
  10. #if、#ifdef、#if defined之间的区别【转】
  11. EasyUI系列学习(一)-入门
  12. linux怎么重启samba服务器,Linux系统怎么重启Samba服务
  13. css3动画Animate.css插件与wow.js插件
  14. MM32F031 M0内核 IAP
  15. 大芒果mysql下载_大芒果魔兽世界单机版
  16. 解决项目无法读取src/main/java目录下面的配置文件问题
  17. 深度学习入门系列1:多层感知器概述
  18. 微信查询所有关注该公众号的用户
  19. android dex 加固,Dex文件加固
  20. 双系统 linux声卡驱动程序,安装linux windows双系统

热门文章

  1. asp.net 读取mysql_asp.net封装mysql工具类,在页面上引用读取的数据
  2. 力扣每日一题 2021.10.23
  3. 华为ax3怎么接光纤sc接口_光纤收发器接口类型、连接、指示灯说明及故障症断...
  4. Request库入门
  5. pip安装包时报错:The repository located at pypi.doubanio.com is not a trusted or secure host
  6. Vivado设计流程(二)设计文件输入
  7. Jupyter Notebook——夏侯南溪常用的快捷键
  8. ESP32开源驱动库Easyio的使用,基于ESP-IDF开发框架,非Arduino
  9. List 按照中文姓名升序排列
  10. 以太局域网(以太网)