elasticsearch - 通过Logstash更新时,Elastic Document的@version不会递增

标签 elasticsearch logstash elastic-stack

我想定期将问题数据从JIRA实例加载到我的Elastic Stack中。我不想每次从JIRA API中提取数据时都创建一个新的 flex 文档,而是更新现有的文档文档,这意味着每个JIRA问题仅应存在一个文档。更新时,我希望设置 @version document_id 字段时elasticsearch output plugin字段自动增加。

当前工作的设置

  • flex 堆栈:在Ubuntu Docker容器中运行的版本7.4.0
  • Logstash输入阶段:通过 http_poller input plugin 获取JIRA发行数据
  • Logstash筛选器阶段:根据需要使用 split filter plugin 修改JSON数据
  • Logstash输出阶段:将数据通过管道传输到Elasticsearch并在Kibana中使其可见

  • 我在哪里挣扎

    数据已在Elastic中正确注册并在Kibana中显示。与预期的一样,每个问题只有一份文档。但是,文档正在被覆盖,但是@version保持在值1。我假设使用action => "update"doc_as_upsert => truedocument_id => "%{[@metadata][id]}"足以使Elasticsearch意识到需要增加文档的版本。

    我总体上想知道这是否是使JIRA问题数据随时间推移可搜索的正确方法。例如,我能否在过去的@version上找到JIRA票证的现状?还是@version值仅向我提供了文档更新频率的信息,而没有给我各个文档版本的值?

    logstash.conf(某些数据已删除并替换为<>标记)
    input {
      http_poller {
        urls => {
          data => {
            method => get
            url => "https://<myjira>.com/jira/rest/api/2/search?<searchJQL>"
            headers => {
              Authorization => "Basic <censored>"
              Accept => "application/json"
              "Content-Type" => "application/json"
            }
          }
        }
        request_timeout => 60
        schedule => { every => "10s" } # low value for debugging
        codec => "json"
      }
    }
    
    filter {
      split {
        field => "issues"
        add_field => {
          "key" => "%{[issues][key]}"
          "Summary" => "%{[issues][fields][summary]}"
          [@metadata]["id"] => "%{[issues][id]}" # unique ID of a JIRA issue, the JIRA issue key could also be used
        }
      remove_field => [ "startAt", "total", "maxResults", "expand", "issues"]
      }
    }
    
    output {
      stdout { codec => rubydebug }
      elasticsearch {
           index => "gsep"
           user => ["<usr>"]
           password => ["<pw>"]
           hosts => ["elasticsearch:9200"]
           action => "update"
           document_id => "%{[@metadata][id]}"
           doc_as_upsert => true
      }
    }
    

    Kibana中文档数据的屏幕截图

    我必须检查信息,但是缺少的信息应该不相关。在屏幕截图上,您可以看到正确设置了相同的_id,但是@version保持为1。在Elasticstash / Kibana中,对于相应的issue / _id仅存在该文档。

    First screenshot with earlier timestsamp

    Second screenshot with later timestamp

    最佳答案

    @version 字段来自logstash,仅表示日志消息格式的版本。没有自动递增功能等。

    请注意,elasticsearch文档中还有一个 _version 字段。
    _version concurrency方案中用于乐观锁定的自动递增值。

    只是要清楚一点,elasticsearch无法为您提供开箱即用的版本方面的期望。您不能依靠 _version 访问同一文档的其他版本。有一些设计模式可以在Elasticsearch中实现此类文档历史记录。但这是一个有很多答案的广泛问题,超出了这个问题的范围。

    关于elasticsearch - 通过Logstash更新时,Elastic Document的@version不会递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089379/

    相关文章:

    c# - 如何通过使用Nest从Json ElasticSearch获取logType和级别?

    Elasticsearch - 启用字段的全文搜索

    elasticsearch - 使用索引模板在 Elasticsearch 中配置TTL

    redis - 多个 Logstash 实例导致行重复

    elasticsearch - Elasticsearch 索引ShardGatewayRecoveryException

    elasticsearch - Kibana 替代品

    lucene - 仅根据查询获取分面结果

    elasticsearch - Elasticsearch 和Twitter数据示例

    elasticsearch - 无法在端口 5601 上加载 Kibana

    elasticsearch - 无法提取AKS上托管的Elasticsearch集群传输层的证书