前言
本文的目标是让读者对Splunk编写自定义搜索命令有个基本的概念,并不是详尽的开发指南。
自定义搜索命令简介
Splunk Spl语言是将Splunk的一系列搜索命令组织成数据处理的管道,如下图所示,提供了140多种搜索命令,基本覆盖了日常对数据处理的各种场景。其中search命令是SPL语言的默认命令,可以不明确的写在语句中。
但是在日常使用的过程中,有很多特殊的应用场景中,我们需要根据业务逻辑对数据进行处理,那么就需要一种机制,能够灵活的添加新的命令,满足业务需求,如下图所示,GOCRAZY命令就是我们编写的自定义搜索命令。
自定义搜索命令的执行原理
SPL的执行过程
- 将SPL查询语句分解为命令
- 分析语句中是否存在自定义搜索命令
- 获取外部资源路径
- 外部进程解析自定义命令参数
- 使用外部命令处理数据
自定义搜索命令的抽象概念
能够编写新的搜索命令,扩展SPL语言,实现新的数据分析。
能够使我们对搜索结果进行处理,例如接收csv结构的数据,进过处理之后,输出csv格式的数据。
实现为外部进程(一个我们编写的程序),最典型的是编写python脚本。
自定义搜索命令的底层细节
Splunkd和外部进程的交互协议
因为自定义搜索命令运行在外部进程中,所以splunkd需要与外部进程之间进行交互,splunk定义了两种交互协议:
-
协议V1,历史遗留协议,始于Splunk3.0开始,主要被InterSplunk.py使用。
当搜索结果中的数据量非常大的时候,需要拆分成一批一批的被自定义命令处理。协议V1会对每一批数据启动一次外部进程,效率较低。
转换命令(事件命令、报表命令)的事件上限是50,000。"Transforming" commands limited to 50,000 events
-
协议V2,始于Splunk6.3版本中添加的新协议,主要在Python SDK中使用。
两种协议都是用std in/std out进行交互。
协议V2只启动外部进行一次,每一批数据会一次发送给外部进程进行处理,只需要在commands.conf中设置chunked=true即可。
可以支持非python平台开发的程序作为自定义命令。
功能对比
协议 |
API |
性能 |
扩展性 |
简单配置(配chunk=true) |
是否支持其他编程语言实现 |
编程语言 |
V1 |
Intersplunk.py, Python SDK |
低 |
低 |
无 |
无 |
Python |
V2 |
Python SDK |
高 |
高 |
有 |
支持 |
Python, |