Monitor unique ES aliases

Le moteur de recherche Elasticsearch permet d’utiliser des aliases afin de faire référence à des indexes existants. Cela permet notamment d’ajouter des indexes Elasticsearch différents des indexes en cours et de pouvoir changer rapidement à chaud d’index sans interruption de service.

Exemple d’architecture

Notre application appèle l’index fruit. Grâce à l’alias, on pointe sur la version du 3 août. Nous effectuons une réindexation à chaud mais créons l’alias fruit_20150806, correspondant à la date du jourELS-Alias-BeginA la fin de notre processus, nous pouvons demander à Elasticsearch de migrer cet alias sur le nouvel index

ELS-Alias-EndDans certains processus de mises à jour automatiques il peut être intéressant de vérifier qu’il n’y a pas eu d’échec de suppression de l’ancien alias. Celui-ci peut causer un doublon pouvant poser de gros soucis.

Je vous propose la sonde en python suivante permettant de lister les indexes Elasticsearch présents sur votre cluster et vérifiant qu’ils sont bien uniques. Elle est sous licence BSD 2 clauses

#! /usr/bin/python

import getopt, sys, json
import urllib2

PROG_NAME = "check_els_indexes"

def doELSVerification(url):
        req = urllib2.Request(url)
        response = urllib2.urlopen(req)
        jsonresp = json.loads(response.read())

        # Count all elasticsearch server aliases
        elsAliases = {}
        for index in jsonresp:
            if "aliases" in jsonresp[index]:
                for idx in jsonresp[index]["aliases"]:
                    elsAliases["%s" % idx] = elsAliases["%s" % idx] + 1 if idx in elsAliases else 1

        # Filter aliases to show only problematic aliases
        filteredAliases = []
        for alias in elsAliases:
            if elsAliases[alias] > 1:
                filteredAliases += ["%s (%d occurences)" % (alias, elsAliases[alias]), ]

        # Do error message
        if len(filteredAliases) > 0:
            print "Some aliases are duplicated: %s" % ", ".join(filteredAliases)
            return 2
        else:
            print "No duplicate alias occurence found"
            return 0

if __name__ == "__main__":
    try:
        host = None
        port = None
        index = None
        opts, args = getopt.getopt(sys.argv[1:], "h:p:", ["host=", "port="])
        for o, a in opts:
            if o in ("-h", "--host"):
                host = a
            elif o in ("-p", "--port"):
                port = a
    except getopt.GetoptError:
        print "Invalid options passed to %s" % PROG_NAME
        sys.exit(3)

    if host == None:
        print "No option --host given for %s, aborting" % PROG_NAME
        sys.exit(3)

    if port == None:
        print "No option --port given for %s, aborting" % PROG_NAME
        sys.exit(3)

    els_alias_url = "http://%s:%s/_alias/*" % (host, port)

    elsStatus = doELSVerification(els_alias_url)
    sys.exit(elsStatus)

Vous pourrez la retrouver sur github ici.