filebeat的javascript插件是怎么run起来的?
filebeat 是由golang 实现的,其间接引用了https://github.com/dop251/goja包,该包使用纯golang语言实现了 ECMAScript 5.1.
内嵌脚本语言,其实并不少见。比如常用的Lua,就被内嵌在redis中。javascript 相对于lua,是非常灵活的,学习成本也相对较低。
经过调研,实现javascript运行时的包有如下几个:
github.com/robertkrimen/otto[Star 7.1K]- 最初使的项目
- 性能较低
- go 1.18
- ECMA 不支持严格模式
- 正则不完全兼容
- es6 特性不支持
github.com/dop251/goja[Star 3.5K]- filebeat使用
- 思想来源于otto
- go 1.16
- ECMAScript 5.1 引擎
- 支持 regex and strict mode
- 在频繁执行较简单的js情况下,性能与otto基本持平,高于v8go
github.com/rogchap/v8go[Star 2.5K]- 基于google的V8引擎实现(chrome)
- cgo实现,性能最高(在需要执行较长的js代码的情况下),与系统兼容性略差.(windows可能需要自己编译v8)
- javascript兼容性比较好
- 调试困难
otto case
|
|
goja case
|
|
v8go
|
|
性能测试
主要两个方面做性能测试:
- 测试简单的加法操作,主要测试高频的启动js引擎的操作
- 测试js的高频计算,测试在不同引擎中,js源码的执行效率
对比如下:
|
|