## Čo s aplikáciou po nasadení?
[Miroslav Biňas](https://bletvaska.github.io)
/ [**UVP Technicom**](https://uvptechnicom.sk/event/co-s-aplikaciou-po-nasadeni/)


notes:
* mozno takto nejako vyzeral pracovny zapal aj vo vasom time este pomerne nedavno (dnes rano?)
* po tyzdnoch tvrdej (timovej) prace ste to nakoniec dali
## Live demo!
notes:
* tadaaaa
## Gratulujem!
notes:
* ale nakoniec ste to dali, takze gratulujem
## Čo ďalej?
aplikácia beží, ale **len** na vašom počítači
## ...a ešte k tomu
* kde a ako hostovať?
* kde a ako ukladať údaje?
* ako to budem aktualizovať? (nbusr style?)
* koľko ma to bude stáť? (denne/ročne)
[](https://www.docker.com/)
notes:
* trendom je dnes robit aplikacie v kontajneroch
* rovno od zaciatku uvazujte presne takto

notes:
* docker je dnes jednym z najpopularnejsich nastrojov developerov. o tom hovori aj posledny prieskum StackOverflow survery 2022
## Čo je to kontajner?
> Kontajner je **izolované prostredie** na **spustenie procesu**.
notes:
* laicky - zip balik s aplikaciou a potrebnymi kniznicami pre spustenie aplikacie
* proces sa spusta pod linuxovym jadrom
## Prečo kontajnery?
* jednotné prostredie pre rozličné prostredia
* rovnaké prostredie pre vývoj aj nasadenie
* podpora naprieč IDE
* škálovanie...



### Problém: Odkiaľ sú moji zákazníci?
(a kedy ku mne chodia?)
## Logovanie
> Logging - one of the secrets to building extremely stable, robust web applications.
## Kde logovať?
* do lokálneho súboru
* náročná analýza - viacero súborov, rozličné formáty
* do vzdialenej db
* aplikácia musí obsahovať konfiguráciu pre pripojenie
* špeciálne systémy ako [Logstash](https://www.elastic.co/logstash/), [Loki](https://grafana.com/oss/loki/), štandardné SQL databázy
### Aplikácia spustená v kontajneri loguje do štandardného výstupu!
### Logovanie v jazyku Python
```python
import logging
# basic config
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(name)-12s %(levelname)-8s: %(message)s'
)
# creating logger
logger = logging.getLogger('supa')
# logging
logger.info('Starting Application')
```
## Agregácia logov
App > [Docker](https://www.docker.com/) > [Fluentd](https://www.fluentd.org/) (plugin) > [[Logstash](https://www.elastic.co/logstash/) | [Loki](https://grafana.com/oss/loki/)]
## Deadlock
```python
while True:
pass
```
## Jednoduchá kontrola
```python
@app.get('/api/healthz')
def check_health():
return {
'status': 'up'
}
```
## Healthcheck a Docker
```dockerfile
HEALTHCHECK \
--interval=5m \
--timeout=3s \
--retries=3 \
--start-period=5s \
CMD curl -f http://localhost/ || exit 1
```
## Metriky
> Metriky poskytujú **pohľad** na **aktuálny stav** vašej aplikácie. Prípadne vieme pomocou metrík zistiť **stav v čase**.

> **Latency** is the **time** it takes to service a request.
### Meranie latencie s middleware
```python
import time
from fastapi import FastAPI, Request
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
```
> **Traffic** is a measure of **how much** demand is being placed on your system, measured in a high-level system-specific metric.

> **Errors** is the **rate of requests that fail**, either explicitly (e.g., HTTP 500s), implicitly (for example, an HTTP 200 success response, but coupled with the wrong content), or by policy (for example, "If you committed to one-second response times, any request over one second is an error").
> **Saturation** describes, **how "full" your service is**.

## Links
* [The four Golden Signals of Kubernetes monitoring](https://sysdig.com/blog/golden-signals-kubernetes/)
* [Microservice Architecture](https://microservices.io/index.html)

(**https://bit.ly/3tAcH9a**)