12 votes

Existe-t-il une version python de la bibliothèque de métriques basée sur la JVM ?

Je suis à la recherche d'une bibliothèque de mesures de performance en python.

Je suis familier avec métriques par Coda Hale, qui est écrit pour la JVM et je me demande donc s'il existe un équivalent python pour cela (et qui n'utilise pas la JVM).

En bref, la liste des exigences de l'outil serait la suivante :

  • Compter différents types de métriques au moment de l'exécution. Compteurs, jauges, compteurs, chronomètres, histogrammes, etc. Il y a une belle liste aquí
  • Permet un accès facile aux données d'exécution via l'API HTTP. (Je peux envelopper la couche HTTP moi-même, mais si elle est déjà intégrée, c'est un plus).
  • Plugins pour graphite en particulier, ou autres. CopperEgg serait bien. Ou NewRelic.
  • Prise en charge de l'instrumentation pour les librairies courantes, telles que memcached.

Jusqu'à présent, j'ai trouvé PyCounters qui fait une partie du travail, mais pas tout. Il répond en quelque sorte à mon premier point (mais il ne dispose pas de tous les types métriques, seulement trois) et c'est tout.

Existe-t-il une meilleure alternative à PyCounters ?

Gracias

6voto

Usman Ismail Points 3327

Je suis tombé sur cette bibliothèque, qui est un portage de CodaHale metrics pour python.

Il manque quelques éléments, comme les rapporteurs, mais il fait la plupart des autres choses.

https://github.com/omergertel/pyformance/

Shameless plug, voici mon fork qui ajoute un rapporteur graphite hébergé. Il devrait être trivial d'ajouter des rapporteurs à d'autres systèmes.

https://github.com/usmanismail/pyformance

3voto

Eran Sandler Points 371

Je ne suis pas au courant de quelque chose qui fait exactement cela, mais j'ai écrit quelque chose il y a quelque temps pour un projet qui fait cela en ajoutant simplement des décorateurs aux fonctions pertinentes.

J'ai créé un ensemble de décorateurs pour mesurer le temps d'exécution des fonctions, mesurer le temps des fonctions d'accès à la base de données, etc.

Voici un exemple d'un tel décorateur :

def func_runtime(method):
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        start_time = datetime.datetime.utcnow()
        try:
            class_name = type(self).__name__
            method_name = method.__name__
            return method(self, *args, **kwargs)
        finally:
            end_time = datetime.datetime.utcnow() - start_time
            time_taken_ms = end_time.microseconds / 1000
            if _statsd:
                # Send the data to statsD, but you can do that for CopperEgg or anything else
                self.stats.timing("func.runtime.%s.%s" % (class_name, method_name), time_taken_ms)

Plus tard, vous l'utiliserez comme ceci :

@func_runtime
def myfunc(a, b, c):
    pass

J'ai également ajouté un décorateur pour les fonctions qui lisent à partir de la base de données et les fonctions qui écrivent dans la base de données afin que je puisse obtenir des graphiques sur le temps que le code a passé à attendre pour lire des données ou écrire des données ainsi que le nombre de fois où j'ai appelé des opérations de "lecture" et des opérations d'"écriture".

Donc, en tout et pour tout, j'ai eu les décorateurs suivants : - @func_runtime - pour mesurer le temps d'exécution d'une fonction - @func_dbread - placé sur les fonctions qui effectuent des lectures. Augmente le compteur database.reads et envoie des données de synchronisation à read_timing. - @func_dbwrite - identique à @func_dbread mais pour les écritures. - @func dbruntime - utilisé pour mesurer le temps d'exécution des fonctions spécifiques à la BD ainsi que le nombre d'appels et le temps total de toutes les fonctions de la BD.

Vous pouvez combiner les décorateurs et ils s'exécutent dans l'ordre le plus proche de la fonction, par exemple :

@func_dbruntime
@func_dbread
def some_db_read_function(a, b, c,d):
    pass

Ainsi, @func_dbread s'exécute avant @func_dbruntime.

Dans l'ensemble, il est facilement personnalisable et TRÈS puissant, et vous pouvez l'étendre pour prendre en charge des services tiers ainsi qu'ajouter du code pour activer et désactiver dynamiquement ces compteurs lorsque cela est nécessaire. D'après ce que j'ai pu constater, l'impact sur les performances est au mieux minime.

Juste une remarque à propos de l'envoi de données à des endroits comme CopperEgg et d'autres services, StatsD utilise UDP et comme il s'agit de statistiques, vous pouvez perdre quelques données tout en obtenant des informations significatives et il ne bloquera rien. Si vous voulez envoyer des données à des sites tiers comme CopperEgg, j'envisagerais d'envoyer les données dans une file d'attente locale, puis de les pousser avec un processus différent vers CopperEgg, juste pour découpler les problèmes des services tiers des vôtres.

Personnellement, pour ce type de données, StatsD est excellent et Graphite vous donne tout ce dont vous avez besoin, y compris le 90ème percentile, la moyenne, le maximum, les capacités graphiques, etc. et dispose de la plupart des types de compteurs dont vous avez besoin.

3voto

Eran Harel Points 1175

Je n'ai pas eu l'occasion de l'essayer, mais je suis tombé sur celui-ci il y a quelques jours : https://github.com/Cue/scales

scales - Métriques pour Python Suit l'état du serveur et les statistiques, ce qui vous permet de voir ce que fait votre serveur. Il peut également envoyer les mesures à Graphite pour la création de graphiques ou à un fichier pour l'analyse des pannes.

scales s'inspire de la fantastique bibliothèque de métriques, bien qu'il ne s'agisse en aucun cas d'un portage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X