【问题标题】:How to calcuate starttime & endtime using painless script如何使用无痛脚本计算开始时间和结束时间
【发布时间】:2021-05-06 14:42:44
【问题描述】:

我正在使用 ELK,并且我使用 build_date 创建了索引模式。现在要计算构建持续时间的平均值,我需要使用无痛脚本以分钟为单位找到开始时间和结束时间。

我的logstash输出数据如下

"build_end_time" => "2021-01-13 01:29:49",
"build_duration" => "6409651",
"build_start_time" => "2021-01-12 23:43:00",
"build_date" => "2021-01-12",
"@timestamp" => 2021-02-02T11:40:50.747Z,

下面给出的脚本字段设置。

Name: Duration_time
Language: painless
Type: number
Format: Duration
Input format: minutes 
Output format: Human readable
Popularity: 0

Script: def doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay

它抛出 - Script is invalid.

{
 "root_cause": [
  {
   "type": "script_exception",
   "reason": "compile error",
   "script_stack": [
    "def doc['build_end_time'].date.m ...",
    "       ^---- HERE"
   ],
   "script": "def doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay",
   "lang": "painless",
   "position": {
    "offset": 7,
    "start": 0,
    "end": 32
   }
  }
 ],
 "type": "search_phase_execution_exception",
 "reason": "all shards failed",
 "phase": "query",
 "grouped": true,
 "failed_shards": [
  {
   "shard": 0,
   "index": "build-logs",
   "node": "JSvuaBbCQr6uI5qKvavj7Q",
   "reason": {
    "type": "script_exception",
    "reason": "compile error",
    "script_stack": [
     "def doc['build_end_time'].date.m ...",
     "       ^---- HERE"
    ],
    "script": "def doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay",
    "lang": "painless",
    "position": {
     "offset": 7,
     "start": 0,
     "end": 32
    },
    "caused_by": {
     "type": "illegal_argument_exception",
     "reason": "invalid sequence of tokens near ['['].",
     "caused_by": {
      "type": "no_viable_alt_exception",
      "reason": null
     }
    }
   }
  }
 ]
}

有人可以帮我做这个吗?

【问题讨论】:

    标签: elasticsearch elastic-stack elk elasticsearch-painless


    【解决方案1】:

    这看起来像是一个语法错误。

    代替

    def doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay
    

    使用

    return doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay
    

    return 实际上不是必需的 - 您可以完全忽略它。


    def 关键字定义一些东西。所以理论上你可以说:

    def result = doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay
    

    但你需要返回一些东西——所以:

    def result = '...'; return result
    

    【讨论】:

    • 你的意思是这样的def result = (doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay); return?
    • return msDiff 最后。你想退还差价,不是吗?
    • return doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay 工作吗?
    • 不,它显示 - "org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType.fielddataBuilder(TextFieldMapper.java:823)", "org.elasticsearch.index.query.QueryShardContext.lambda$lookup$1(QueryShardContext.java:328)",
    • 即使def result = doc['build_end_time'].date.millisOfDay - doc['build_start_time'].date.millisOfDay 显示相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多