Questa pagina illustra le nozioni di base sull'emissione di log per creare indicatori di livello del servizio (SLI) di disponibilità e latenza. Fornisce inoltre esempi di implementazione di come definire gli SLO utilizzando le metriche basate su log.
L'utilizzo di elementi di dati nelle voci di log per creare indicatori del livello del servizio è un modo per sfruttare i payload di log esistenti. In caso contrario, potrebbe essere possibile aggiungere la registrazione a un servizio esistente, il che potrebbe essere più semplice rispetto alla creazione di una strumentazione delle metriche.
Log e metriche
I log raccolgono record chiamati voci di log che descrivono eventi specifici che si verificano nei sistemi informatici. I log vengono scritti dal codice, dai servizi della piattaforma su cui viene eseguito il codice (ad esempio Dataflow) e dall'infrastruttura da cui dipende la piattaforma (ad esempio le istanze Compute Engine).
Poiché i log nei sistemi moderni derivano da file di testo scritti su disco (e a volte lo sono ancora), una voce di log è analoga a una riga in un file di log e può essere considerata l'unità quantistica di logging.
Una voce di log è costituita almeno da due elementi:
- Un timestamp che indica quando si è verificato l'evento o quando è stato inserito nel sistema di logging
- Il payload di testo, sotto forma di dati di testo non strutturati o dati strutturati, più comunemente in formato JSON.
I log possono anche contenere metadati associati, soprattutto quando vengono importati in Cloud Logging. Questi metadati potrebbero includere la risorsa che scrive il log, il nome del log e una gravità per ogni voce.
Log
I log vengono utilizzati per due scopi principali:
- I log Evento descrivono eventi specifici che si verificano all'interno del sistema. Puoi utilizzare i log eventi per generare messaggi che assicurano agli utenti che tutto funziona correttamente ("task succeeded") o per fornire informazioni in caso di errori ("received exception from server").
- I log Transaction descrivono i dettagli di ogni transazione elaborata da un sistema o un componente. Ad esempio, un bilanciatore del carico registra ogni richiesta che riceve, indipendentemente dal fatto che la richiesta venga completata correttamente o meno, e registra informazioni aggiuntive come l'URL richiesto, il codice di risposta HTTP e possibilmente informazioni come il backend utilizzato per gestire la richiesta.
Metriche
A differenza dei log, le metriche di solito non descrivono eventi specifici. Più comunemente, le metriche vengono utilizzate per rappresentare lo stato o l'integrità di un sistema nel tempo. Una metrica è costituita da una serie di punti dati che misurano un aspetto del tuo sistema; ogni punto dati include un timestamp e un valore numerico.
Le metriche possono anche avere metadati associati; la serie di punti dati, denominata serie temporale, potrebbe includere informazioni come il nome della metrica, una descrizione e spesso etichette che specificano la risorsa che scrive i dati. Per informazioni sul modello di metrica di Monitoring, consulta Metriche, serie temporali e risorse.
Metriche basate su log
Le metriche basate su log sono metriche create a partire dalle voci di log estraendo informazioni dalle voci di log e trasformandole in dati delle serie temporali. Cloud Logging fornisce meccanismi per creare due tipi di metriche dalle voci di log:
Metriche contatore, che contano il numero di voci di log corrispondenti a un determinato filtro. Puoi utilizzare una metrica di conteggio per determinare, ad esempio, il numero di richieste o errori registrati nel log.
Metriche di distribuzione, che utilizzano espressioni regolari per analizzare il payload in ogni voce di log per estrarre valori numerici come distribuzione.
Per ulteriori informazioni sulle metriche basate su log in Cloud Logging, consulta Utilizzo delle metriche basate su log.
Utilizzo delle metriche basate su log come SLI
Le metriche basate sui log consentono di estrarre i dati dai log in un formato che puoi utilizzare per creare indicatori SLI in Monitoring:
Puoi utilizzare le metriche di conteggio basate su log per esprimere un SLI di disponibilità basato sulle richieste.
Puoi utilizzare una metrica di distribuzione basata sui log per esprimere un SLI di latenza basato sulle richieste.
Voci di log di esempio
L'applicazione Stack Doctor è un esempio di servizio strumentato
per emettere messaggi di log che contengono informazioni su tutte le richieste, gli errori
e la latenza del servizio. Il codice per il servizio è disponibile
nel
repository GitHub stack-doctor
.
Il servizio genera voci di log di Cloud Logging nel log projects/stack-doctor/logs/bunyan_log
. La voce di log per ogni tipo di
evento include un valore message
diverso. Le voci di log per i diversi
tipi di eventi sono simili alle seguenti:
Per ogni richiesta:
{ "insertId": "..........iTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "pid": 81846, "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "hostname": "<hostname>", "level": 30, "message": "request made", "v": 0, "name": "sli-log" }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.263999938Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.003471183Z" }
Per le richieste riuscite:
{ "insertId": "..........qTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "name": "sli-log", "v": 0, "pid": 81846, "level": 30, "hostname": "<hostname>", "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "message": "success!" }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.874000072Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.201547371Z" }
Per le richieste completate:
{ "insertId": "..........mTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)", "level": 30, "name": "sli-log", "message": "slept for 606 ms", "hostname": "<hostname>", "pid": 81846, "v": 0 }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:49.874000072Z", "severity": "INFO", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:50.201547371Z" }
In caso di errore:
{ "insertId": "..........DTRVT5MOK2VOsVe31bzrTD", "jsonPayload": { "hostname": "<hostname>", "level": 50, "pid": 81846, "message": "failure!", "name": "sli-log", "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)", "v": 0 }, "resource": { "type": "global", "labels": { "project_id": "stack-doctor" } }, "timestamp": "2020-09-01T03:30:44.414999961Z", "severity": "ERROR", "logName": "projects/stack-doctor/logs/bunyan_log", "receiveTimestamp": "2020-09-01T03:30:46.182157077Z" }
In base a queste voci, puoi creare metriche basate su log che conteggiano tutte le richieste, gli errori e monitorano la latenza delle richieste. Puoi quindi utilizzare le metriche basate su log per creare indicatori SLI di disponibilità e latenza.
Creazione di metriche basate su log per gli SLI.
Prima di poter creare SLI sulle metriche basate su log, devi creare le metriche basate su log.
- Per gli SLI di disponibilità relativi ai conteggi di richieste ed errori, utilizza metriche di conteggio basate su log.
- Per gli SLI di latenza, utilizza le metriche di distribuzione basate su log.
Dopo aver creato le metriche basate su log, puoi trovarle
in Monitoring cercandole inMetrics Explorerhe. In Monitoring, le metriche basate su log
hanno il prefisso logging.googleapis.com/user
.
Metriche per gli SLI di disponibilità
Esprimi un indicatore SLI di disponibilità basato sulle richieste nell'API Cloud Monitoring utilizzando la struttura TimeSeriesRatio
per impostare un rapporto tra le richieste "buone" o "errate" e le richieste totali. Questo rapporto viene utilizzato nel
campo goodTotalRatio
di una struttura RequestBasedSli
.
Devi creare metriche dei contatori basate su log che possono essere utilizzate per costruire questo rapporto. Devi creare almeno due dei seguenti elementi:
Una metrica che conteggia gli eventi totali; utilizza questa metrica nel rapporto
totalServiceFilter
.Per l'esempio "stack-doctor", puoi creare una metrica basata su log che conteggia le voci di log in cui viene visualizzata la stringa di messaggio "request made".
Una metrica che conteggia gli eventi "negativi". Utilizza questa metrica nel rapporto
badServiceFilter
.Per l'esempio "stack-doctor", puoi creare una metrica basata su log che conteggia le voci di log in cui viene visualizzata la stringa di messaggio "failure!".
Una metrica che conteggia gli eventi "buoni". Utilizza questa metrica nel rapporto
goodServiceFilter
.Per l'esempio di "stack-doctor", puoi creare una metrica basata su log che conta le voci di log in cui viene visualizzata la stringa di messaggio "successo".
L'SLI descritto per questo esempio si basa su una metrica per le richieste totali
denominata log_based_total_requests
e su una metrica per gli errori denominata
log_based_errors
.
Puoi creare metriche basate su log utilizzando la console Google Cloud , l'API Cloud Logging o Google Cloud CLI. Per creare metriche dei contatori basate su log utilizzando la console Google Cloud , puoi utilizzare la seguente procedura:
-
Nella console Google Cloud , vai alla pagina Metriche basate su log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.
La pagina delle metriche basate su log mostra una tabella delle metriche definite dall'utente e una tabella delle metriche definite dal sistema.
Fai clic su Crea metrica, sopra la tabella delle metriche definite dall'utente.
Nel riquadro Tipo di metrica, seleziona Contatore.
Nel riquadro Dettagli, assegna un nome alla nuova metrica. Per l'esempio "stack-doctor", inserisci
log_based_total_requests
olog_based_errors
.Puoi ignorare gli altri campi per questo esempio.
Nel riquadro Selezione filtro, crea una query che recuperi solo le voci di log che vuoi conteggiare nella metrica.
Per l'esempio "stack-doctor", la query per
log_based_total_requests
potrebbe includere quanto segue:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="request made"
La query per
logs_based_errors
modifica la stringa del messaggio:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="failure!"
Fai clic su Visualizza l'anteprima dei log per controllare il filtro e modificalo se necessario.
Per questo esempio, ignora il riquadro Etichette.
Fai clic su Crea metrica per completare la procedura.
Per saperne di più sulla creazione di metriche contatore basate su log, consulta la sezione Creazione di una metrica contatore.
Metriche per gli SLI di latenza
Esprimi un indicatore SLI di latenza basato sulle richieste nell'API Cloud Monitoring utilizzando una struttura DistributionCut
, che viene utilizzata nel campo distributionCut
di una struttura RequestBasedSli
.
Per creare un SLI di latenza, devi creare una metrica di distribuzione basata su log.
Questo esempio crea una metrica di distribuzione basata su log denominata log_based_latency.
Puoi creare metriche basate su log utilizzando la console Google Cloud , l'API Cloud Logging o Google Cloud CLI. Per creare metriche di distribuzione basate su log utilizzando la console Google Cloud , puoi utilizzare la seguente procedura:
-
Nella console Google Cloud , vai alla pagina Metriche basate su log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.
La pagina delle metriche basate su log mostra una tabella delle metriche definite dall'utente e una tabella delle metriche definite dal sistema.
Fai clic su Crea metrica, sopra la tabella delle metriche definite dall'utente.
Nel riquadro Tipo di metrica, seleziona Distribuzione.
Nel riquadro Dettagli, assegna un nome alla nuova metrica. Per l'esempio "stack-doctor", inserisci
log_based_latency
.Puoi ignorare gli altri campi per questo esempio.
Nel riquadro Selezione filtro, crea una query che recuperi solo le voci di log che vuoi conteggiare nella metrica.
Per l'esempio "stack-doctor", la query per
log_based_latency
potrebbe includere quanto segue:resource.type="global" logName="projects/stack-doctor/logs/bunyan_log" jsonPayload.message="slept for"
Specifica i seguenti campi per la query di filtro:
- Nome campo:
json.message
Espressione regolare:
\s(\d*)\s
La stringa del messaggio per le richieste completate ha il formato "sleep for n ms". L'espressione regolare estrae il valore di latenza n dalla stringa.
- Nome campo:
Per questo esempio, ignora il riquadro Etichette.
Fai clic su Crea metrica per completare la procedura.
Per saperne di più sulla creazione di metriche di distribuzione basate su log, consulta Creazione di metriche di distribuzione.
SLI di disponibilità
In Cloud Monitoring, esprimi un SLI di disponibilità basato sulle richieste utilizzando una struttura TimeSeriesRatio
. L'esempio
seguente mostra un SLO che utilizza le metriche log_based_total_requests
e
log_based_errors
nel rapporto. Questo SLO prevede che il rapporto tra richieste "valide" e totali sia almeno del 98% in un periodo mobile di 24 ore:
{
"serviceLevelIndicator": {
"requestBased": {
"goodTotalRatio": {
"totalServiceFilter":
"metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
resource.type=\"global\"",
"badServiceFilter":
"metric.type=\"logging.googleapis.com/user/log_based_errors\"
resource.type=\"global\""
}
}
},
"goal": 0.98,
"rollingPeriod": "86400s",
"displayName": "Log-Based Availability"
}
SLI di latenza
In Cloud Monitoring, esprimi un SLI di latenza basato sulle richieste utilizzando una struttura DistributionCut
. L'esempio seguente mostra un SLO che utilizza la metrica log_based_latency
e prevede che il 98% delle richieste sia inferiore a 500 ms in un periodo di 24 ore continuativo:
{
"serviceLevelIndicator": {
"requestBased": {
"distributionCut": {
"distributionFilter":
"metric.type=\"logging.googleapis.com/user/log_based_latency\"
resource.type=\"global\"",
"range": {
"min": 0,
"max": 500
}
}
}
},
"goal": 0.98,
"rollingPeriod": "86400s",
"displayName": "98% requests under 500 ms"
}
Risorse aggiuntive
- È possibile inviare avvisi sui log in Stackdriver? | di Yuri Grinshteyn
- Configura le notifiche per le metriche basate su log | Cloud Logging
- Estrazione del valore dai log con le metriche basate sui log