2012-12-31 16 views
10

Ich bin auf der Suche nach einer Leistungsmetrikbibliothek in Python.Gibt es eine Python-Version für die JVM-basierte Metrikbibliothek

Ich kenne metrics von Coda Hale, die für die JVM geschrieben wird und so frage ich mich, ob es ein Python-Äquivalent dafür gibt (und die JVM nicht verwendet). Kurz

In, würde die Liste der Anforderungen aus dem Werkzeug sein:

  • Count andere Art von Metriken zur Ausführungszeit. Zähler, Messgeräte, Zähler, Timer, Histogramme usw. Es gibt eine schöne Liste here
  • Erlauben Sie einfachen Zugriff auf die Laufzeitdaten über HTTP API. (Ich kann die HTTP-Schicht selbst wickeln, aber wenn es bereits gebacken ist, ist es ein Plus)
  • Plugins für Graphit oder andere. CopperEgg wäre nett. Oder NewRelic.
  • Gebacken in Instrumentierungsunterstützung für allgemeine Bibliotheken, wie Memcached.

Bis jetzt hatte ich PyCounters gefunden, die einen Teil des Jobs erledigt, aber nicht alles davon. Es erfüllt meine erste Kugel (aber es hat nicht alle Metriktypen, nur drei) und das ist alles.

Gibt es eine bessere Alternative zu PyCounters?

Dank

Antwort

3

haben die Chance, zu versuchen, es nicht hatte, aber ich kam vor ein paar Tagen über diese: https://github.com/Cue/scales

scales - Metriken für Python Tracks Serverstatus und Statistiken, so dass Sie sehen was dein Server macht. Es kann auch Metriken an Graphite für Graphiken oder an eine Datei für Crash-Forensik senden.

skalen werden von der fantastischen metrics-bibliothek inspiriert, obwohl es auf keinen fall ein port ist.

3

Ich bin etwas nicht bewusst, die genau das tut, aber ich habe etwas vor einiger Zeit für ein Projekt schreiben, die einfach durch Dekorateure auf die entsprechenden Funktionen macht das Hinzufügen.

I zur Messung der Laufzeit von Funktionen eine Reihe von Dekorateure erstellt, für die DB-Zugriffsfunktionen Messzeit, usw.

Ein Beispiel für einen solchen Dekorateur, ist dies:

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) 

Später Sie es verwenden würde dies wie:

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

ich habe auch eine Dekorateur für Funktionen, die von der DB und Funktionen lesen, die an die DB zu schreiben, so kann ich Diagramme auf, wie viel Zeit der Code spe bekommen Ich warte darauf, Daten zu lesen oder Daten zu schreiben, und wie oft ich "Lese" -Operationen und "Schreib" -Operationen aufgerufen habe.

Also, alles in allem hatte ich die folgenden Dekorateure: - @func_runtime - @func_dbread - - Orte auf Funktionen, die liest führt die Laufzeit einer Funktion zu messen. Inkrementiert einen database.reads-Zähler und sendet Timing-Daten an read_timing - @func_dbwrite - das gleiche wie @func_dbread, aber für Schreibvorgänge - @func dbruntime - wird verwendet, um die Laufzeit von DB-spezifischen Funktionen sowie Anzahl der Aufrufe und zu messen Gesamt Timing aller DB-Funktionen

können Sie Dekorateure kombinieren und sie laufen in der Reihenfolge, die am nächsten an der Funktion, zum Beispiel:

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

So @func_dbread läuft vor @func_dbruntime.

Alles in allem ist es leicht anpassbar und sehr leistungsfähig und Sie können es erweitern, um Drittanbieter-Dienste zu unterstützen, sowie Code hinzufügen, um diese Zähler dynamisch ein- und auszuschalten, wann immer dies relevant ist. Soweit ich das beurteilen konnte, war die Leistungseinbuße bestenfalls minimal.

Nur eine Nachricht über das Senden von Daten an Orte wie CopperEgg und andere Dienste, verwendet StatsD UDP und seit seiner Statistik können Sie einige Daten verlieren und immer noch aussagekräftige Erkenntnisse erhalten und es wird nichts blockieren. Wenn Sie Daten an Drittanbieter-Sites wie CopperEgg senden möchten, würde ich in Erwägung ziehen, die Daten an eine lokale Warteschlange zu senden und dann mit einem anderen Prozess an CopperEgg zu senden, nur um Drittanbieter-Dienstprobleme von Ihren eigenen zu entkoppeln.

Persönlich, für solche Daten, ist StatsD groß und Graphit gibt Ihnen all die Dinge, die Sie benötigen einschließlich 90. Perzentil, Durchschnitt, Max, Grafikfähigkeiten, etc und im Grunde haben die meisten Zähler Typen, die Sie benötigen.

6

Ich stieß auf diese Bibliothek, die ein Port von CodaHale Metriken für Python ist.

Es gibt einige Dinge fehlen, d. H. Reporter, aber es tut die meisten anderen Dinge.

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

Shameless Stecker, hier ist meine Gabel, die ein Graphit-Reporter gehosteten hinzufügt. Es sollte trivial sein, Reporter anderen Systemen hinzuzufügen.

https://github.com/usmanismail/pyformance

+0

schön, ich werde es sehen, danke! – Ran

+0

Es gibt jetzt ein paar Reporter: https://github.com/omegertel/pyformance/tree/master/pyformance/reporters – Lorrin