Recherche des erreurs d’un ESB dans ELASTICSEARCH

,Depuis quelques temps, on a extrait les différents appels transitant dans un ESB (TIBCO BW dans mon cas) pour les déverser dans ELASTICSEARCH. On peut même utiliser la plateforme CONFLUENT pour faire du Change Data Capture pour transférer les données via KAFKA.

Cette solution permet de déterminer quelques statistiques intéressantes telles que le nombre d’appels, le nombre d’erreurs par service,…

Au delà des beaux graphiques fournis par KIBANA, je suis en train de me plonger dans la gestion des alertes. En effet, dans l’addon payant d’ELASTICSEARCH (XPACK), il y a un plugin assez intéressant : WATCHER.

Ce dernier permet, grâce à la percolation de lancer des alertes via API REST par exemple. Celles-ci sont déclenchées de manière périodique via un système analogue au CRON.

Dans cet article, je décrirai la requête et le mapping de données qui me permettent de stocker les données et de faire la recherche en question. Je décrirai dans un futur article, la création de l’alerte

 

Mapping

put /monitoring
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings": {
      "monitoring": {
        "properties": {
          "DEPLOYMENT_NAME": {
            "type": "keyword"
          },
          "DURATION_MS": {
            "type": "long"
          },
          "JOBEND": {
            "type": "date"
          },
          "JOBSTART": {
            "type": "date"
          },
          "LOGID": {
            "type": "text"
          },
          "STATUS": {
            "type": "keyword"
          }
        }
      }
    }
}

Requête

Mon besoin est d’identifier les services qui ont un fort taux d’erreur et de lancer une erreur le cas échéant. Par exemple, si un service a 30% d’erreur pendant un laps de temps de 30mn, on pourra appeler via une API REST un service de création d’anomalie (ex. JIRA).

Voici la requête que j’ai crée.Celle-ci utilise le mécanisme des agrégations pour déterminer pour chaque service le pourcentage d’erreur.

POST /monitoring/_search
{
  "size": 0,
  "query": {
    "range": {
      "JOBSTART": {
        "gte": "now-15d/d",
        "lte": "now"
      }
    }
  },
  "aggs": {
    "services":{
      "terms":{
        "field": "DEPLOYMENT_NAME"
      },
      "aggs": {
        "success":{
          "filter":{
            "term": {
              "STATUS": "success"
            }
          }
        },
         "errors":{
          "filter":{
            "term": {
              "STATUS": "error"
            }
          }
        },
    "percentage": {
          "bucket_script": {
            "buckets_path": {
              "numberOfSuccess": "success>_count",
              "numberOfErrors": "errors>_count"
            },
            "script": "params.numberOfErrors /(params.numberOfErrors+params.numberOfSuccess)"
          }
        },
        "services_error_filtered": {
          "bucket_selector": {
            "buckets_path": {
              "threesold": "percentage"
            },
            "script": "params.threesold > 0.5"
          }
        }
      }
    }
  }
}

Conclusion

Maintenant j’ai ma requête ELASTICSEARCH. La suite dans un autre article pour la création de l’alerte

 

 

Vus : 425
Publié par Littlewing : 368