Форматирование вывода через Webhook

Добрый день!

Имеется следующий transform из watcher:

  "transform": {
     "script": {
       "source": "DateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss z\");dateFormat.setTimeZone(TimeZone.getTimeZone(\"Europe/Moscow\")); Date date = new Date(); ctx.execution_time = dateFormat.format(date); return ['human_date': ctx.execution_time, 'aggregations': ctx.payload.aggregations]",
       "lang": "painless"
    }
  }

Через WebHook в телеграм выдается следующий вывод:

**** Watcher ****
Date/Time: 2019-09-27 10:24:55 MSK
Watcher name: test_watcher
Host: www.domain.com
Request Time (ms): 60.000999450683594

В поле Request Time время в миллисекундах выдается с большим количеством знаков после запятой. Как можно сократить количество знаков до нуля? Чтобы после запятой не было ничего (как и самой запятой)

А как вы формирутете это сообщение в WebHook?

если я правильно понял Ваш вопрос: через "actions"

"body": "text=****watcher mon**** %0A\nDate/Time: {{ctx.payload.human_date}}%0A\nWatcher name: {{ctx.metadata.name}}%0A\nHost: {{#ctx.payload.aggregations.host.buckets}}\n{{key}}\n%0ARequest Time (ms): {{max_req_time.value}}%0A\n{{/ctx.payload.aggregations.host.buckets}}\n"

А как вы max_req_time получаете?

max_req_time это максимальное значение из тех (request_time), что мы получаем в ответ на запрос

Как вы это значение рассчитываете?

просто берем из логов

Я не понимаю, каким образом action знает что такое {{max_req_time.value}}. Тем не менее, когда вы его рассчитваете вам надо его рассчитывать с помощью Math.round(...).

Игорь, а как можно ограничить количество символов после точки в max_req_time?
я нашел некий DecimalFormat, но не могу разобраться как и в каком ключе его необходимо применить

Я не могу ответь на этот вопрос. Я не понимаю что такое max_req_time, какой у него тип и откуда оно у вас берется.

тип - float
берется из эластика (а эластик берет из логов)

 "aggregations": {
            "host": {
              "terms": {
                "field": "http_host.keyword",
                "order": {
                  "max_req_time": "desc"
                }
              },
              "aggregations": {
                "max_req_time": {
                  "max": {
                    "field": "request_time"
                  }
                },
                "max_agg_pipe": {
                  "bucket_selector": {
                    "buckets_path": {
                      "max_req_time": "max_req_time"
                    },
                    "script": {
                      "lang": "expression",
                      "source": "max_req_time > 11"
                    }

                  ....

У вас там их 5 штук. Если бы это был float, то вы не могли бы на нем вызвать value.

Игорь, вот весь мой ватчер:

{
  "trigger": {
    "schedule": {
      "interval": "3m"
    }
  },
  "input": {
    "search": {
      "request": {
        "search_type": "query_then_fetch",
        "indices": [ "weblog-*" ],
        "rest_total_hits_as_int": true,
        "body": {
          "size": 0,
          "query": {
            "bool": {
              "must": [
                {
                  "range": {
                    "@timestamp": {
                      "gte": "now-1m",
                      "lte": "now"
                    }
                  }
                }
              ],
              "must_not": [
                {
                  "query_string": {
                    "analyze_wildcard": true,
                    "fields": [
                      "http_host.keyword"
                    ],
                    "query": "dev.domain.com"
                  }
                }
              ]
            }
          },
          "aggregations": {
            "host": {
              "terms": {
                "field": "http_host.keyword",
                "order": {
                  "max_req_time": "desc"
                }
              },
              "aggregations": {
                "max_req_time": {
                  "max": {
                    "field": "request_time"
                  }
                },
                "max_agg_pipe": {
                  "bucket_selector": {
                    "buckets_path": {
                      "max_req_time": "max_req_time"
                    },
                    "script": {
                      "lang": "expression",
                      "source": "max_req_time > 16"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total": {
        "gt": 50
      }
    }
  },
  "actions": {
    "telegram": {
      "webhook": {
        "scheme": "http",
        "host": "api.telegram.com",
        "port": 81,
        "method": "post",
        "path": "/bot123456789:XXXXXXXX/sendMessage",
        "params": {},
        "headers": {
          "Content-Type": "application/x-www-form-urlencoded"
        },
        "body": "chat_id=-123456789&text=****Watcher**** %0A\nDate/Time: {{ctx.payload.human_date}}%0A\nWatcher name: {{ctx.metadata.name}}%0A\nHost: {{#ctx.payload.aggregations.host.buckets}}\n{{key}}\n%0ARequest Time (ms): {{max_req_time.value}}%0A\n{{/ctx.payload.aggregations.host.buckets}}\n"
      }
    }
  },
  "transform": {
    "script": {
      "source": "DateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss z\");dateFormat.setTimeZone(TimeZone.getTimeZone(\"Europe/Moscow\")); Date date = new Date(); ctx.execution_time = dateFormat.format(date); return ['human_date': ctx.execution_time, 'aggregations': ctx.payload.aggregations]",
      "lang": "painless"
    }
  }
}

Теперь понятно. :slight_smile:

Проще всего будет округлить в том же блоке transform где вы рассчитываете human_date. Добавьте туда вот это перед return:

for (bucket in ctx.payload.aggregations.host.buckets) {
  bucket.max_req_time.value = Math.round(bucket.max_req_time.value);
}

большое спасибо, помогло