【问题标题】:How to make a field in Kibana numeric (from String)如何在 Kibana 中创建一个数字字段(来自字符串)
【发布时间】:2016-08-08 23:19:18
【问题描述】:

我已经继承了一个用于日志的 ELK 堆栈,但我仍在学习其中的技巧 - 我的任务是在我们的 logstash 索引上为某种类型创建两个数字字段。似乎无法弄清楚如何做到这一点。我尝试过的事情:

  1. 在 Kibana 设置页面中,转到我的 logstash 索引并找到该字段。去控制选项卡上编辑,看到类型列为字符串(它是不可变的)。格式下拉菜单显示 URL 和字符串。
  2. 去了我的一个 Elasticsearch 主机,找到了文档类型的 grok 规则,发现它们确实是为了将字段解析为数字而编写的。示例:%{NUMBER:response_code}
  3. 没有想法,因为我不知道如何绕过 ELK 堆栈。

非常感谢任何帮助,尤其是相关文档的链接,以便我了解发生了什么。如果我知道用 Google 搜索什么,我会更加努力地搜索。

【问题讨论】:

    标签: elasticsearch kibana elastic-stack


    【解决方案1】:

    还要注意%{NUMBER:response_code} 不会从字符串中生成数字,它只是识别并解析字符串中存在的数字,但生成的response_code 字段仍然是字符串,您需要将其转换为使用mutate/convert filter 的号码。 grok 将始终将字符串解析为其他较小的字符串,您的工作是将结果字段转换为您期望的类型。

    所以你需要在你的 grok 过滤器之后添加这个:

      mutate {
        convert => { "response_code" => "integer" }
      }
    

    从那时起,您的事件中的response_code 将是一个整数,而用于创建您的每日logstash 索引的logstash template 包含一个用于整数字段的特定动态模板。请注意,response_code 字段将是一个整数仅在创建新的 logstash 索引后,现有索引不会更改。

    【讨论】:

    • 这个运气好吗?
    • 我遇到了类似的问题并添加了 mutate 过滤器,我可以在 kibana 中看到相应的日志消息它(response_time)以整数形式出现,但在尝试查找时无法看到 response_time 字段通过可视化得出相同的平均值。我是否必须做任何其他事情才能获得该字段的平均值并将其显示在仪表板中?附: - 为了重新索引,我刚刚在 logstash.conf 中编辑了索引名称。我是否必须按照上面的建议再次从 ES 导入所有日志?
    【解决方案2】:

    您需要reindex your data。由于该字段的 Elasticsearch 映射(即架构)已设置为 string,因此您将无法在同一索引中将数据索引为 integer

    典型的 ELK 设置会创建滚动索引(每天或每月),因此可以在索引之间从 string 切换到 interger,但不建议这样做,因为它会干扰长期聚合和搜索。

    如您所见,更改 Grok 规则将有助于处理未来的数据。现在,您需要再次通过 Logstash 传递所有现有数据以应用新的 ryles。

    为此,您可以再次传递日志文件,或者让 Logstash 从 Elasticsearch 中读取

    input {
      elasticsearch {
        hosts => "localhost"
      }
    }
    

    较新版本的 Elasticsearch 应该通过提供原生 reindex API 来改进这一点。

    【讨论】:

      【解决方案3】:
      1. 尝试查看文档样本:

        curl -XGET 'localhost:9200/_search?q=opcode:userLessonComplexityPoll&pretty'

      2. 假设您看到这些文档:

        { "_index" : "我的索引", “_type”:“日志”, "_id" : "AWNoYI8pGmxxeL6jupEZ", “_score”:1.0, “_来源” : { “生产”:“0”, “课程 ID”:“2144”, "操作码" : "userLessonComplexityPoll", “课程ID”:“45”, "lessonType" : "minitest", ...

      3. 所以,尝试在一个文档中转换:

        curl -XPOST 'localhost:9200/educa_stats-*/_update_by_query?pretty' -d ' { “脚本”: { "lang": "无痛", “来源”:“if(ctx._source.lessonId instanceof String) { int courseId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId = (int)lessonId; }” }, “询问”: { “布尔”:{ “条款”:{ “_id”:[“AWNoYI8pGmxxeL6jupEZ”,“AWMcRJYFGmxxeL6jucIZ”] } } } }'

      4. 成功了吗?尝试通过查询转换所有文档:

        curl -XPOST 'localhost:9200/educa_stats-*/_update_by_query?pretty' -d '
        

        { “脚本”: { "lang": "无痛", “来源”:“if(ctx._source.lessonId instanceof String) { int courseId = Integer.parseInt(ctx._source.lessonId); ctx._source.lessonId = (int)lessonId; }” }, “询问”: { “布尔”:{ “必须”: [ { “存在”:{ “字段”:“课程 ID” } } ] } } }'

      所有字段课程 ID 将从 String 类型转换为 int (-2^32 - 2^32) 类型。就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        相关资源
        最近更新 更多