Realtime Log Streaming with FastAPI and Server-Sent Events

Antes de começar a leitura do seguinte artigo: Artigo - Leia aqui

Este projeto de exemplo se utiliza da api EventSource A interface EventSource é usada para receber eventos enviados pelo servidor (server-sent events). Ele se conecta via HTTP em um servidor e recebe eventos com o formato text/event-stream.

A conexão permanece aberta até ser fechada chamando EventSource.close(). Assim que a conexão estiver aberta, mensagens recebidas do servidor são entregues para o seu código na forma de eventos message. Ao contrário dos WebSockets, server-sent events são unidirecionais; ou seja, mensagens são entregues em uma direção, do servidor para o cliente (por exemplo, um navegador web). Isso torna-os uma excelente escolha quando não há necessidade de enviar mensagens do cliente para o servidor.

Como executar o exemplo?

Requisitos: poetry instalado.

                  
                      cd SSELoggerDemo
                      poetry shell
                      poetry install
                  
              

Abra um outro terminal, também ative-o com o comando:


                poetry shell
                uvicorn app.main:app --reload --port 8000
            

Se acessar o endereço http://127.0.0.1:8000/docs você verá a documentação das rotas criadas.

  • A rota http://127.0.0.1:8000/stream-logs fica lendo o arquivo de log:

                
                  import psutil
                  import platform
                  from datetime import datetime
                  import time
                  import asyncio
                  import json

                  async def main():
                      # it = 0
                      while True:
                          # cpu_contagem = psutil.cpu_count(logical=False)
                          # cpu_nucleos = psutil.cpu_count(logical=True)
                          # dict_cpu = {"contagem": cpu_contagem, "nucleos": cpu_nucleos,
                          #             "porcentagem": cpu_porcentagem}
                          cpu_porcentagem = psutil.cpu_percent()
                          dict_cpu = {"porcentagem": cpu_porcentagem * 10.}
                          yield {
                              "event": "msg_cpu",
                              "retry": 3000, # tempo de reconexão - 3000 ms
                              "data": json.dumps(dict_cpu),
                          }
                          await asyncio.sleep(0.5)

                
            

Exemplo 02

Texto do Exemplo 02

Exemplo 03

Texto do Exemplo 02