1. 自定义命令简介
splunk有丰富的内置搜索命令,但也提供了编写自定义命令来实现个性化的搜索需求,以此方式扩展splunk搜索处理语言(SPL)。
自定义搜索命令是一个可执行文件,可读入和写出数据,它可以是一个python脚本、C++程序或者其他可执行二进制文件,本教程考虑利用python编写自定义命令。
2. 自定义命令是如何运行的
搜索的处理方式是一次一个命令,前一个命令的结果会发送给下一个命令,当搜索到达自定义命令时,搜索会使用协议前一个命令的结果发送给单独的进程。这一单独的进程可以是内置进程,也可以是外部进程。
现在假设有如下SPL搜索语句,其中含自定义搜索命令testcmd,该命令接收1个关键参数args,但该脚本不做任何事情,只是接收数据而后原封不动的将数据返回给Splunk:
index="main"
| table _time,count
| testcmd args=count
其中 table 是splunk内置命令,该语句运行原理如下图所示:
testcmd为自定义命令,接收一个参数args,参数值为count字段,该命令会将count的值传递给python脚本进行处理,然后再返回到搜索结果中,进行后续的SPL处理。
3. splunk内置python环境
3.1 内置python位置
splunk自带pyhton环境,位于
$SPLUNK_HOME/bin/python
$SPLUNK_HOME 是splunk安装目录的环境变量
3.2 在后台使用内置的python:
$SPLUNK_HOME/bin/python
# 或者
$SPLUNK_HOME/bin/splunk cmd python
3.3 内置python版本
$SPLUNK_HOME/bin/python --version
3.4 内置python使用的包和库所在的位置
$SPLUNK_HOME/bin/python -c "import sys;print(sys.path)"
4. 开发所需要的SDK
splunk官方提供了python开发语言的官方sdk,splunk官方开发网站https://dev.splunk.com/enterprise/ ,该网站提供了splunk 开发的一些手册和sdk包,本次用到的python sdk下载地址为https://github.com/splunk/splunk-sdk-python/
4.1 SDK下载
点击 code 下载:
下载包为 splunk-app-examples-master.zip,解压后取出里面的 splunklib 文件夹,即为我们开发自定义命令所需要的。
4.2 sdk存放位置
因为是开发自定义命令,所以刚刚取出的splunklib文件夹将存放于Splunk服务器上。
为了方便,将splunklib放到自定义命令放在同一目录之下。其中{APP_NAME}为自己的APP名字,如果没有自己的APP,放在search默认APP的目录。
存放位置如下:
$SPLUNK_HOME/etc/apps/{APP_NAME}/bin/splunklib
5. 编写自定义命令python脚本
5.1 参考手册
创建自定义命令完整流程参考手册:https://dev.splunk.com/enterprise/docs/devtools/customsearchcommands/createcustomsearchcmd/
自定义命令脚本编写示例:https://dev.splunk.com/enterprise/docs/devtools/customsearchcommands/customsearchcmdexamples/
5.2 Splunk内置命令类型:
- distributable streaming
- centralized streaming
- transforming
- generating
- orchestrating
- dataset processing
命令类型详见:https://docs.splunk.com/Documentation/Splunk/9.0.0/Search/Typesofcommands
5.3 能开发的自定义命令类型
- GeneratingCommand
- StreamingCommand
- EventingCommand
- ReportingCommand
自定义命令类型详见splunklib中源码注释:splunklib/searchcommands/init.py
本文主要介绍 StreamingCommand 类型命令编写方法
5.4 StreamingCommand 命令编写模板
# coding: utf-8
import sys
from splunklib.searchcommands import dispatch, StreamingCommand, Configuration, Option, validators@Configuration()
class 自定义命令的Python类名(StreamingCommand):def stream(self, records):# records为splunk前一命令执行的结果记录for record in records:#对每一条记录record执行xxxx处理,主要编写这里的处理逻辑;获取记录中的某一个字段值,可以用 record['字段名']yield recorddispatch(自定义命令的Python类名, sys.argv, sys.stdin, sys.stdout, __name__)
脚本内容解释:
- @Configuration():照着写就行了
- 自定义命令的Python类名:自己定义,不要和其他自定义命令脚本里的相同即可。
- StreamingCommand:用以说明该自定义命令为一个流式命令。
- def stream(self, records):
stream:这个自定义命令类中必须的一个函数,用来被Splunk平台调用。
records:该参数是Splunk传递进来的所有数据,即,一个张二维表。 - yield record :返回处理后的record记录
- dispatch:照着写就行了,注意保持和class后的自定义命令的Python类名一致即可。