[PYTHON] Écrivez votre plugin blackbird # 003

Écrivons le plugin blackbird La troisième puce, où je n'ai pas pu écrire en détail dans la deuxième puce, principalement

Mourons.

About each member properties of JobBase class

self.options

Cela a été expliqué dans la deuxième tranche, mais en interprétant le contenu décrit dans le fichier de configuration comme clé et valeur, Il est au format dictionnaire. En particulier

[SECTION_NAME_IS_ANYTHING_OK]
hostname = hogehoge.com
hogehoge = fugafuga

S'il existe un fichier de configuration comme

self.options = {
    'hostname': 'hogehoge.com',
    'hogehoge': 'fugafuga'
}

Vous aurez un dictionnaire qui ressemble à ceci. J'ai l'intention d'écrire à ce sujet de manière assez détaillée dans la deuxième tranche, donc C'est comme ça. Plus de kwsk! S'il y a quelque chose comme ça, je pense que je vais l'écrire dans les commentaires ou si vous me contactez.

self.queue

Le processus principal est une file d'attente pour l'échange de messages entre les threads. Je n'ai rien fait de particulièrement difficile La [Queue.Queue] créée en Python (http://docs.python.jp/2/library/queue.html#Queue.Queue) est utilisée telle quelle. Pensez donc à la méthode self.queue.put lorsqu'elle lit Queue.Queue.put.

notes:

Concernant la méthode put (je pense que les personnes qui écrivent des plug-ins utiliseront principalement la méthode put) Quand il y a un argument de block et que vous effectuez une opération put, vous pouvez effectuer des opérations à partir d'autres consommateurs et producteurs. C'est bloquer. Cependant, c'est à la condition que la clé, l'horloge, l'hôte ne couvrent pas un élément. ** block = False est fortement recommandé **.

self.logger

Une instance pour la journalisation. Cette instance est juste le format de sortie du [module de journalisation] créé par Python (http://docs.python.jp/2/library/logging.html). Les méthodes du module de journalisation peuvent être utilisées telles quelles.

self.logger.debut('This is Debug log!! HOGEHOGE!!!!!!!!!!')

Par conséquent, il est également possible d'écrire comme ci-dessus. Le niveau de sortie du journal est "WARN" par défaut (ceci peut être changé dans la section globale).

self.invalid_key_list

//C'est nouveau, mais j'ai l'impression d'avoir fait une erreur dans le nom de la propriété.
//J'ai l'impression que ce n'est pas invalide w ignorer??

Il s'agit d'une liste noire qui indique que si la clé de l'élément est dans cette liste, elle ne sera pas dans la file d'attente. Par exemple

class ConcreteJob(blackbird.plugins.base.JobBase):

    def __init__(self, options, queue=None, logger=None):
        super(ConcreteJob, self).__init__(options, queue, logger)
        self.invalid_key_list = [
            'host.IGNORE_KEY_NAME001',
            'host.IGNORE_KEY_NAME002'
        ]

Ce faisant, il est possible de couper la logique à une autre méthode sans écrire le processus de distribution à l'endroit où il est récupéré complètement comme la commande stats d'un certain Memcached. Dans ce cas, bien sûr, il ne suffit pas de simplement le mettre dans la liste.

#..snip..

def filter_item(item):
    if not item.data['key'] in self.invalid_key_list:
        return item

def filter_items(items):
    filtered_items = list()
    for entry in items:
        if not items.data.['key'] in self.invalid_key_list:
            filtered_items.append(entry)

    return filtered_items

J'espère que vous l'implémenterez avec un bon feeling.

À propos des fonctions pratiques implémentées de chaque côté de la classe de base

Ensuite, je voudrais parler des fonctions de commodité implémentées de chaque côté de la classe de base. Eh bien, pour être honnête, il n'y en a pas beaucoup, mais je pense qu'ils vous aideront à créer des plugins.

blackbird.plugins.base.ValidatorBase.detect_hostname

Comme son nom l'indique, c'est une méthode qui récupère le nom d'hôte. J'utilise des fonctions de basse couche (j'espère que Python peut utiliser ce genre de chose à la légère), mais c'est vraiment simple,

return socket.getfqdn() or socket.gethostname() or 'localhost'

Je fais juste ça.

  1. S'il y a un résultat de socket.getfqdn (), renvoyez-le tel quel
  2. Sinon, retournez socket.gethostname () (le résultat d'un nom d'hôte court, hostname -s)
  3. Si cela ne fonctionne pas, vous pouvez renvoyer «localhost» sous forme de chaîne de caractères.

En tant que messager

class Validator(base.ValidatorBase):
    def __init__(self):
        self.__spec = None

    @property
    def spec(self):
        self.__spec = (
            "[{0}]".format(__name__),
            "hostname = string(default={0})".format(self.detect_hostname()),
        )
        return self.__spec

Est-ce un tel endroit? Au fait, cela a été mis en œuvre à la suggestion d'un grand senior, et merci d'avoir saisi cette opportunité m (\ _ \ _) m

Timer context

Le contexte du minuteur est un contexte qui mesure le temps de traitement dans le contexte inclus dans. Nous l'utilisons pour écrire et lire des clés pour redis et memcached pour mesurer le taux et le rendre métrique. L'utilisation n'est pas différente du contexte ordinaire,

import blackbird.plugins.base.Timer

with Timer() as timer:
    for entry in xrange(0, 9):
        print entry

    return [timer.sec, timer.msec]

En d'autres termes, la propriété sec de la classe timer renvoie le temps de traitement en secondes. La propriété msec renvoie le temps de traitement en millisecondes.

About Blabckbird Exception

Exception (la vraie signification ici est Exception lorsqu'une erreur inattendue se produit dans votre plug-in) Pour distinguer s'il était inattendu quand il s'est produit ou s'il a été généré intentionnellement comme `augmenter l'erreur de valeur Il implémente sa propre exception. Cependant, comme il vous suffit de spécifier la chaîne d'erreur et de la lever, augmentez-la exactement de la même manière que ValueError. Par exemple

import blackbird.plugins.base.BlackbirdPluginError

try:
    value = self.options['key']
except KeyError as exception:
    raise blackbird.plugins.base.BlackbirdPluginError(
        exception.__str__
    )

Cela facilite le débogage du comportement lorsqu'une exception est levée.


C'est ce que fait le module blackbird.plugins.base, Je ne sais pas ce que c'est, ou c'est différent ici, et je pense que je veux aussi une méthode comme celle-ci du côté de la base. S'il y en a, j'aimerais en savoir de plus en plus m (\ _ \ _) m

Recommended Posts

Écrivez votre plugin blackbird # 002
Écrivez votre plugin blackbird # 001
Écrivez votre plugin blackbird # 003
Ecrire le plugin vim en Python
Ecrire un plugin Vim simple en Python 3