# Monitoring zdarzeń platformowych

## Wymagania <a href="#monitoringzdarzenplatformowych-wymagania" id="monitoringzdarzenplatformowych-wymagania"></a>

* aktywna aplikacja Router2 z EximeeEvents
  * aplikacja dostarczana z platformą Eximee od wersji 2.3167.0
* aktywna aplikacja WebformsRest
  * aplikacja dostarczana z platformą Eximee
* aktywna aplikacja MonitoringLogProcessor
  * aplikacja dostarczana z platformą Eximee 2.3019.0
* aktywna baza przechowująca zdarzenia
  * do działania aplikacji wymagany jest PostgreSQL w wersji >=9.5
* aktywna instancja Kafki
  * polecamy wersję >= 3.4
* aktywna instancja Grafana min 8.X.X
  * przykładowy dashboard monitoringu jest przekazywany z platformą w pliku grafana.json

Uruchomienie funkcjonalności w platformie sterowane jest przez dodanie do zmiennej COMPOSE\_PROFILES wartości "monitoring".

## Założenia działania <a href="#monitoringzdarzenplatformowych-zalozeniadzialania" id="monitoringzdarzenplatformowych-zalozeniadzialania"></a>

Aplikacja Webforms generuje zdarzenia związane ze stanem wniosków.

Możliwe są różne implementacje logowania zdarzeń aktywne w tym samym czasie. Zależy to od konfiguracji oraz wdrożenia.\
EximeeEventsConnector (jedna z możliwych implementacji) zbiera zdarzenia i wysyła je do EximeeEvents.

EximeeEvents zapisuje je na odpowiedni topic Kafki.

MonitoringEventProcessor czyta zdarzenia z kafki, weryfikuje je i zapisuje do bazy danych (PostgreSQL) w sposób możliwy do odczytania przez Grafanę.

Zdarzenia w bazie danych mogą zostać odczytane przez zewnętrzne aplikacje w celu wizualizacji lub analizy.\
Razem z platformą dostarczana będzie konfiguracja Grafany w celu wizualizacji zdarzeń.

<figure><img src="/files/o7vKuQBOVBE4PUvhE6ga" alt=""><figcaption><p><em><strong>Ilustracja 1.</strong> Architektura rozwiązania monitorowania zdarzeń</em></p></figcaption></figure>

## Aplikacja Router2 z EximeeEvents <a href="#monitoringzdarzenplatformowych-aplikacjarouter2zeximeeevents" id="monitoringzdarzenplatformowych-aplikacjarouter2zeximeeevents"></a>

### Przeznaczenie <a href="#monitoringzdarzenplatformowych-przeznaczenie" id="monitoringzdarzenplatformowych-przeznaczenie"></a>

EximeeEvents to plugin do aplikacji Router2.\
Udostępnia on endpoint przyjmujący zdarzenia, które są następnie zapisywane na odpowiednim topicu Kafki.

{% hint style="warning" %}
Topic i grupa wiadomości przekazywanej do kafki muszą być spójne z konfiguracją MonitoringLogProcessora.
{% endhint %}

### Konfiguracja <a href="#monitoringzdarzenplatformowych-konfiguracja" id="monitoringzdarzenplatformowych-konfiguracja"></a>

Konfiguracja oraz więcej informacji tutaj \[Rejestracja zdarzeń procesu]

## Aplikacja MonitoringLogProcessor <a href="#monitoringzdarzenplatformowych-aplikacjamonitoringlogprocessor" id="monitoringzdarzenplatformowych-aplikacjamonitoringlogprocessor"></a>

### Przeznaczenie <a href="#monitoringzdarzenplatformowych-przeznaczenie.1" id="monitoringzdarzenplatformowych-przeznaczenie.1"></a>

Zadaniem aplikacji jest wypełnianie bazy danych (aktualnie tylko PostgreSQL) zdarzeniami platformowymi.

Aplikacja czyta zdarzenia ze źródła (Kafka) i weryfikuje czy jest to zdarzenie systemowe (pochodzące z platformy).\
Następnie zdarzenia systemowe są dostosowywane pod Grafanę i zapisywane do bazy danych.

### Konfiguracja <a href="#monitoringzdarzenplatformowych-konfiguracja.1" id="monitoringzdarzenplatformowych-konfiguracja.1"></a>

| Klucz                                                    | Wymagalność | Przykład                                                     | Opis                                                         |
| -------------------------------------------------------- | ----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Baza danych - docelowe miejsce do przechowywania zdarzeń |             |                                                              |                                                              |
| MONITORING\_LOG\_PROCESSOR\_DATABASE\_DIALECT            | TAK         | org.hibernate.dialect.PostgreSQL95Dialect                    | Dialekt bazy danych przeznaczonej do przechowywania zdarzeń. |
| MONITORING\_LOG\_PROCESSOR\_DATABASE\_URL                | TAK         | jdbc:<postgresql://postgresql01.host:5432/monitoring_events> | Namiar na bazę danych.                                       |
| MONITORING\_LOG\_PROCESSOR\_DATABASE\_USERNAME           | TAK         | db\_user                                                     | Użytkownik z uprawnieniami do zapisu zdarzeń.                |
| MONITORING\_LOG\_PROCESSOR\_DATABASE\_PASSWORD           | TAK         | db\_pass                                                     | Hasło użytkownika dostępowego do bazy danych.                |

#### Kafka <a href="#monitoringzdarzenplatformowych-kafka" id="monitoringzdarzenplatformowych-kafka"></a>

| Źródło danych                            | Wymagalność |                                                   |                                                  |
| ---------------------------------------- | ----------- | ------------------------------------------------- | ------------------------------------------------ |
| MONITORING\_LOG\_PROCESSOR\_KAFKA\_URL   | TAK         | [http://kafka.host:9092](http://kafka.host:9092/) | Namiar na Kafkę                                  |
| MONITORING\_LOG\_PROCESSOR\_KAFKA\_TOPIC | TAK         | all                                               | Topic, na który trafią wiadomości ze zdarzeniami |
| MONITORING\_LOG\_PROCESSOR\_KAFKA\_GROUP | TAK         | eximee-events                                     | Grupa zdarzeń eximee                             |

### Zapisywane zdarzenia <a href="#monitoringzdarzenplatformowych-zapisywanezdarzenia" id="monitoringzdarzenplatformowych-zapisywanezdarzenia"></a>

Zdarzenia muszą być pochodzenia systemowego (origin = SYSTEM).

Typy zdarzeń są modyfikowane na typ biznesowy.\
Typ, który nie posiada odpowiednika w zdarzeniu biznesowym, dostaje pustą wartość.\
Informacja o zamianie typów zdarzeń znajduje się poniżej:

| Zdarzenie systemowe (eximee)                    | Zdarzenie biznesowe  | Opis                                                                          |
| ----------------------------------------------- | -------------------- | ----------------------------------------------------------------------------- |
| FORM\_NEW\_STARTED                              | FORM\_ENTRY          | Wejście na wniosek                                                            |
| <p>FORM\_NEXT\_PAGE<br>FORM\_PREVIOUS\_PAGE</p> | PAGE\_SAVE           | Zapisanie stanu aktualnej strony - przejście na kolejną lub poprzednią stronę |
| FORM\_CLIENT\_PAGE\_CHANGED                     | PAGE\_ENTRY          | Zmiana strony - wejście na inną stronę.                                       |
| FORM\_SAVE                                      | FORM\_SAVE           | Wysłanie wniosku                                                              |
| FORM\_DRAFT\_SAVE                               | FORM\_DRAFT\_SAVE    | Zapisanie roboczej wersji wniosku                                             |
| FORM\_DRAFT\_RESTORE                            | FORM\_DRAFT\_RESTORE | Przywrócenie roboczej wersji wniosku                                          |

### Struktura bazy danych (PostgreSQL) <a href="#monitoringzdarzenplatformowych-strukturabazydanych-postgresql" id="monitoringzdarzenplatformowych-strukturabazydanych-postgresql"></a>

Określona struktura bazy danych ze zdarzeniami biznesowymi.

| Schema         |           |              | monitoring\_events                                                      |
| -------------- | --------- | ------------ | ----------------------------------------------------------------------- |
| **Tabela**     |           |              | **events**                                                              |
| **Nazwa pola** | **Typ**   | **nullable** | **Opis**                                                                |
| id             | bigserial | FALSE        | Kolejne identyfikatory zdarzeń                                          |
| origin         | text      | FALSE        | Pochodzenie zdarzenia (SYSTEM / BUSINESS)                               |
| type           | text      | FALSE        | Typ zdarzenia biznesowego (tabela z typem zdarzeń znajduje się wyżej)   |
| timestamp      | timestamp | FALSE        | Czas wywołania zdarzenia (data i godzina)                               |
| payload        | jsonb     | TRUE         | Dane zdarzenia w postaci JSONa, jeśli zdarzenie posiada dodatkowe dane. |

### Skrypty migracyjne <a href="#monitoringzdarzenplatformowych-skryptymigracyjne" id="monitoringzdarzenplatformowych-skryptymigracyjne"></a>

Skrypty migracyjne do stworzenia i modyfikowania tabeli zapisywane są w archiwum do przekazania razem z platformą.

## Aplikacja Webforms z logowaniem zdarzeń <a href="#monitoringzdarzenplatformowych-aplikacjawebformszlogowaniemzdarzen" id="monitoringzdarzenplatformowych-aplikacjawebformszlogowaniemzdarzen"></a>

### Przeznaczenie <a href="#monitoringzdarzenplatformowych-przeznaczenie.2" id="monitoringzdarzenplatformowych-przeznaczenie.2"></a>

Mechanizm logowania zdarzeń ma za zadanie zbierać zdarzenia związane ze zmianą stanu wniosków z całej platformy.\
Zdarzenia są wysyłane w paczkach do Kafki przy pomocy EximeeEvents.

### Konfiguracja <a href="#monitoringzdarzenplatformowych-konfiguracja.2" id="monitoringzdarzenplatformowych-konfiguracja.2"></a>

W celu aktywowania zbierania zdarzeń, należy odpowiednio ustawić konfigurację *webforms.xml*.\
Poniżej fragment konfiguracji, który odpowiada za aktywny przepływ zbierania zdarzeń.

{% hint style="info" %}
Connector do eximeeEvents jest dostarczany w libie eximee-events
{% endhint %}

```
<?xml version="1.0" encoding="UTF-8" ?>
<webforms>
   ....
   <server>
      ...
      <features>
         ...
         <eventLog>
            <enabled>true</enabled>
            <coreExecutorPoolSize>5</coreExecutorPoolSize>
            <maxExecutorPoolSize>10</maxExecutorPoolSize>
            <eximeeEventsProcessor>
               <enabled>true</enabled>
               <url>http://localhost:9002</url>
            </eximeeEventsProcessor>
         </eventLog>
      </features>
   </server>
</webforms>
```

Oraz tabela przedstawiająca konfigurację instalacyjną.

<table><thead><tr><th width="187">Klucz instalacyjny</th><th>Klucz w konfiguracji</th><th width="187">Przykładowa wartość</th><th>Opis</th></tr></thead><tbody><tr><td>Akywny mechanizm zbierania zdarzeń</td><td></td><td></td><td></td></tr><tr><td><br></td><td>server.features.eventLog.enabled</td><td>true</td><td>Aktywność mechanizmu zbierania zdarzeń</td></tr><tr><td><br></td><td>server.features.eventLog.coreExecutorPoolSize</td><td>5</td><td>Liczba wątków w ramach przetwarzania zdarzeń</td></tr><tr><td><br></td><td>server.features.eventLog.maxExecutorPoolSize</td><td>10</td><td>Maksymalna liczba wątków w ramach przetwarzania zdarzeń</td></tr><tr><td>Aktywny mechanizm logowania zdarzeń</td><td></td><td></td><td></td></tr><tr><td><br></td><td>server.features.eventLog.eximeeEventsProcessor.enabled</td><td>true</td><td>Aktywność mechanizmu EximeeEvents</td></tr><tr><td><br></td><td>server.features.eventLog.eximeeEventsProcessor.url</td><td><a href="http://localhost:9002/">http://localhost:9002</a></td><td>Namiar na aplikację EximeeEvents do zapisywania zdarzeń na kafce</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.eximee.com/eksploatacja-aplikacji/monitorowanie/monitoring-zdarzen-platformowych.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
