在Golang中将查询发布到Splunk REST API / search / jobs / endpoint

时间:2018-03-02 21:45:34

标签: rest go splunk

我想向Splunk REST API发送搜索/查询,并返回搜索ID以便稍后使用结果。

我可以通过以下curl

实现所需的行为
#!/bin/bash

user='my_user'
pass='my_pass'

search='search index=short sourcetype=src | head 5'

curl -u $user:$pass -k https://111.22.33.44:8089/services/search/jobs -d search="$search"

返回:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <sid>234523452435.6556_234234-3J3J-34J4-2345-123456678E3</sid>
</response>

以下是我尝试实现相同目标的相关Go片段:

主:

  //main.go
    sid, err := conn.Query()
    if err != nil {
            fmt.Println("err creating search: %s", err)
    } else {
            fmt.Println("sid:", sid)
    }

查询:

    // query.go
    func (conn SplunkConnection) Query() (string, error) {
            data := make(url.Values)
            data.Add("output_mode", "json")
            data.Add("search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205", "search")
            data.Add("-60m%40m", "earliest")
            data.Add("-10m%40m", "latest")

        // try httpGet() here
        sid, err := conn.httpPost(fmt.Sprintf("%s/services/search/jobs", conn.BaseURL), &data)
        if err != nil {
                return "", err
        }

        return string(sid), err
}

助手:

// http.go
func (conn SplunkConnection) httpPost(url string, data *url.Values) (string, error) {
        return conn.httpCall(url, "POST", data)
}

我期望的是一个只包含带有SID的JSON blob的响应。相反,它返回一个巨大的JSON,它似乎包含/services/search/jobs端点的所有当前作业。

如何调整代码以仅返回SID? (我打算将其轮询完成并稍后检索结果,但不需要帮助......)。

1 个答案:

答案 0 :(得分:1)

您似乎已经改变了postdata参数。

            data.Add("search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205", "search")

这变为search index=short sourcetype=src | head 5 = search,这与您想要的相反。

The key comes first, then the value,但您先指定了值,然后是键。

我认为这应该是:

            data.Add("search", "search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205")

我怀疑你对url.Values.Add()的其他一些电话也是如此,所以你应该检查一下并确定。