Wyciąganie metryk
Last updated
Last updated
Wszystkie metryki są agregowane w Prometheus, skąd można je wyciągać za pomocą interfejsu REST. Każde źródło metryk ma swoje własne zasady według których są one nazywane. W ogólności metryka ma formę:
PREFIX_NAME{LABEL1="XXX", LABEL2="YYY"}
Moduł prometheus
obsługuje komunikację REST i umożliwia pobieranie aktualnej wartości metryki, z określonego czasu, lub z przedziału czasu. Przyjmuje on pełne nazwy metryk w odpowiednim formacie. Ich budowanie następuje w module dashboard
.
Proces pobierania wartości metryk jest rozdzielony na dwie klasy w module dashboard
:
MetricsExtractor
MetricFetcher
MetricFetcher jest klasą, która na podstawie przekazanych parametrów buduje zapytanie do Prometheusa i wyciąga wartości z odpowiednim typem danych. Dla każdego typu istnieje osobna klasa nadpisująca bazowy PrometheusMetricFetcher. Parametry to:
nazwa
prefix
lista labeli - label obsługuje porównanie dokładne i z regexem
typ zapytania - LASTEST albo RANGE
data startu, stopu i czasu między próbkami (dla typu RANGE)
MetricsExtractor jest klasą, która wybiera metryki, które są do pobrania, buduje parametry do MetricFetcher, wywołuje pobieranie i na końcu przetwarza pobrane metryki. Kroki te zależą stricte od źródła metryk, więc dla każdego z nich istnieje osobna implementacja np. DebeziumMetricsExtractor
Metryki definiujemy w tabeli metric
, która składa się z kolumn:
extractorType (PK) - enum odpowiadający MetricsExtractor, który jest odpowiedzialny za wyciąganie danej metryki
name (PK) - nazwa metryki, zgodnie z tym co jest w Prometheus, ale bez prefixu
context (PK) - dodatkowy podział metryk, potrzebny, gdy nazwy się powtarzają (na tę chwilę dla metryk Debezium)
type - typ metryki (int, long, string etc.) związany z MetricFetcher
description
displayName
graphType
graphWidth
graphHeight
graphOrder - kolejność metryki przy wyświetlaniu
visible - czy graf metryki ma się pokazywać
Dodatkowo w tabeli metric_category
przypisujemy metrykę do kategorii (jednej, lub wielu). Kategorie są używane do łączenia metryk w grupy w których są wyciągane (np. metryki potrzebne do wygenerowania dashboardu są w kategorii DASHBOARD)
Dla metryk Debezium jest też trzecia tabela: metric_supported_database
, w której definiowane jest dla jakiego typu bazy danych dana metryka jest dostępna
Gdy musimy obsłużyc nowy typ danych trzeba dodać kolejną implementację typu XMetricFetcher
Implementujemy parseTimeSeriesEntryValue
która zamienia String w odpowiedni typ danych
Dodajemy nowy wpis do enuma MetricType
i implenetnujemy getType
zwracające ten enum
Gdyby w przyszłości były inne źródła danych (inne niż Prometheus) trzeba nadpisać klasę MetricFetcher i zaimplementować funkcje wyciągające wartości z tego źródła w odpowiedniej formie
getType
zwracające typ metryki, który obsługuje fetcher
fetchLatest
, fetchRange
wyciągające po jednej metryce (jedna lub wiele wartości)
fetchLatestList
, fetchRangeList
wyciągająca wiele metryk (jedna lub wiele wartości) - np. gdy nie podamy wszystkich labeli i Premetheus zwraca nam kilka różnych datasetów
Gdy dodajemy nowe źródło metryk należy nadpisać MetricsExtractor
Dodajemy nową wartość enuma MetricExtractorType
Implementujemy metodę accepts
, która decyduje, czy extractor wspiera dany konektor
Implementujemy metodę getMetricCategories
, która zwraca kategorie dla tego extractora, które mają być zwracane do frontendu do dynamicznego generowania listy kategorii
Implementujemy metodę extract
, która wyciąga wartości metryk dla podanej kategorii i parametrów zapytania (queryType, startDate, stopDate, step). W funkcji musimy:
Pobrać metryki dla danego extractora i kategorii (+ jakieś inne specyficzne kryteria)
Zbudować FetchSetup, który trzeba przekazać do MetricFetchera aby wyciągnąć wartość metryki - w tym miejscu definiujemy prefix (jeśli jakiś jest) i labele specyficzne dla źródła metryk
Opcjonalnie przetwarzanie pobranych metryk np. łączenie dwóch metryk w jakąś inną
Żeby dodać nową metrykę, musimy dodać ją do bazy danych. Skrypt inicjalizujący bazę danych jest w repo GOLDENORE_CDC_DOCKER_COMPOSE -> sql -> data.sql -> znajdujemy sekcję z metrykami i dodajemy/zmieniamy tam SQL