---
# System prepended metadata

title: "\U0001F40D Pycemaker - Repositório da API para Dashboard"

---

#  🐍 Pycemaker - Repositório da API para Dashboard

A aplicaçao server recebe solicitaçoes através de endpoints, coleta os dados do banco de dados MongoDB, trata-os e retorna-os em JSON ou dispara um e-mail com relatório observando um intervalo de tempo.

# 📦 Repositórios integrantes do projeto

| Repositório                                                                                   | Descrição                   |
| --------------------------------------------------------------------------------------------- | --------------------------- |
| [pycemaker-docs](https://github.com/pycemaker/pycemaker-docs)                                 | Apresentação e documentação |
| [pycemaker-dashboard-client](https://github.com/pycemaker/pycemaker-dashboard-client)         | Front-End Dashboard         |
| [pycemaker-dashboard-api](https://github.com/pycemaker/pycemaker-dashboard-api)               | API para Dashboard          |
| [pycemaker-dashboard-middleware](https://github.com/pycemaker/pycemaker-dashboard-middleware) | ETL e Scheduler             |
| [pycemaker-form-client](https://github.com/pycemaker/pycemaker-form-client)                   | Front-End para Formuário    |
| [pycemaker-form-server](https://github.com/pycemaker/pycemaker-form-server)                   | Api para Formuário          |


# ⚙️ Instruções de Instalação e Uso

<ul>
<li><b>Banco de dados</b></li>
<ul>
<li>Baixe e instale o banco de dados MongoDB:</li>
<a href="https://www.mongodb.com/try/download/community">MongoDB Community 5.0.7</a>
</ul>
</ul>

<ul>
<li><b>Python</b></li>
<ul>
<li>Baixe e instale o ambiente de desenvolvimento Python:</li>
<a href="https://www.python.org/downloads/">Python 3.10.4</a>
</ul>
</ul>

<ul>
<li><b>Dependências</b></li>
<ul>
<li>Abra o terminal na raiz desse repositório e instale as dependências necessárias:
<br/>

```bash
$ pip install -r requirements.txt
```

</li>
</ul>
</ul>

<ul>
<li><b>Criação das Variáveis</b></li>
<ul>
<li>Crie um arquivo <b>.env</b> e configure as variáveis a seguir:
<br/>

```bash
FLASK_APP=run.py:get_flask_app
FLASK_DEBUG=1
FLASK_ENV=development flask run
EMAIL_FROM=email_para_disparo_de_relatorios_e_alertas
PASSWORD=senha_do_email
```

</li>
</ul>
<ul>
<li>Configure um serviço no Firebase, gere uma chave e armazena-a na raiz desse repositório com o nome:  <b>firebase-settings.json</b>.
<br/>


</li>
</ul>
</ul>

<ul>
<li><b>Execute a aplicação</b></li>
<ul>
<li>Abra o terminal na raiz desse repositório e execute o comando:
<br/>

```bash
$ py run.py
```
ou
```bash
$ flask run
```

</li>
</ul>
  
  
</ul>

<ul>
<li><b>Execute a aplicação em ambiente virtual</b></li>
<ul>
<li>Abra o terminal na raiz desse repositório e execute os comandos:
<br/>

```bash
$ pip install virtualenv
$ py -m venv env
$ .\env\Scripts\activate
$ py run.py
```
ou
```bash
$ pip install virtualenv
$ py -m venv env
$ .\env\Scripts\activate
$ flask run
```

</li>
</ul>
  
  
</ul>



# 🗺️ Rotas

* **/cpu/<date_now>/<time_range>** (Implementado)
* **/ram/<date_now>/<time_range>** (Implementado)
* `/disk/<date_now>/<time_range>`
* `/reponse_time/<date_now>/<time_range>`
* `/request_count/<date_now>/<time_range>`
* `/http_fail/<date_now>/<time_range>`
> Rotas *GET* que coletam todos os dados anteriores de consumo (CPU, RAM, Disco, Tempo de Resposta, Contagem de Requisições e Falhas HTTP) em um intervalo de tempo em horas **(time_range, ex: 06)** com base na data e hora recebida **(date_now, ex: 10-04-2022-09-43-23)**.

```sh
Response:
    data: array
        com os dados solicitados
        (na mesma estrutura do banco)
    data_anterior: array
        com dados anteriores ao intervalo solicitado
        (na mesma estrutura do banco)
    mean: float
        com média sobre os dados do intervalo solicitado
    mean_anterior: float
        com média sobre os dados do intervalo anterior ao solicitado
    lower: array
        com todos os menores picos de uso
        (na mesma estrutura do banco)
    higher: array
        com todos os menores picos de uso
        (na mesma estrutura do banco)
    criticity_classification: array
        com a classificação de criticidade dos dados solicitados
        na seguinte estrutura:
            {
                criticity: string
                    classificação,
                value: float
                    valor em porcentagem sobre o total de dados
            }
```

* **/cpu/<date_start>** (Implementado)
* **/ram/<date_start>** (Implementado)
* `/disk/<date_start>`
* `/reponse_time/<date_start>`
* `/http_fail/<date_start>`
> Rotas *GET* que coletam todos os dados de consumo (CPU, RAM, Disco, Tempo de Resposta, Contagem de Requisições e Falhas HTTP) a partir da data recebida **(date_start, ex: 10-04-2022-09-43-23)**.

```sh
Response:
    array
        com os dados solicitados
        (na mesma estrutura do banco)
```

* **/report/<date_now>/<time_range>/<email_to>** (Implementado)
> Rota *GET* que dispara criação de relatório e envio de e-mail para o endereço solicitado **(email_to, ex: roberto@email.com)** com todos os dados anteriores de consumo (CPU, RAM, Disco, Tempo de Resposta, Contagem de Requisições e Falhas HTTP) em um intervalo de tempo em horas **(time_range, ex: 06)** com base na data e hora recebida **(date_now, ex: 10-04-2022-09-43-23)**.

```sh
Response:
    msg: "Relatório enviado com sucesso!"
```

# 📂 Estrutura de arquivos
```
.
|___.env                           # guarda variáveis sensíveis da aplicação
|___.gitignore                     # ignore arquivos e pastas em respositório git
|___firebase-settings.json         # guarda chaves de conexão com o servidor Firebase
|___README.md                      # documentação descritiva
|___run.py                         # inicia servidor Flask
|___requirements.txt               # lista as dependências necessárias
|___app
    |_____init__.py                # cria servidor Flask
    |___routes.py                  # classe representativa das rotas
    |___controller
    |   |___cpu.py                 # classes controladoras das rotas cpu
    |   |___disk.py                # classes controladoras das rotas disk
    |   |___http_fail.py           # classes controladoras das rotas http_fail
    |   |___ram.py                 # classes controladoras das rotas ram
    |   |___report.py              # classe controladora da rota report
    |   |___response_time.py       # classes controladoras das rotas response_time
    |___entities
    |   |___cpu.py                 # classe representativa da collection cpu_usage no banco de dados MongoDB
    |   |___disk.py                # classe representativa da collection disk_usage no banco de dados MongoDB
    |   |___http_fail.py           # classe representativa da collection http_fail no banco de dados MongoDB
    |   |___ram.py                 # classe representativa da collection jvm_memory_usage no banco de dados MongoDB
    |   |___response_time.py       # classe representativa da collection response_time no banco de dados MongoDB
    |___services
        |___image_uploader.py      # objeto para upload de imagens no servidor Firebase
        |___mailer.py              # objeto para disparo de e-mails
        |___monitoramento.py       # objeto para coleta de dados de consumo
        |___plot_generator.py      # funções para geração de gráficos
        |___reporter.py            # objeto para criação do relatório
```