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.
schön, ich werde es sehen, danke! – Ran
Es gibt jetzt ein paar Reporter: https://github.com/omegertel/pyformance/tree/master/pyformance/reporters – Lorrin