Gestione log per applicazioni REST su BTP

Breve post sulla scia dei miei recenti esperimenti sulla costruzione di servizi rest sulla piattaforma SAP BTP usando Python in un container Docker.

Quando si realizzano servize REST con Python, la libreria più usata è Flask. E SAP per ha guarda caso predisposto una libreria di logging per Python con delle funzioni standard per Flask e che si integra nel framework standard "logging". Per usarla è sufficiente importare il pacchetto

sap_cf_logging

Se usiamo un container Docker lo possiamo installare nel Dockerfile con il comando "pip" insieme alle altre librerie Python.

La si importa nel nostro script e la si inizializza passandogli la variabile che contiene la nostra app Flask e il livello di log, all'inizio del nostro script e prima di definire le routes:

import ...
import logging
from sap.cf_logging import flask_logging

app = Flask(__name__)

flask_logging.init(app, logging.INFO)

A questo punto all'interno delle nostre route possiamo recuperare l'istanza del logger, dandogli un nome libero che ci servirà poi per andare a cercare il log.

logger = logging.getLogger('my.logger')

Con questa istanza possiamo finalmente scrivere il log:

logger.info("Ricevuta richiesta")

Possiamo andare nel BTP Cockpit, aprire il subaccount, lo space, l'applicazione e finalmente accedere ai logs.

Ed ecco qui il risultato.

E' possibile leggere i log anche da terminale con questo comando (l'opzione "recent" tira fuori tutti i log recenti, mentre il default mostra solo le ultime registrazioni).

cf logs nomeapplicazione

cf logs nomeapplicazione --recent

Application Logging Service

I semplici log sono molto utili durante gli sviluppi per identificare problemi, ma non sono molto pratici per sorvegliare una applicazione in produzione, che magari gestisce migliaia di richieste al minuto. In queste situazioni la BTP mette a disposizione un servizio fatto apposta, l'Application Logging Service.

Questo servizio può essere usato per leggere i log, ma in realtà raccoglie in autonomia una quantità di informazioni aggiuntive sui nostri servizi, che vanno dalla misura delle latenze e della banda, fino all'occupazione di risorse delle nostre applicazioni, e all'identificazione di errori nelle nostre risposte http.

Si attiva nel proprio subaccount a partire dal Service Marketplace, costa un sacco di soldi (al mese) come qualunque altro servizio SAP e non prevede alcun tipo di free tier, ma se il nostro business dipende da questi servizi REST potrebbe valerne la pena. Naturalmente sull'account trial è gratuito come tutto il resto, quindi possiamo provare a giocarci un pochino.

Una volta creato è sufficiente fare il binding con la nostra applicazione (dall'interfaccia web o deployando di nuovo la nostra app dopo averlo incluso tra i services nel manifest.yaml).

A questo punto il servizio è già pronto per essere consultato. Il link alla dashboard è disponibile nella pagina "logs" della nostra applicazione.

Nel servizio sono già presenti una miriade di dashboard già configurate, dalle quali possiamo andare ad esplorare le nostre applicazioni e ricavarne una miriade di informazioni, dal carico di ram/cpu al numero di richieste al secondo alla presenza di errori. Metto qui sotto qualche esempio di schermata del mio esempio dopo un piccolo stress test, giusto per concludere in bellezza.

Un bel giocattolo, non c'è che dire. Per qualcuno il cui business dipende dall'armonioso funzionamento di questi servizi REST può sicuramente valer la pena farci un pensierino.

Grazie per la lettura e alla prossima!