Splunk-SDK-Python学习

Splunk

最近在公司实习用到了splunk,需要调用splunk sdk进行一些简单的开发,目前把我这个星期的一些体会记录下。

什么是splunk

简单来说,Splunk是一个托管的日志文件管理工具,它的主要功能包括:
· 日志聚合功能
· 搜索功能
· 提取意义
· 对结果进行分组,联合,拆分和格式化
· 可视化功能
· 电子邮件提醒功能
而目前我通过splunk sdk主要实现的功能就是搜索功能,即搜索到我想要的日志。

Splunk SDK for Python

通过Splunk SDK我们可以和Splunk引擎进行交互。Splunk SDK是基于REST API的,因此通过简短的代码实现我们想要的功能。
官方文档:http://dev.splunk.com/python

安装

! 注意, splunk SDK 目前只支持python2,不支持python3.
Ubuntu下安装步骤:

1
2
3
4
5
6
7
sudo apt-get install python-pip //第一步:安装pip工具

pip freeze //查看是否已安装splunk sdk

pip install splunk-sdk //第二步:下载splunk sdk

export PYTHONPATH=~/splunk-sdk-python //添加到python环境变量

模块介绍

主要有4个模块:

  • binding: 基于HTTP的抽象层
  • client: 基于REST API的抽象层,其中Service类是其最重要的类,并且client模块比binding模块有更多的好处。
  • results: 对splunk返回的数据进行处理
  • data: 将Atom Feed data转换为python格式
    目前我主要用到的模块是client和results模块。

与Splunk enterprise建立连接

python2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import splunklib.client as client

HOST = "localhost"
PORT = 8089
USERNAME = "admin"
PASSWORD = "changeme"

# Create a Service instance and log in
service = client.connect(
host=HOST,
port=PORT,
username=USERNAME,
password=PASSWORD)

# Print installed apps to the console to verify login
for app in service.apps:
print app.name

存在的问题:splunk服务器的8089没有打开,因此连接不上
解决:
splunk的服务器是在一个虚拟网络下的,8089端口不对公网开放,因此可以在该网络下另起一个ubuntu虚拟机,然后ubuntu虚拟机通过22端口与请求相连接,收到请求后,由于ubuntu和splunk server是在一个内网中,因此ubuntu虚拟机可以与splunk server的8089端口通信,获得数据后再返回给请求端。

Search的一些术语

  • search query:即查询命令的集合,例如:
    * | head 10```
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    * saved search: 被保存的可以被再次使用的搜索查询。
    * search job:即一次搜索操作的具体实例。
    * Normal search: 异步搜索,能够立刻返回serach job而不用等到结果都搜索完。
    * Blocking search:同步搜索,只有所有搜索全都完成后才返回job.
    * Oneshot: blocking serach,直接返回搜索结果而不是返回job
    ...

    ### 创建一个blocking serach
    与normal search的不同点是blocking search是堵塞的,也就是创建job后不会立刻返回,而是等待所有结果搜索结束后才返回,此时job包含了所有的搜索结果。
    ```python
    # Get the collection of jobs
    jobs = service.jobs

    # Run a blocking search--search everything, return 1st 100 events
    kwargs_blockingsearch = {"exec_mode": "blocking"}
    searchquery_blocking = "search * | head 100"

    print "Wait for the search to finish..."

    # A blocking search returns the job's SID when the search is done
    job = jobs.create(searchquery_blocking, **kwargs_blockingsearch)
    print "...done!\n"

normal search 是异步的,即立刻返回job, 但是实际结果并没有返回,因此会存在操作job时没有event返回的情况,我目前的做法是,如果知道大致的搜索时间,则设置一定时间等待后再对job进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import splunklib.results as results

# Initialize your service like so
# import splunklib.client as client
# service = client.connect(username="admin", password="changeme")

searchquery_normal = "search * | head 10"
kwargs_normalsearch = {"exec_mode": "normal"}
job = service.jobs.create(searchquery_normal, **kwargs_normalsearch)

# Get the results and display them
for result in results.ResultsReader(job.results()):
print result

job.cancel()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import splunklib.results as results

# Run a one-shot search and display the results using the results reader

# Set the parameters for the search:
# - Search everything in a 24-hour time range starting June 19, 12:00pm
# - Display the first 10 results
kwargs_oneshot = {"earliest_time": "2014-06-19T12:00:00.000-07:00",
"latest_time": "2014-06-20T12:00:00.000-07:00"}
searchquery_oneshot = "search * | head 10"

oneshotsearch_results = service.jobs.oneshot(searchquery_oneshot, **kwargs_oneshot)

# Get the results and display them using the ResultsReader
reader = results.ResultsReader(oneshotsearch_results)
for item in reader:
print(item)

…待续