J'essaie de créer un observateur qui se déclenchera chaque fois que j'utiliserai plus de 80% du tas JVM.

Je fais la requête suivante à elasticsearch 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."
            }
        }
    }
}

Mon état semble donner de mauvais résultats.

Par exemple:

Si je change mon script pour qu'il soit :

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

Ce qui devrait donner : 35.767782719 (Faux)

Donne une réponse contenant (ce qui est incorrect) :

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

Il semble que lorsque j'essaie même des requêtes simples à l'aide de variables, cela ne fonctionne pas. Par exemple, changer la condition en return ctx.payload.nodes.jvm.mem.heap_max_in_bytes > 2739011584 entraîne une étrange erreur de compilation :

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

Des comparaisons simples où je n'utilise pas de variables semblent fonctionner. Je peux imprimer la valeur des variables auxquelles j'accède dans le script dans la valeur de body dans l'action email. Quelqu'un peut-il nous éclairer sur ce qui se passe ici ? Et y a-t-il de toute façon pour imprimer le résultat de ce script dans le corps de l'email quelque part ?

0
Guybrush 20 févr. 2020 à 14:45

1 réponse

Meilleure réponse

Selon ce message d'erreur, cela n'utilise pas Groovy, il utilise le langage ES par défaut qui est painless

Selon la documentation indolore< /a>, la division entière donnera un entier, donc 979683712 / 2739011584 == 0

Je ne suis pas un expert, mais je crois changer votre script indolore en :

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

Devrait le corriger (car il a converti le dénominateur de la division en double)

Alternativement, vous devriez être capable de faire :

    "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"
        }
    },

Pour utiliser groovy à la place...

J'espère que ça aide... Je ne peux pas le tester facilement

1
tim_yates 21 févr. 2020 à 09:09