kurdit
(Aleksandr)
September 27, 2019, 8:00am
1
Добрый день!
Имеется следующий 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 время в миллисекундах выдается с большим количеством знаков после запятой. Как можно сократить количество знаков до нуля? Чтобы после запятой не было ничего (как и самой запятой)
Igor_Motov
(Igor Motov)
September 27, 2019, 1:05pm
2
А как вы формирутете это сообщение в WebHook?
kurdit
(Aleksandr)
September 27, 2019, 1:20pm
3
если я правильно понял Ваш вопрос: через "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"
Igor_Motov
(Igor Motov)
September 27, 2019, 1:24pm
4
А как вы max_req_time
получаете?
kurdit
(Aleksandr)
September 27, 2019, 1:27pm
5
max_req_time это максимальное значение из тех (request_time), что мы получаем в ответ на запрос
Igor_Motov
(Igor Motov)
September 27, 2019, 1:28pm
6
Как вы это значение рассчитываете?
Igor_Motov
(Igor Motov)
September 27, 2019, 1:57pm
8
Я не понимаю, каким образом action знает что такое {{max_req_time.value}}
. Тем не менее, когда вы его рассчитваете вам надо его рассчитывать с помощью Math.round(...)
.
kurdit
(Aleksandr)
September 27, 2019, 2:13pm
9
Игорь, а как можно ограничить количество символов после точки в max_req_time
?
я нашел некий DecimalFormat, но не могу разобраться как и в каком ключе его необходимо применить
Igor_Motov
(Igor Motov)
September 27, 2019, 2:19pm
10
Я не могу ответь на этот вопрос. Я не понимаю что такое max_req_time
, какой у него тип и откуда оно у вас берется.
kurdit
(Aleksandr)
September 27, 2019, 3:04pm
11
тип - 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"
}
....
Igor_Motov
(Igor Motov)
September 27, 2019, 3:53pm
12
У вас там их 5 штук. Если бы это был float, то вы не могли бы на нем вызвать value.
kurdit
(Aleksandr)
September 30, 2019, 9:14am
13
Игорь, вот весь мой ватчер:
{
"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"
}
}
}
Igor_Motov
(Igor Motov)
September 30, 2019, 2:55pm
14
Теперь понятно.
Проще всего будет округлить в том же блоке transform
где вы рассчитываете human_date
. Добавьте туда вот это перед return:
for (bucket in ctx.payload.aggregations.host.buckets) {
bucket.max_req_time.value = Math.round(bucket.max_req_time.value);
}
system
(system)
Closed
October 29, 2019, 2:40pm
16
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.