logstash 插件开发
我最近对Logstash感兴趣,在玩了一段时间之后,我决定创建自己的自定义插件以供学习。 我选择从Reddit中提取数据是因为a)我经常使用它,并且b)没有提供该功能的现有插件。<!-more-→
Elasticsearch网站提供了相当详尽的文档来创建自己的Logstash插件。 这种努力需要Ruby技术-不仅是语言语法,而且还包括生态系统。 预期该站点假定读者熟悉两者。 不幸的是,这不是我的情况。 我一直在用Java开发很多东西,在Scala中涉猎了一些,我对Kotlin很有兴趣-最后,我只是一个JMV开发人员(这里和那里有一些Javascript)。 长话短说,我从Ruby开始。
在此阶段,有两种可能的方法:
- 阅读有关Ruby,Gems,bundler,整个九码的文档和教程,并在几个月(或更长时间)后回来
- 或通过潜入开发现场学习
鉴于我没有几个月,而且我所学的都足够好,所以我选择了第二个选项。 这篇文章是我所经历的步骤的总结,希望它可以使遇到同样情况的其他人受益。
第一步不是最难的
尽管可以从头开始使用新的Logstash插件,但文档建议从模板开始。 在线过程中对此进行了说明。 这一代产生以下结构:
$ tree logstash-input-reddit ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── lib │ └── logstash │ └── inputs │ └── reddit.rb ├── logstash-input-reddit.gemspec └── spec └── inputs └── reddit_spec.rb
对于Ruby新手而言,并不是很明显,该结构是Ruby Gem之一 。 通常,依赖项在关联的Gemfile
中声明:
source 'https://rubygems.org'
gemspec
但是,在这种情况下, gemspec
指令添加了一个附加的间接级别。 在关联的gemspec
文件中不仅声明依赖项,还声明元数据。 这是Bundler实用工具gem的功能。
要安装依赖项,首先需要安装bundler
gem。 是的,有摩擦...
Ruby是极限
尝试安装gem会产生以下结果:
gem install bundler Fetching: bundler-1.13.6.gem (100%) ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String
第一个实现-花费了很多时间(浏览和阅读),是Ruby运行时有不同的风格。 简单的Ruby是不够的,Logstash插件开发:它需要一个专门的运行在JVM上运行又名 JRuby的 。
第二个认识是,虽然在一台机器上安装多个Ruby运行时很容易,但不可能同时运行它们。 尽管Homebrew使jruby
软件包可用,但似乎每个系统只有一个单独的gem存储库,它对由不同运行时进行管理的React非常差。