Wyciąganie metryk

Metryki

Wszystkie metryki są agregowane w Prometheus, skąd można je wyciągać za pomocą interfejsu REST. https://prometheus.io/docs/prometheus/latest/querying/basics/ 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.

Wyciąganie metryk

Proces pobierania wartości metryk jest rozdzielony na dwie klasy w module dashboard:

  • MetricsExtractor

  • MetricFetcher

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

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

Zapisywanie metryk do pobrania

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

Dodawanie nowego MetricFetchera

Gdy musimy obsłużyc nowy typ danych trzeba dodać kolejną implementację typu XMetricFetcher

  1. Implementujemy parseTimeSeriesEntryValue która zamienia String w odpowiedni typ danych

  2. 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

  1. getType zwracające typ metryki, który obsługuje fetcher

  2. fetchLatest, fetchRange wyciągające po jednej metryce (jedna lub wiele wartości)

  3. 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

Dodawanie nowego MetricsExtractora

Gdy dodajemy nowe źródło metryk należy nadpisać MetricsExtractor

  1. Dodajemy nową wartość enuma MetricExtractorType

  2. Implementujemy metodę accepts, która decyduje, czy extractor wspiera dany konektor

  3. Implementujemy metodę getMetricCategories, która zwraca kategorie dla tego extractora, które mają być zwracane do frontendu do dynamicznego generowania listy kategorii

  4. Implementujemy metodę extract, która wyciąga wartości metryk dla podanej kategorii i parametrów zapytania (queryType, startDate, stopDate, step). W funkcji musimy:

    1. Pobrać metryki dla danego extractora i kategorii (+ jakieś inne specyficzne kryteria)

    2. 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

    3. Opcjonalnie przetwarzanie pobranych metryk np. łączenie dwóch metryk w jakąś inną

Dodawanie nowych/ modyfikacja metryk

Ż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

Last updated