配置文件本身非常脆弱!所以修改配置文件自然会引入部署失败的风险。如果能够对配置文件进行自动化测试将会极大的降低这种风险。本文将介绍一个可以自动化测试 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. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义

    Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...

  2. Go语言系列文章

    这个系列写的不是很好,未来重构. Go基础系列 Go基础 Go基础 1.Go简介 2.Go数据结构struct 3.构建Go程序 4.import导包和初始化阶段 5.array 6.Slice详解 ...

  3. C#实现以太仿DApp合约编译、部署

    在网上找了一些关于C#开发以太仿的资料,大概了解了以太仿常用名词,后续可能需要根据资料查看开源的源码进一步熟悉一下. 一.准备合约 这里准备了一个EzToken.sol合约,目前还不会solidity ...

  4. Promise杂记

    更好的阅度体验 前言 API Promise特点 状态跟随 V8中的async await和Promise 实现一个Promise 参考 前言 作为一个前端开发,使用了Promise一年多了,一直以来 ...

  5. docker 创建mysql镜像,并成功进行远程连接

    1.安装 1.1 拉取镜像 docker pull mysql 拉取成功可以验证一下 docker images 1.2 创建并启动一个mysql容器 docker run --name ly-mys ...

  6. MyCat做MySQL负载均衡(享学课堂,咕泡学院听课笔记)

    不要用战术上的勤奋,掩盖战略上的懒惰. 一.数据库集群演示 演示的数据库的表分了三种, 1.配置表,存储一些配置文件,其他业务表需要关联读取,每个数据库都存储配置表的全部内容,即操作Mycat,所有集 ...

  7. js三部曲---预编译

    函数内:1,创建AO对象//Activation Object 2,找函数内形参和变量声明,将其作为AO对象的属性名,值为undefined. 3,实参赋到AO对象 形参名里 4,在函数体里找函数声明 ...

  8. Android开发——打造简单的Viewpager指示器(小圆点指示器)

    准备工作: 1.两张不同颜色的小圆点图片,可以去阿里巴巴矢量图网站搜索 我把我使用的图片贴出来 2.一个简单的Viewpager的实现 下面是简单的Viewpager实现步骤: 1.布局文件使用Vie ...

  9. 4-4 Redis 的常用配置

    2016-12-22 15:30:43 本篇文章属于Redis 系列第四篇文章:Redis 配置文件介绍 该系列文章链接 NoSQL 数据库简介 Redis的安装及及一些杂项基础知识 Redis 的常 ...

  10. 浅谈ST表

    发现自己学的一直都是假的ST表QWQ. ST表 ST表的功能很简单 它是解决RMQ问题(区间最值问题)的一种强有力的工具 它可以做到$O(nlogn)$预处理,$O(1)$查询最值 算法 ST表是利用 ...