2015-11-04 2 views
4

Мы используем Ansible и имеем Logstash.Тестирование пользовательских фильтров Logstash

Как написать несколько тестов для покрытия наших пользовательских фильтров старта? То, что я хочу сделать это:

  1. дали Logstash конфигурации с фильтрами,
  2. проход это строка лога (или запись журнала многострочный),
  3. увидеть его успешно разобран на части.

Я знаю, что есть это - https://github.com/elastic/logstash/wiki/Tips:Testing-your-filters, но я не понимаю, как это полезно - оно устарело.

ответ

3

Ответ дается gmile хорошо работает до версии 1.5 logstash. С тех пор шаблоны grok удалялись из ядра и помещались в шаблоны logstash-core. Что работает для меня в logstash 2.2:

# encoding: utf-8 

require 'spec_helper' 
require "logstash/patterns/core" 

# solution based on https://github.com/logstash-plugins/logstash-filter-grok/blob/master/spec/filters/grok_spec.rb 
module LogStash::Environment 
    # running the grok code outside a logstash package means 
    # LOGSTASH_HOME will not be defined, so let's set it here 
    # before requiring the grok filter 

    # the path that is set is the plugin root path 
    unless self.const_defined?(:LOGSTASH_HOME) 
    LOGSTASH_HOME = File.expand_path("../../../", __FILE__) 
    end 

    # also :pattern_path method must exist so we define it too 

    # method is called by logstash-filter-grok to create patterns_path array 
    # 
    # logstash-filter-grok/lib/logstash/filters/grok.rb(line ~230): 
    # 
    # @@patterns_path += [ 
    #  LogStash::Patterns::Core.path, 
    #  LogStash::Environment.pattern_path("*") 
    # 
    # patterns defined in spec/patterns/ will be joined to the array by grok 

    unless self.method_defined?(:pattern_path) 
    def pattern_path(path) 
     ::File.join(LOGSTASH_HOME, "spec", "patterns", path) 
    end 
    end 
end 

require "logstash/filters/grok" 
require "logstash/filters/<tested-plugin>" 

Остальная часть примера спецификации остается в силе.

Поскольку новое требование о зависимости прибыло, Gemfile также должен измениться. Моя gemspec зависимость, как это:

# Gem dependencies 
s.add_runtime_dependency "logstash-core-plugin-api", "~> 1.0" 
s.add_runtime_dependency "<tested-plugin>" 
s.add_development_dependency 'logstash-devutils', '~> 0' 
s.add_development_dependency 'logstash-filter-grok', '~> 3.2' 
s.add_development_dependency 'logstash-patterns-core', '~> 4.0' 

Полный рабочий exapmle можно найти here

4

Я нашел this и в конечном итоге с следующим рабочим тестовым кодом:

# simple_filter_spec.rb 
# 
# run using: 
# bundle exec rspec simple_filter_spec.rb 

require "logstash/devutils/rspec/spec_helper" 

LogStash::Environment::LOGSTASH_HOME = `gem which logstash-core` 
module LogStash::Environment 
    unless self.method_defined?(:pattern_path) 
    def pattern_path(path) 
     ::File.join(LOGSTASH_HOME, "patterns", path) 
    end 
    end 
end 


require "logstash/filters/grok" 

describe LogStash::Filters::Grok do 
    config <<-CONFIG 
    filter { 
    grok { 
     match => { "message" => "%{SYSLOGLINE}" } 
     singles => true 
     overwrite => [ "message" ] 
    } 
    } 
    CONFIG 

    sample "Mar 16 00:01:25 evita postfix/smtpd[1713]: connect from camomile.cloud9.net[168.100.1.3]" do 
    insist { subject["tags"] }.nil? 
    insist { subject["logsource"] } == "evita" 
    insist { subject["timestamp"] } == "Mar 16 00:01:25" 
    insist { subject["message"] } == "connect from camomile.cloud9.net[168.100.1.3]" 
    insist { subject["program"] } == "postfix/smtpd" 
    insist { subject["pid"] } == "1713" 
    end 
end 

И мой Gemfile выглядел следующим образом:

source 'https://www.rubygems.org' 

platform :jruby do 
    gem 'pry' 
    gem 'rspec' 
    gem 'logstash-core' 
    gem 'logstash-devutils' 
    gem 'logstash-filter-grok' 
end 
+0

Не могли бы вы подробнее остановиться на здесь путях файлов? Вы выполняете тесты на контроллере Ansible или на сервере Logstash? Даже с примером 'Gemfile', я не могу запустить ваш пример spec-файла. – conorsch

+0

У меня была эта ошибка 'NoMethodError: undefined method' pattern_path 'для LogStash :: Environment: Module'. Кажется, нужно добавить это в файл: https: // github.com/logstash-plugins/logstash-filter-grok/pull/73/commits/0be653da88887b2b2413de543d03372a32244905 – Keymon

+0

@conorsch Посмотрите мой ответ – Kelvin

1

Вы можете использовать Logstash-Tester - маленький инструмент для модульного тестирования вашего logstash фильтры и шаблоны. Вы пишете тестовые примеры в json, а logstash-tester запускает их на logstash с помощью контейнера докеров. (Отказ от ответственности: я написал инструмент)

0

От this blog:

$ git clone https://github.com/elastic/logstash 
$ cd logstash 
$ git checkout 2.1 
$ rake bootstrap 
$ rake test:install-core 

Вместо того, чтобы проверить на 2.1 ветви, вы, вероятно, следует проверить помеченный версию logstash вы будете на самом деле быть запущен, например, v2.3.2 (обратите внимание на «v»).

После выполнения приведенных выше команд вы можете запустить bin/rspec /some/path/your_filter_spec.rb в репозитории logstash.

Важно: Я нашел, что требуется кодирующая линия # encoding: utf-8, иначе совпадение не будет выполнено.

Пример тестового файла:

# encoding: utf-8 

require "spec_helper" 

describe "simple request log" do 
    config (<<-CONFIG) 
    filter { 
    grok { 
     match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } 
    } 
    } 
    CONFIG 

    sample '55.3.244.1 GET /index.html 15824 0.043' do 
    insist { subject['client'] } == '55.3.244.1' 
    insist { subject['method'] } == 'GET' 
    insist { subject['request'] } == '/index.html' 
    insist { subject['bytes'] } == '15824' 
    insist { subject['duration'] } == '0.043' 
    end 
end 
Смежные вопросы