2012-12-31 28 views
10

Szukam biblioteki danych wydajności w Pythonie.Czy istnieje wersja python dla biblioteki metryk opartej na JVM

Jestem zaznajomiony z metrics przez Coda Hale, który jest napisany dla JVM i dlatego zastanawiam się, czy istnieje odpowiednik pytona (i który nie wykorzystuje JVM).

W skrócie, wykaz wymagań z narzędzia byłoby:

  • Hrabia inny rodzaj danych w czasie wykonywania. Liczniki, mierniki, liczniki, timery, histogramy itp. Istnieje niezła lista here
  • Umożliwiają łatwy dostęp do danych środowiska wykonawczego za pośrednictwem interfejsu API HTTP. (Mogę sam owijać warstwę HTTP, ale jeśli jest już upieczony to jest plus)
  • Wtyczki do grafitu w szczególności lub innych. CopperEgg byłoby miłe. Lub NewRelic.
  • Pieczone w obsłudze oprzyrządowania dla popularnych bibliotek, takich jak memcached.

Do tej pory znalazłem PyCounters, który wykonuje niektóre zadania, ale nie wszystkie. Ten rodzaj satysfakcji spełnia mój pierwszy punkt (ale nie ma wszystkich rodzajów danych, tylko trzy) i to wszystko.

Czy istnieje lepsza alternatywa dla PyCounterów?

Dzięki

Odpowiedz

3

nie miałem okazji go wypróbować, ale natknąłem się na ten jeden kilka dni temu: https://github.com/Cue/scales

wagi - metryki dla Pythona Tory stan serwera i statystyki, dzięki czemu można zobaczyć co robi twój serwer. Może również wysyłać dane do Graphite na wykresy lub do pliku do analizy kryminalistycznej.

Skala inspirowana jest fantastyczną biblioteką metryk, choć w żadnym wypadku nie jest portem.

3

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.

6

Natknąłem się na tę bibliotekę, która jest portem danych CodaHale dla Pythona.

Brakuje niektórych rzeczy, np. Reporterów, ale robi się większość innych rzeczy.

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

wtyczka Shameless, tu jest mój widelec który dodaje gospodarzem grafitowy reporter. Dodawanie reporterów do innych systemów powinno być trywialne.

https://github.com/usmanismail/pyformance

+0

ładny, będę patrzeć na to, dzięki! – Ran

+0

Jest teraz kilku reporterów: https://github.com/omergertel/pyformance/tree/master/pyformance/reporters – Lorrin