nie jestem świadomy, że coś robi dokładnie to, ale zrobiłem coś napisać jakiś czas temu dla projektu, który robi to poprzez dodanie dekoratorów do odpowiednich funkcji.
stworzyłem zbiór dekoratorów do pomiaru czasu pracy funkcji, czasu dla funkcji dostępu DB pomiarowych itp
Przykładem takiego dekoratora jest taka:
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)
Później go użyć tak:
@func_runtime
def myfunc(a, b, c):
pass
Dodałem też dekoratora dla funkcji odczytanych z DB i funkcji, które piszą do DB więc mogę wykresy, ile czasu SPE kod Oczekiwanie na odczyt danych lub zapis danych, a także # razy zadzwoniłem do operacji "odczytu" i "zapisu".
Więc, w sumie miałem następujące dekoratorów: - @func_runtime - aby mierzyć czas wykonania funkcji - @func_dbread - miejsca na funkcje, które wykonuje czyta. Przyrostuje database.reads counter, a także wysyła dane czasowe do read_timing - @func_dbwrite - to samo co @func_dbread, ale do zapisu - @func dbruntime - służy do mierzenia czasu wykonywania funkcji specyficznych dla DB, jak również # połączeń i łączny czas wszystkich funkcji DB
można łączyć dekoratorów i biegną w kolejności, która jest najbardziej zbliżona do funkcji, na przykład:
@func_dbruntime
@func_dbread
def some_db_read_function(a, b, c,d):
pass
Więc @func_dbread biegnie przed @func_dbruntime.
Podsumowując, można go łatwo dostosować i BARDZO mocny. Można go rozszerzyć, aby obsługiwać usługi innych firm, a także dodawać kod, aby dynamicznie włączać i wyłączać te liczniki, gdy tylko zajdzie taka potrzeba. O ile mogłem powiedzieć, kara za wyniki była w najlepszym razie minimalna.
Wystarczy zawiadomienie o wysyłaniu danych do miejsc takich jak CopperEgg i inne usługi, StatsD używa UDP i od jego statystyk można stracić niektóre dane i nadal uzyskać znaczące spostrzeżenia i nie będzie blokować niczego. Jeśli chcesz wysłać dane do zewnętrznych witryn, takich jak CopperEgg, rozważam przesłanie danych do lokalnej kolejki, a następnie wysłanie ich innym procesem do CopperEgg, aby oddzielić od siebie problemy z usługami innych firm.
Osobiście, dla takich danych, StatsD jest świetny, a grafit zapewnia wszystko, czego potrzebujesz, w tym 90 percentyla, średnie, maks. Zdolności graficzne, itp. I zasadniczo ma większość wymaganych typów liczników.
ładny, będę patrzeć na to, dzięki! – Ran
Jest teraz kilku reporterów: https://github.com/omergertel/pyformance/tree/master/pyformance/reporters – Lorrin