我正在收集有关我的应用程序的一些指标,并定期通过REST逐个导出它们。输出json看起来像:
:hi def link PreviousSearch MoreMsg " Define some different highlight group based on some existing one.
:execute 'match PreviousSearch /' . @/ . '/'
这是我的{
"name": "decoder.example.type-3",
"value": 2000,
"from": 1517847790049
"to": 1517847840004
}
配置运行良好。它将删除所有http标头,原始计数器名称,并将logstash
添加为example
,将interface
添加为type-3
。
transaction
我现在要做的是立即将所有指标作为json数组发送并拆分所有这些消息并应用逐个应用的相同逻辑。输入消息的示例如下所示:
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
grok {
match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
remove_field => [ "name", "headers", "message" ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}
我很确定我应该使用split过滤器,但我无法弄清楚如何使用它。我尝试在[
{
"name": "decoder.example.type-3",
"value": 2000,
"from": 1517847790049,
"to": 1517847840004
},
{
"name": "decoder.another.type-0",
"value": 3500,
"from": 1517847790049,
"to": 1517847840004
}
]
插件前后放置split
,使用不同的json
设置,field
,但似乎没有任何效果符合预期。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
在我的配置中,我首先使用split,然后我做了逻辑。你应该看看基于这样的东西:
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
}
split{
field => "message"
}
grok {
match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
remove_field => [ "name", "headers", "message" ]
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}
但是这假设你总是有一个数组的消息字段
哦是的,我认为您应该检查是否有新的message
字段包含您发布的对象。因为如果是这样,你的grok在name
下找不到任何内容,你需要匹配message.name
。 (我通常会从temp
创建一个[message][name]
字段并稍后删除temp
,因为我不想查找如何调用嵌套字段。必须有一个更聪明的方法。)
答案 1 :(得分:1)
这是我最终的配置。也许它可以用更少的步骤完成,但这很有效。我不得不移动一些字段以保持相同的结构,因此它比我最初的一个一个一个地工作。
基本思想是将解析后的json放入特定字段,而不是根目录,然后拆分该新字段。
input {
http {
port => 31311
}
}
filter {
json {
source => "message"
target => "stats"
}
split {
field => "stats"
}
grok {
match => [ "[stats][name]", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
}
mutate {
add_field => {
"value" => "%{[stats][value]}"
"from" => "%{[stats][from]}"
"to" => "%{[stats][to]}"
}
remove_field => [ "headers", "message", "stats" ]
}
mutate {
convert => {
"value" => "integer"
"from" => "integer"
"to" => "integer"
}
}
}
output {
elasticsearch {
hosts => [ "http://localhost:9200" ]
index => "metric.decoder-%{+YYYY.MM.dd}"
}
}