Состояние наблюдателя со встроенным сценарием, содержащим арифметику c, не выполняется - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать наблюдатель, который будет запускаться всякий раз, когда я использую более 80% кучи JVM.

Я делаю следующий запрос кasticsearch v7.5.

{
    "trigger": {
        "schedule": {
            "interval": "20s"
        }
    },
    "input": {
        "http": {
            "request": {
                "scheme": "https",
                "host": "domain.region.aws",
                "port": 9200,
                "method": "get",
                "path": "/_cluster/stats"
                "params": {},
                "headers": {},
                "auth": {
                    "basic": {
                        "username": "username",
                        "password": "password"
                    }
                }
            }
        }
    },
    "condition": {
        "script": {
            "inline": "return ((ctx.payload.nodes.jvm.mem.heap_used_in_bytes / ctx.payload.nodes.jvm.mem.heap_max_in_bytes) * 100) > 80"
        }
    },
    "actions": {
        "send_email": {
            "email": {
                "to": "some-email@domain.com",
                "subject": "Watcher Notification",
                "body": "{{ctx.payload.nodes.jvm.mem.heap_used_in_bytes}} of the JVM heap memory is currently being used."
            }
        }
    }
}

Мое состояние, кажется, возвращает неправильные результаты.

Например:

Если я изменю свой сценарий на:

return ((ctx.payload.nodes.jvm.mem.heap_used_in_bytes / ctx.payload.nodes.jvm.mem.heap_max_in_bytes) * 100) < 1

heap_used_in_bytes = 979683712

heap_max_in_bytes = 2739011584

Что должно привести к: 35.767782719 (Неверно)

В результате получится ответ, содержащий (что неверно):

"condition": {
  "type": "script",
  "status": "success",
  "met": true
}

Кажется, что когда я Попробуйте даже простые запросы, используя переменные, это не работает. Например, изменение условия на return ctx.payload.nodes.jvm.mem.heap_max_in_bytes > 2739011584 приводит к странной ошибке компиляции:

{"statusCode":400,"error":"Bad Request","message":"[script_exception] compile error, with { script_stack={ 0=\"... vm.mem.heap_max_in_bytes 2739011584\" & 1=\"                             ^---- HERE\" } & script=\"return ctx.payload.nodes.jvm.mem.heap_max_in_bytes 2739011584\" & lang=\"painless\" }"}

Простые сравнения, где я не использую переменные, похоже, работают. Я могу напечатать значение переменных, к которым я обращаюсь в скрипте, в значении body в действии email. Кто-нибудь может пролить свет на то, что здесь происходит? И есть ли в любом случае распечатать результат этого скрипта в теле письма где-нибудь?

1 Ответ

1 голос
/ 21 февраля 2020

Согласно этому сообщению об ошибке, он не использует Groovy, он использует язык по умолчанию ES, который painless

Согласно безболезненной документации , целочисленное деление будет результат в целое число, поэтому 979683712 / 2739011584 == 0

Я не эксперт, но Я считаю изменяя ваш безболезненный сценарий на:

return ((ctx.payload.nodes.jvm.mem.heap_used_in_bytes / (double)ctx.payload.nodes.jvm.mem.heap_max_in_bytes) * 100) < 1

Должен исправить это (как это с приведением знаменателя деления на double)

В качестве альтернативы, вы должны иметь возможность:

    "condition": {
        "script": {
            "lang": "groovy",
            "inline": "return ((ctx.payload.nodes.jvm.mem.heap_used_in_bytes / ctx.payload.nodes.jvm.mem.heap_max_in_bytes) * 100) > 80"
        }
    },

Для использования groovy вместо ...

Надеюсь, это поможет ... Не могу легко это проверить ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...