Pular para conteúdo

Criação de Painéis - Consumidor de Alerta

Objetivos

O objetivo deste tutorial, é criar um Consumidor de Alertas, este Consumidor gera um alerta sempre que é encontrada determinada situação que o usuário deseja monitorar.

Índice

O que é um Consumidor de Alerta?

Um alerta é, essencialmente, uma pergunta automatizada, agendada para ser executada pelo sistema Geoprocess em intervalos regulares, como diariamente, semanalmente ou mensalmente.

Com os alertas, o usuário pode configurar uma pergunta, como “quantas pessoas em idade escolar não estão matriculadas?”, e deixar que o sistema a execute automaticamente. Sempre que a resposta da pergunta retornar dados relevantes (não vazia), o GeoProcess gerará uma indicação de alerta. Dessa forma, o usuário será notificado apenas quando houver algo significativo a ser consultado, eliminando a necessidade de interações manuais recorrentes.

Preparando o ambiente

Iremos utilizar o módulo pgst-consumer-basic como base para o nosso projeto.

Atenção: Para que que a aplicação funcione, todos arquivos devem estar na pasta geoprocess, criada no primeiro tutorial!

Primeiramente, copie o projeto pgst-consumer-basic para um novo projeto chamado consumer-ibge-alerta, utilizando o comando abaixo:

cp -r pgst-consumer-basic consumer-ibge-alerta

Abra um terminal na pasta consumer-ibge-alerta, copie o arquivo de configuração do ambiente:

cp env_sample.conf env.conf

Abra o arquivo env.conf e atualize o nome do consumidor (propriedade CONSUMER_CODE) para o nome tutorial2.

Instale o ambiente virtual para isolar as dependências do Python. Utilize o comando abaixo:

python3 -m venv venv

Ative o ambiente virtual no seu computador utilizando o comando abaixo:

source venv/bin/activate

Instale as dependências do projeto.

pip3 install -r requirements.txt

Instale as dependências do projeto pgst-lib dentro do projeto consumidor.

pip3 install -e ../pgst-lib/ 

Atenção: Antes de executar o próximo passo, se o dc_portal estiver executando no docker pare a sua execução.

Para executar a aplicação, utilize a linha de comando abaixo:

python3 main.py CONTRACT_TEST 001

Usando esse modo a resposta pode ser acessada depois de rodar o teste de contrato no arquivo answer.json na pasta answer.

Abra o resultado da aplicação através da URL: http://127.0.0.1:8000/.

A seguinte tela deverá ser exibida:

alt text

Criando um Consumidor de Alerta do IBGE

Neste tutorial, iremos utilizar a mesma base de dados do tutorial anterior. Sobre essa base de dados, um alerta será emitido quando se observar que o IDH de qualquer um dos estados do Brasil for menor que um IDH desejado limiar_idh.

Para isso, crie uma pasta data em consumer-ibge-alerta, iremos inserir o arquivo CSV disponível na pasta docs deste tutorial nela.

O alerta é criado através de uma pergunta no portal GeoProcess, no arquivo questions.json, insira o seguinte conteúdo:

{
    "themes": [
        {
            "consumer_theme_id": "TT2",
            "version": "1.0.0",
            "title": "Tema Único Alerta",
            "role_tag": "TT2",
            "consumer_project_id": "TUTORIAL"
        }
    ],
    "questions": [
        {
            "consumer_question_id": "Q1",
            "version": "1.0.0",
            "consumer_theme_id": "TT2",
            "title": "Análise do IDH dos estados do Brasil",
            "description": "Quais os estados do Brasil com IDH menor que um determinado limiar?",
            "role_tag": "QT2",
            "alert": true,
            "consumer_sources": [
                "Dados Artificiais"
            ],
            "config_items": [
                {
                    "id": "limiar_idh",
                    "label": "Informe o valor do limiar do IDH",
                    "placeholder": "_____",
                    "type": "text",
                    "maxlength": "4",
                    "required": true
                }
            ]
        }
    ]
}

Agora que a pergunta está inserida, é necessário configurar a resposta, acesse tests/contract/001/answerRequest.json insira o trecho:

{
    "header": {
        "type": "answer_request",
        "status": "OK",
        "next_consumer": null
    },
    "content": {
        "user_info": {
            "user": "dev",
            "name": "Developer",
            "email": "dev@ufla.br",
            "ip": "127.0.0.1"
        },
        "consumer_question_id": "Q1",
        "answer_request_id": 11,
        "data": {
             "limiar_idh": "0.700"
        }
    }
}

Acesse consumer/basicworker.py e substitua todo o código pelo seguinte trecho:

import logging
import pandas as pd
from baseconsumer.worker import Worker
from baseconsumer.worker import process
from util.answer import Answer
from util.answer import Message

class BasicWorker(Worker):
    """Modelagem da classe BasicWorker que herda da classe Worker.
    Esta classe contém o esqueleto básico de um consumidor genérico
    que deve ser adaptado para um propósito específico.
    """

    logger = logging.getLogger(__name__)

    messages = {
                "001": Message("001", "Consumidor IBGE Alerta", "Exemplo IBGE Alerta"),
                }

    def getVersion(self):
        """Retorna a versão do consumidor.

        Returns:
            (str): Versão do consumidor
        """
        return "1.0"

    def getName(self):
        """Retorna o nome do consumidor.

        Returns:
            (str): Nome do consumidor
        """
        return "Consumidor IBGE Alerta"

Essa é a parte inicial da criação de um consumer, ainda não é possível visualizar, uma vez que não criamos nenhum gráfico. Dentro de BasicWorker iremos inserir os processos que retornarão gráficos para o portal, no início da classe, podemos definir uma mensagem a ser exibida ao abrir o consumer. No fim do código adicionamos a mensagem ao consumer e retornamos ela ao portal.

Agora, é necessário configurar um alerta. Em consumer, acesse o arquivo basicworker.py e inclua no final o conteúdo abaixo:

    @process(name="Answer 1", questionId="Q1")
    def process1(self, answer_request):

        self.logger.info("Processando a primeira pergunta")
        answer = Answer()
        limiar_idh = float(answer_request.getPropertie("limiar_idh"))

        path = "./data/dados.csv"
        df = pd.read_csv(path)

        # filtra os estados cujo IDH seja menor que o limiar
        filtro = df["IDH"] < limiar_idh

        estados_alerta = df.loc[filtro, "Estado"].tolist()

        # define se precisa emitir alerta
        emitir_alerta = len(estados_alerta) > 0

        # se precisar emitir alerta, define a mensagem de alerta
        if emitir_alerta:
            answer.setAlert(f"Estados com IDH baixo: {estados_alerta}", True, None, 100)

        self.logger.info("Término da primeira pergunta")

        return answer

A linha a seguir acessa o answerRequest.json e busca o valor passado como parâmetro.

limiar_idh = float(answer_request.getPropertie("limiar_idh"))

Definimos o alerta como False inicialmente, em seguida, fazemos uma verificação na fonte de dados a fim de detectar algum estado que não obedece ao parâmetro passado, ao encontrar um estado que não obedece, ele é inserido numa lista e o alerta passa a ser True, por conseguinte, o alerta passa a ser exibido no Consumidor.

Antes de executar é necessário instalar a biblioteca pands, no terminal digite:

python3 -m pip install pandas

Em seguida, atualize o arquivo requirements.txt com a biblioteca do pandas e a versão instalada.

Execute o programa para visualizar a alteração:

python3 main.py CONTRACT_TEST 001

Abra a aplicação através da URL: http://127.0.0.1:8000/.

A seguinte tela deverá ser exibida:

alt text

A função answer.setAlert() possui os seguintes parâmetros:

def setAlert(self, message, triggered=True, date=None, level=0)
  • message mensagem a ser exibida quando o alerta está ativo.
  • triggered define se o alerta está ativo ou não.
  • date: data na qual o alerta foi acionado, por padrão, a data é do dia em que é ativado.
  • level: valor que varia de 0 a 100 e define a gravidade do alerta. Em que 0 representa pouco grave e 100 é muito grave.

Por fim, iremos executar o consumidor integrado ao portal:

python3 main.py RUN

Atenção: O docker deve estar em execução para executar em produção!

Acesse a URL http://127.0.0.1:8000/.

Pronto, agora você é capaz de definir seus próprios alertas!