使用 logstash 从 JSON 响应中去除 XSSI 前缀
Using logstash to strip XSSI prefix from JSON response
我有一个相当简单的问题,但它让我感到困惑。我正在尝试使用 Logstash 通过 rest api 获取 Gerrit 数据。我正在使用 http_poller 并且我的配置得到了正确的响应,所以我快到了。
现在我需要从 Gerrits JSON 响应的开头删除 XSSI 前缀 )]}'。问题是,如何?如何剥离或拆分或变异它,或者我应该如何进行?
我的输入配置:
input {
http_poller {
urls => {
gerrit_projects => {
method => get
url => "http://url.to/gerrit/a/projects/"
headers => { Accept => "application/json" }
auth => { user => "userid" password => "supresecret" }
}
}
target => "http_poller_data"
metadata_target => "http_poller_metadata"
request_timeout => 60
interval => 60
}
}
filter {
if [http_poller_metadata] {
mutate {
add_field => {
"http_poller_host" => "%{http_poller_metadata[host]}"
"http_poller" => "%{http_poller_metadata[name]}"
}
}
}
if [http_poller_metadata][runtime_seconds] and [http_poller_metadata][runtime_seconds] > 0.5 {
mutate { add_tag => "slow_request" }
}
if [http_request_failure] or [http_poller_metadata][code] != 200 {
mutate { add_tag => "bad_request" }
}
}
output {
stdout { codec => rubydebug }
}
以及部分响应:
Pipeline main started
JSON parse failure. Falling back to plain-text {:error=>#<LogStash::Json::ParserError: Unexpected character (')' (code 41)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at ... (bunch of lines)...
{
"http_poller_data" => {
"message" => ")]}'\n{\"All-Users\":{\"id\":\"All-Users\",....(more valid JSON)...",
"tags" => [
[0] "_jsonparsefailure"
],
"@version" => "1",
"@timestamp" => "2016-12-13T09:48:25.397Z"
},
"@version" => "1",
"@timestamp" => "2016-12-13T09:48:25.397Z",
"http_poller_metadata" => { ... }
这是我向 Whosebug 提出的第一个问题。感谢您的友好回答!
我使用 "sed 1d" 删除“)]}'”前缀,并使用 "jq" 处理 JSON 输出。例如,要获取我执行的 Gerrit 项目的状态:
curl -s --header 'Content-Type:application/json' --request GET --netrc https://<GERRIT-SERVER>/a/projects/?r=<GERRIT-PROJECT> | sed 1d | jq --raw-output ".[] | .state"
ACTIVE
您可以使用带有 gsub 选项 (link) 的 mutate 过滤器来删除 )]}
mutate {
gsub => [
"message", "\)]}'", ""
]
}
但是 gsub 会替换所有出现的正则表达式,因此您必须确保该模式只出现一次。
我有一个相当简单的问题,但它让我感到困惑。我正在尝试使用 Logstash 通过 rest api 获取 Gerrit 数据。我正在使用 http_poller 并且我的配置得到了正确的响应,所以我快到了。
现在我需要从 Gerrits JSON 响应的开头删除 XSSI 前缀 )]}'。问题是,如何?如何剥离或拆分或变异它,或者我应该如何进行?
我的输入配置:
input {
http_poller {
urls => {
gerrit_projects => {
method => get
url => "http://url.to/gerrit/a/projects/"
headers => { Accept => "application/json" }
auth => { user => "userid" password => "supresecret" }
}
}
target => "http_poller_data"
metadata_target => "http_poller_metadata"
request_timeout => 60
interval => 60
}
}
filter {
if [http_poller_metadata] {
mutate {
add_field => {
"http_poller_host" => "%{http_poller_metadata[host]}"
"http_poller" => "%{http_poller_metadata[name]}"
}
}
}
if [http_poller_metadata][runtime_seconds] and [http_poller_metadata][runtime_seconds] > 0.5 {
mutate { add_tag => "slow_request" }
}
if [http_request_failure] or [http_poller_metadata][code] != 200 {
mutate { add_tag => "bad_request" }
}
}
output {
stdout { codec => rubydebug }
}
以及部分响应:
Pipeline main started
JSON parse failure. Falling back to plain-text {:error=>#<LogStash::Json::ParserError: Unexpected character (')' (code 41)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at ... (bunch of lines)...
{
"http_poller_data" => {
"message" => ")]}'\n{\"All-Users\":{\"id\":\"All-Users\",....(more valid JSON)...",
"tags" => [
[0] "_jsonparsefailure"
],
"@version" => "1",
"@timestamp" => "2016-12-13T09:48:25.397Z"
},
"@version" => "1",
"@timestamp" => "2016-12-13T09:48:25.397Z",
"http_poller_metadata" => { ... }
这是我向 Whosebug 提出的第一个问题。感谢您的友好回答!
我使用 "sed 1d" 删除“)]}'”前缀,并使用 "jq" 处理 JSON 输出。例如,要获取我执行的 Gerrit 项目的状态:
curl -s --header 'Content-Type:application/json' --request GET --netrc https://<GERRIT-SERVER>/a/projects/?r=<GERRIT-PROJECT> | sed 1d | jq --raw-output ".[] | .state"
ACTIVE
您可以使用带有 gsub 选项 (link) 的 mutate 过滤器来删除 )]}
mutate {
gsub => [
"message", "\)]}'", ""
]
}
但是 gsub 会替换所有出现的正则表达式,因此您必须确保该模式只出现一次。