2013-07-04 18 views
15

Mamy aplikację węzła etsy/statsd, która przepłukuje statystyki do węgla/szeptu co 10 sekund. Jeśli wyślesz 100 przyrosty (impulsy), w ciągu pierwszych 10 sekund, grafit wyświetla je poprawnie, jak:Uzyskiwanie dokładnego grafitu stats_counts

localhost:3000/render?from=-20min&target=stats_counts.test.count&format=json 

[{"target": "stats_counts.test.count", "datapoints": [ 
[0.0, 1372951380], [0.0, 1372951440], ... 
[0.0, 1372952460], [100.0, 1372952520]]}] 

Jednak 10 sekund później, a liczba ta spada do 0, null i albo 33,3. Ostatecznie ustala się na wartości 1/6 początkowej liczby przyrostów, w tym przypadku 16.6.

/opt/graphite/conf/storage-schemas.conf jest:

[sixty_secs_for_1_days_then_15m_for_a_month] 
pattern = .* 
retentions = 10s:10m,1m:1d,15m:30d 

chciałbym uzyskać dokładne liczby, jest grafit uśrednienie danych w ciągu 60 sekund oknach zamiast zsumowanie go może? Korzystanie z funkcji integralną, po jakimś czasie, oczywiście daje:

localhost:3000/render?from=-20min&target=integral(stats_counts.test.count)&format=json 

[{"target": "stats_counts.test.count", "datapoints": [ 
[0.0, 1372951380], [16.6, 1372951440], ... 
[16.6, 1372952460], [16.6, 1372952520]]}] 

Odpowiedz

27

Graphite data storage

Graphite zarządza retencji danych za pomocą kombinacji ustawień zapisanych w pamięci -schemas.conf przechowywania i -aggregation.conf. Widzę, że twoja polityka przechowywania (fragment z twojego magazynu-schemas.conf) mówi grafitowi, by przechował tylko 1 punkt danych dla jego najwyższej rozdzielczości (np. 10s:10m) i że powinien zarządzać agregacją tych punktów danych w miarę starzenia się danych i przechodzi w starsze przedziały (z mniejszą rozdzielczością zdefiniowaną - np. 1m:1d). W twoim przypadku dane przechodzą do następnego okresu przechowywania po 10 minutach, a po 10 minutach dane będą zwijane zgodnie z ustawieniami w pliku storage-aggregation.conf.

Aggregation/Downsampling

Agregacja/downsampling dzieje kiedy ages danych i wpada do przedziału czasowego, który ma mniejszą retencję uchwale określono. W twoim przypadku będziesz przechowywać 1 punkt danych dla każdego 10-sekundowego interwału, ale gdy dane będą zawierały ponad 10 minut starego grafitu, dane będą przechowywane jako 1 punkt danych przez 1 minutę. Oznacza to, że musisz poinformować grafit, w jaki sposób powinien pobrać 10-sekundowe punkty danych (z których masz 6 minut) i zebrać je w 1 punkcie danych przez całą minutę. Czy to powinno być średnie? Czy to suma? W zależności od rodzaju danych (np. Czasu, licznika) może to mieć duże znaczenie, o czym wspomniałeś w swoim wpisie.

Domyślnie grafit będzie uśredniać dane, gdy zostaną zebrane w danych o niższej rozdzielczości. Użycie średniej do przeprowadzenia agregacji ma sens w przypadku zastosowania do danych z timerem (a nawet miernika). Powiedziałeś, że masz do czynienia z licznikami, więc będziesz chciał suma.

Na przykład w przechowywaniu aggregation.conf:

[count] 
pattern = \.count$ 
xFilesFactor = 0 
aggregationMethod = sum 

UI (oraz dane surowe) agregacja/próbkowanie

Ważne jest również, aby zrozumieć, w jaki sposób zagregowany/downsamplingiem dane są reprezentowane podczas przeglądania wykresu lub przeglądania surowych (json) danych dla różnych okresów, ponieważ progi schematu zatrzymywania danych mają bezpośredni wpływ na wykresy. W twoim przypadku wpisujesz render?from=-20min, który przekracza granicę 10s: 10m.

Grafit wyświetli (i przeprowadzi w czasie rzeczywistym próbkowanie w dół) zgodnie z zdefiniowaną precyzją o najniższej rozdzielczości.Innymi słowy, oznacza to, że jeśli wykresujesz dane obejmujące jeden lub więcej przedziałów czasu przechowywania, otrzymasz odpowiednio pakiety zbiorcze. Przykład pomoże (zakładając zachowanie: retencji = 10s: 10m, 1m: 1d, 15m: 30d)

Każdy wykres z danymi nie starszymi niż ostatnie 10 minut będzie wyświetlał 10 sekundowe agregacje. Po przekroczeniu 10-minutowego progu zacznie się wyświetlać wartość minutową zliczonych danych zgodną z zasadami ustawionymi w pliku storage-aggregation.conf.

Podsumowanie/tldr;

Ponieważ jesteś wykresów/zapytań przez 20 minut warto danych (np render?from=-20min) Jesteś zdecydowanie spadających w otoczeniu niższa przechowywania precyzja (tj 10s: 10m, 1m: 1d, 15m: 30d), co oznacza, że agregacja występuje zgodnie z twoją polityką agregacji. Powinieneś potwierdzić, że używasz sum do poprawnego wzorca w pliku storage-aggregation.conf. Dodatkowo można skrócić zakres czasu wykresu/zapytania do mniej niż 10 minut, co pozwoli uniknąć dynamicznego zestawienia.

+0

Podczas oglądania 'renderowania? Od = -10min' działa zgodnie z oczekiwaniami, więc jesteś na miejscu, dzięki. Jednak w 'storage-aggregation.conf' mam te linie do sumowania metryk' .count', więc wydaje się, że dynamiczna/permanentna agregacja przez grafit/węgiel (? Nie jestem całkiem pewien, kto ma stały downsampling) ignoruje to. Wątpię, że to błąd w graficie (v0.9.10), jakakolwiek rada, jak/co może być winne. Zatrzymałem i zrestartowałem plik carbon-cache.py. Czy muszę zrobić to samo dla grafitu, aby zmiany zaczęły obowiązywać? – AJP

+2

Po zmianie ustawień schematu lub agregacji po zapisaniu metryk (w pamięci szepczącej = grafit) musisz usunąć pliki .wsp dla danych (grafit je odtworzy) lub uruchomić whisper-resize.py. Możesz zweryfikować ustawienia, patrząc na dane szeptów, uruchamiając whisper-info.py wobec pliku .wsp. Znajdź plik .wsp dla jednego ze swoich danych w/graphite/storage/whisper/i sprawdź ustawienia. Uruchom: 'whisper-info.py my_metric_data.wsp'. Dane wyjściowe whisper-info.py powinny informować o tym, jak działają ustawienia przechowywania. –

+0

Proszę mi pomóc z http://stackoverflow.com/questions/20433697/graphite-returning-incorrect-datapoint – GJain