Logstash到elasticsearch。带点的键

时间:2016-12-27 16:46:45

标签: ruby elasticsearch logstash devops

我遇到了logstash配置问题。您可以在下面找到我的logstash配置。

Ruby过滤器删除每个点 - “。”从我的领域。似乎每个工作都很好 - 数据过滤的结果是正确的,但弹性搜索神奇地回应:"status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Field name [/ConsumerAdminWebService/getConsumerTransactions.call] cannot contain '.'"}其中getConsumerTransactions.call是我的字段键之一。

input {
  http_poller {
    urls => {
      uatBackend1 => {
        method => get
        url => "http://some-url/"
        headers => {
          Accept => "application/json"
        }
      }
    }
    request_timeout => 60
    # Run every 30 seconds
    schedule => { cron => "* * * * * UTC"}
    codec => "json"
    metadata_target => "http_poller_metadata"
 }
}
filter {
  ruby {
    init => "
      def remove_dots hash
          new = Hash.new
          hash.each { |k,v|
              if v.is_a? Hash
                  v = remove_dots(v)
              end
              new[ k.gsub('.','_') ] = v
              if v.is_a? Array
                  v.each { |elem|
                      if elem.is_a? Hash
                          elem = remove_dots(elem)
                      end
                      new[ k.gsub('.','_') ] = elem
                  } unless v.nil?
              end
          } unless hash.nil?
          return new
      end
  "
  code => "
      event.instance_variable_set(:@data,remove_dots(event.to_hash))
  "
 }
}
output {
  elasticsearch {
    hosts => localhost
  }
}

我担心这行代码不正确:event.instance_variable_set(:@data,remove_dots(event.to_hash)) - 结果数据以某种方式固定到事件中,但原始数据保持不变并传递给Elasticsearch api。

我想这里需要做一些澄清:

  • 我使用的是ES版本> 2.0这样的点不允许
  • Ruby过滤器应该用“_”替换点,并且它工作得很好 - 结果数据是完全正确的,但是ES回复了上面提到的错误。我怀疑过滤器不会替换事件数据,而只是向Event对象添加一个新的字段。 ES然后仍然读取原始数据而不是更新的原始数据。

说实话,Ruby对我来说是一种魔力:)

1 个答案:

答案 0 :(得分:0)

如果您使用的是ES版本2.0,则可能是版本问题,ES无法选取包含.点的字段。

根据此thread中的回复:

  

字段名称不能包含。 Elasticsearch 2.0中的字符。

作为一种解决方法,您可能必须mutate(重命名)您的字段名称,而不是_ or -,而不是使用.点。这个ticket几乎解释了这个问题,因为.点可以在2.0之后的ES版本中使用。希望它有所帮助!