Skip to content

Gestão de tarefas, logs, alertas e mais

Até o momento, focamos na construção de nossa automação e execução através do orquestrador BotCity Maestro.

A execução através do BotCity Maestro nos dá benefícios como:

  • Disparo de tarefas pelo time de operação
  • Acompanhamento de execução
  • Execução paralela de tarefas através de múltiplos Runners
  • Gestão de tarefas
  • Acompanhamento de logs, alertas e erros
  • Gerenciamento de arquivos de resultados
  • Gerenciamento de credenciais
  • e muito mais

Você pode conferir todas as funcionalidades do BotCity Maestro em nossa documentação.

BotCity Maestro SDK

Todas as funcionalidades disponíveis no portal do BotCity Maestro também estão disponíveis via API.

A BotCity também oferece SDKs específicos para linguagens como Python, Java, Javascript e Typescript.

Nesta etapa do nosso tutorial vamos focar na utilização do BotCity Maestro SDK.

Integração com BotCity Maestro

Todos os projetos criados com o template da BotCity possuem uma instância do BotCity Maestro SDK já disponível em nossa classe Bot que pode ser acessada via self.maestro.

Outro ponto importante a ser ressaltado é que quando executamos nossa automação via BotCity Runner, a instância do BotCity Maestro estará automaticamente autenticada e pronta para uso juntamente com o parâmetro execution do método action.

...

class Bot(DesktopBot):
    def action(self, execution=None):
        # Uncomment to silence Maestro errors when disconnected
        # if self.maestro:
        #     self.maestro.RAISE_NOT_CONNECTED = False

        # Fetch the Activity ID from the task:
        # task = self.maestro.get_task(execution.task_id)
        # activity_id = task.activity_id

        # Opens the BotCity website.
        self.browse("http://www.botcity.dev")

        # Uncomment to mark this task as finished on BotMaestro
...

Atenção

Quando rodamos o código localmente, o parâmetro execution será None e a instância do BotCity Maestro também.

Podemos facilmente tratar isso em nosso código com um condicional ou silenciar os erros com:

if self.maestro:
    self.maestro.RAISE_NOT_CONNECTED = False

Para simplificar nosso código, vamos assumir que todas execuções serão feitas via BotCity Maestro e Runner

Gestão de tarefas

Como vimos na etapa anterior, nós somos responsáveis por indicar o estado em que a tarefa foi finalizada em nossa lógica.

Para finalizar uma tarefa podemos utilizar o método finish_task do BotCity Maestro SDK.

Vamos alterar nosso código para que ao final do processo o BotCity Maestro seja notificado do sucesso de nossa tarefa.

Para isso adicione o seguinte bloco de código ao final do método action em seu robô:

    self.maestro.finish_task(
        task_id=execution.task_id,
        status=AutomationTaskFinishStatus.SUCCESS,
        message="Tarefa BotYoutube finalizada com sucesso"
    )

Note que pegamos o parâmetro task_id através do execution.

Dica

Você pode finalizar a tarefa com os seguintes estados:

  • SUCCESS: Sucesso, tudo ocorreu conforme o esperado
  • FAILED: Falha, algum erro ocorreu e o robô não conseguiu executar a tarefa
  • PARTIALLY_COMPLETED: Sucesso parcial, parte da tarefa foi executada com sucesso. Como um exemplo, pense em um robô que processa entradas em uma planilha porém apenas uma parte dos dados é processado com sucesso.

Após execução, os detalhes da tarefa exibirão os dados informados na finalização da tarefa.

Finish Task

Emitindo Alertas

Quando temos diversas automações sendo executadas ao mesmo tempo, é muito dificil de acompanhar toda a operação de forma rápida. Alertas são utilizados para obtermos notificações que descrevem algum aspecto de um automação.

Os tipos possíveis de alerta são:

  • ⬜ INFO mensagens informativas exibidas em cinza.
  • 🟨 WARNING mensagens de advertência exibidas em amarelo.
  • 🟥 ERROR mensagens de erro exibidas em vermelho.

Alertas

Para criarmos um alerta podemos utilizar o método alert do BotCity Maestro SDK.

Vamos alterar nosso código para que ao início do processo o BotCity Maestro seja notificado que nossa tarefa está começando

Para isso adicione o seguinte bloco de código ao inicio do método action em seu robô:

    self.maestro.alert(
        task_id=execution.task_id,
        title="BotYoutube - Inicio",
        message="Estamos iniciando o processo",
        alert_type=AlertType.INFO
    )

Quando executarmos nossa tarefa, vamos poder observar que um novo alerta foi gerado na tela de Alertas.

Alert Resultado

Logs de execução

O BotCity Maestro permite a criação de logs customizados para armazenamento de informações relacionadas a sua automação.

Logs Logs

Você pode definir todas as colunas e inserir registros via API ou utilizando o BotCity Maestro SDK.

Criando um log

Através do BotCity Maestro podemos criar logs utilizando a funcionalidade Log de Execução no menu esquerdo.

Clicando em Novo Log, uma nova tela é exibida onde devemos preencher os seguintes campos:

Novo Log

  • Label: Identificador único deste log que utilizaremos para interfacear com o log via API ou SDK.
  • Colunas: lista de colunas para nossas informações.
    • Nome: nome a ser exibido para usuários.
    • Label: identificador único para esta coluna neste log que utilizaremos para interfacera com a entrada de log via API ou SDK.
    • width: largura sugerida para esta coluna quando exibindo o log para usuários.

Para nosso tutorial, vamos criar o log com label EstatisticasYoutube e as seguintes colunas:

Nome Label width
Data/Hora data_hora 300
Canal canal 300
Inscritos inscritos 200
Visualizacoes visualizacoes 200

Após o preenchimento, nossa tela ficará da seguinte forma:

Novo Log Preenchido

Clique em Salvar e nosso novo log será gerado.

Criando novos registros de log

Agora que temos nosso log criado, vamos alterar nosso código para que novos registros de log sejam gerados.

Para o campo Data/Hora, vamos adicionar um novo import no topo do nosso arquivo para o pacote datetime.

import datetime

...

Em seguida, vamos alterar nosso código para não somente exibir os valores mas também salvá-los em uma variavel para que seja enviado.

import datetime

from botcity.core import DesktopBot
from botcity.maestro import *


class Bot(DesktopBot):
    def action(self, execution=None):
        ...

        # Opens the BotCity website.
        self.browse("https://www.youtube.com/c/pythonbrasiloficial")

        if not self.find( "sobre", matching=0.97, waiting_time=10000):
            self.not_found("sobre")
        self.click()

        if not self.find( "inscritos", matching=0.97, waiting_time=10000):
            self.not_found("inscritos")
        self.double_click_relative(-39, 7)
        self.control_c()
        inscritos = self.get_clipboard()
        print(f"Inscritos => {inscritos}")

        if not self.find( "visualizacoes", matching=0.97, waiting_time=10000):
            self.not_found("visualizacoes")
        self.double_click_relative(-28, 5)
        self.control_c()
        visualizacoes = self.get_clipboard()
        print(f"Visualizações => {visualizacoes}")

        ...

Após as alterações acima, vamos agora adicionar o código para o registro de novas entradas de log.

Para isso vamos utilizar o método new_log_entry do BotCity Maestro SDK.

    self.maestro.new_log_entry(
        activity_label="EstatisticasYoutube",
        values = {
            "data_hora": datetime.datetime.now().strftime("%Y-%m-%d_%H-%M"),
            "canal": "pythonbrasiloficial",
            "inscritos": inscritos,
            "visualizacoes": visualizacoes
        }
    )

Quando executarmos nossa tarefa, vamos poder observar que um novo alerta foi gerado na tela de entradas de log.

Log Resultado