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

**URL:** <https://discuss.elastic.co/t/webhook/201359>\
**Category:** Вопросы на русском языке\
**Created:** [September 27, 2019, 8:00am UTC](https://discuss.elastic.co/t/webhook/201359 "2019-09-27T08:00:37Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 8:00am UTC](https://discuss.elastic.co/t/webhook/201359/1 "2019-09-27T08:00:38Z")

</div>

Добрый день!

Имеется следующий 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](http://www.domain.com)  
> Request Time (ms): 60. **000999450683594**

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 1:05pm UTC](https://discuss.elastic.co/t/webhook/201359/2 "2019-09-27T13:05:10Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 1:20pm UTC](https://discuss.elastic.co/t/webhook/201359/3 "2019-09-27T13:20:25Z")

</div>

если я правильно понял Ваш вопрос: через "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"`

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 1:24pm UTC](https://discuss.elastic.co/t/webhook/201359/4 "2019-09-27T13:24:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 1:27pm UTC](https://discuss.elastic.co/t/webhook/201359/5 "2019-09-27T13:27:30Z")

</div>

max\_req\_time это максимальное значение из тех (request\_time), что мы получаем в ответ на запрос

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 1:28pm UTC](https://discuss.elastic.co/t/webhook/201359/6 "2019-09-27T13:28:41Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 1:29pm UTC](https://discuss.elastic.co/t/webhook/201359/7 "2019-09-27T13:29:29Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 1:57pm UTC](https://discuss.elastic.co/t/webhook/201359/8 "2019-09-27T13:57:49Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 2:13pm UTC](https://discuss.elastic.co/t/webhook/201359/9 "2019-09-27T14:13:42Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 2:19pm UTC](https://discuss.elastic.co/t/webhook/201359/10 "2019-09-27T14:19:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 27, 2019, 3:04pm UTC](https://discuss.elastic.co/t/webhook/201359/11 "2019-09-27T15:04:02Z")

</div>

тип - 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"
                    }

                  ....
```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 27, 2019, 3:53pm UTC](https://discuss.elastic.co/t/webhook/201359/12 "2019-09-27T15:53:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [September 30, 2019, 9:14am UTC](https://discuss.elastic.co/t/webhook/201359/13 "2019-09-30T09:14:15Z")

</div>

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

```
{
  "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"
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 30, 2019, 2:55pm UTC](https://discuss.elastic.co/t/webhook/201359/14 "2019-09-30T14:55:33Z")

</div>

Теперь понятно. 🙂

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

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

```

---

<div class="post-metadata">

**Author:** ![kurdit](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kurdit/32/54994_2.png) [@kurdit](https://discuss.elastic.co/u/kurdit)\
**Post date:** [October 1, 2019, 2:40pm UTC](https://discuss.elastic.co/t/webhook/201359/15 "2019-10-01T14:40:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [October 29, 2019, 2:40pm UTC](https://discuss.elastic.co/t/webhook/201359/16 "2019-10-29T14:40:48Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
