Google Cloud fornisce l'infrastruttura scalabile necessaria per gestire operazioni di analisi dei log di grandi dimensioni. Questo tutorial mostra come utilizzare Google Cloud per creare pipeline di analisi che elaborano voci di log da più origini. Combina i dati dei log in modo da aiutarti a estrarre informazioni significative e mantenere insight derivati dai dati, che possono essere utilizzati per analisi, revisione e generazione di report.
Panoramica
Man mano che la tua applicazione diventa più complessa, ricavare insight dai dati acquisiti nei tuoi log diventa più difficile. I log provengono da un numero crescente di origini, quindi possono essere difficili da raccogliere ed eseguire query per informazioni utili. Creare, gestire e gestire la tua infrastruttura per analizzare i dati di log su larga scala può richiedere una vasta esperienza nell'esecuzione di sistemi distribuiti e di archiviazione. Questo tipo di infrastruttura dedicata spesso rappresenta una spesa capitale una tantum, con conseguente capacità fissa, che rende difficile la scalabilità oltre l'investimento iniziale. Queste limitazioni possono influire sulla tua attività perché portano a rallentamenti nel generare insight significativi e strategici dai tuoi dati.
Questa soluzione mostra come superare queste limitazioni utilizzando i prodotti Google Cloud, come illustrato nel diagramma seguente.
In questa soluzione, un insieme di microservizi di esempio viene eseguito su Google Kubernetes Engine (GKE) per implementare un sito web. Cloud Logging raccogli i log da questi servizi e li salva nei bucket Cloud Storage. Dataflow elabora quindi i log estraendo metadati e aggregando i dati di base di computing. La pipeline Dataflow è progettata per elaborare gli elementi di log ogni giorno per generare metriche aggregate per i tempi di risposta del server, in base ai log per ciascun giorno. Infine, l'output di Dataflow viene caricato in tabelle BigQuery, dove possono essere analizzate per fornire business intelligence. Questa soluzione spiega anche come puoi modificare la pipeline in modo che venga eseguita in modalità di flusso, per un'elaborazione dei log asincrona a bassa latenza.
Questo tutorial fornisce una pipeline Dataflow di esempio, un'applicazione web di esempio, informazioni sulla configurazione e i passaggi per eseguire l'esempio.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
- GKE per il deployment di microservizi.
- Cloud Logging per ricevere ed esportare i log.
- Cloud Storage per l'archiviazione dei log esportati in modalità batch.
- Pub/Sub per lo streaming dei log esportati in modalità di streaming
- Dataflow per l'elaborazione dei dati dei log.
- BigQuery per l'archiviazione dell'output di elaborazione e il supporto di query avanzate su tale output.
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, Cloud Storage, Pub/Sub, Dataflow, GKE and Logging APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, Cloud Storage, Pub/Sub, Dataflow, GKE and Logging APIs.
Configurazione dell'ambiente
In questo tutorial, utilizzerai Cloud Shell per inserire comandi. Cloud Shell ti dà accesso alla riga di comando nella console di Google Cloud e include Google Cloud CLI e altri strumenti che devi sviluppare in Google Cloud. Cloud Shell viene visualizzato come finestra nella parte inferiore della console Google Cloud. L'inizializzazione potrebbe richiedere alcuni minuti, ma la finestra viene visualizzata immediatamente.
Per utilizzare Cloud Shell per configurare il tuo ambiente e clonare il repository Git utilizzato in questo tutorial:
In Cloud Console, apri Cloud Shell.
Assicurati di lavorare al progetto che hai creato. Sostituisci
[YOUR_PROJECT_ID]
con il progetto Google Cloud che hai appena creato.gcloud config set project [YOUR_PROJECT_ID]
Imposta la zona di Compute Engine predefinita. Ai fini di questo tutorial, è
us-east1
. Se esegui il deployment in un ambiente di produzione, esegui il deployment in un'area geografica a tua scelta.export REGION=us-east1 gcloud config set compute/region $REGION
Clonazione del repository di esempio
Clona il repository contenente gli script e la logica dell'applicazione che utilizzi in questo tutorial.
git clone https://github.com/GoogleCloudPlatform/processing-logs-using-dataflow.git cd processing-logs-using-dataflow/services
Configura variabili di ambiente
# name your bucket
export PROJECT_ID=[YOUR_PROJECT_ID]
# name your GKE cluster
export CLUSTER_NAME=cluster-processing-logs-using-dataflow
# name the bucket for this tutorial
export BUCKET_NAME=${PROJECT_ID}-processing-logs-using-dataflow
# name the logging sink for this tutorial
export SINK_NAME=sink-processing-logs-using-dataflow
# name the logging sink for this tutorial
export DATASET_NAME=processing_logs_using_dataflow
Esegui il deployment dell'applicazione di esempio in un nuovo cluster Google Kubernetes Engine
# create the cluster and deploy sample services
./cluster.sh $PROJECT_ID $CLUSTER_NAME up
Informazioni sul deployment delle applicazioni di esempio
Il deployment di esempio crea un'app di shopping. In questo esempio, gli utenti possono visitare la home page di un sito di vendita al dettaglio, cercare singoli prodotti e quindi provare a localizzare i prodotti nei vicini negozi fisici. L'app è composta da tre
microservizi: HomeService
, BrowseService
e LocateService
. Ogni servizio è disponibile a partire da un endpoint API in uno spazio dei nomi condiviso. Gli utenti accedono ai servizi aggiungendo /home
, /browse
e /locate
all'URL di base.
L'applicazione è configurata per registrare le richieste HTTP in entrata in stdout
.
Utilizzo di Google Kubernetes Engine con Cloud Logging
In questo esempio, i microservizi vengono eseguiti in un cluster Kubernetes Engine, che è un gruppo di istanze Compute Engine, o nodi, che eseguono Kubernetes. Per impostazione predefinita, GKE configura ciascun nodo in modo da fornire una serie di servizi, tra cui il monitoraggio, il controllo di integrità e il logging centralizzato. Questa soluzione utilizza il supporto integrato per Logging per inviare i log da ogni microservizio a Cloud Storage. In alternativa alle applicazioni che registrano informazioni nei file, non coperte da questa soluzione, puoi configurare il logging a livello di cluster con Kubernetes.
Ogni microservizio viene eseguito su un singolo pod nel cluster. Ogni pod viene eseguito su un nodo ed è esposto come un singolo endpoint HTTP utilizzando i servizi GKE.
Ogni nodo nel cluster esegue un agente Cloud Logging che acquisisce i messaggi di log. Una volta che i log sono disponibili in Logging, uno script indirizza automaticamente i log a un bucket Cloud Storage utilizzando il supporto Logging disponibile da gcloud CLI.
Puoi anche configurare i log da esportare in Cloud Storage utilizzando Esplora log. Questa soluzione utilizza l'interfaccia a riga di comando gcloud perché è necessaria durante l'esportazione di più log.
Quando utilizzi Cloud Storage come destinazione di esportazione dei log, le voci di tipo
LogEntry
vengono salvate in batch orari in singoli file JSON. Queste voci strutturate di logging includono metadati aggiuntivi che specificano quando è stato creato ciascun messaggio di log, quale risorsa o istanza lo ha generato, il suo livello di gravità e così via. Nell'esempio seguente di una voce di logging, nell'elemento structPayload.log
puoi vedere il messaggio di log originale generato dal microservizio:
{ "insertId": "ugjuig3j77zdi", "labels": { "compute.googleapis.com/resource_name": "fluentd-gcp-v3.2.0-9q4tr", "container.googleapis.com/namespace_name": "default", "container.googleapis.com/pod_name": "browse-service-rm7v9", "container.googleapis.com/stream": "stdout" }, "logName": "projects/processing-logs-at-scale/logs/browse-service", "receiveTimestamp": "2019-03-09T00:33:30.489218596Z", "resource": { "labels": { "cluster_name": "cluster-processing-logs-using-dataflow", "container_name": "browse-service", "instance_id": "640697565266753757", "namespace_id": "default", "pod_id": "browse-service-rm7v9", "project_id": "processing-logs-at-scale", "zone": "us-east1-d" }, "type": "container" }, "severity": "INFO", "textPayload": "[GIN] 2019/03/09 - 00:33:23 | 200 | 190.726µs | 10.142.0.6 | GET /browse/product/1\n", "timestamp": "2019-03-09T00:33:23.743466177Z" }
Configura il logging
Dopo che il cluster è in esecuzione e dopo il deployment dei servizi, puoi configurare il logging per l'applicazione.
Innanzitutto, ottieni le credenziali per il cluster, poiché kubectl
viene utilizzato per ottenere i nomi dei servizi per configurare i sink di esportazione di Cloud Logging.
gcloud container clusters get-credentials $CLUSTER_NAME --region $REGION
Nel repository di codice, services/logging.sh
configura i componenti necessari per la modalità flusso o batch. Lo script accetta i seguenti parametri:
logging.sh [YOUR_PROJECT_ID] [BUCKET_NAME] [streaming|batch] [up|down]
Ai fini di questo tutorial, avvia il logging in batch:
./logging.sh $PROJECT_ID $BUCKET_NAME batch up
I seguenti passaggi mostrano i comandi eseguiti per la modalità batch:
Creare un bucket Cloud Storage.
gsutil -q mb gs://[BUCKET_NAME]
Consenti a Cloud Logging di accedere al bucket.
gsutil -q acl ch -g cloud-logs@google.com:O gs://[BUCKET_NAME]
Per ogni microservizio, configura le esportazioni di Cloud Logging utilizzando un sink.
gcloud logging sinks create [SINK_NAME] \ storage.googleapis.com/[BUCKET_NAME] \ --log-filter="kubernetes.home_service..." --project=[YOUR_PROJECT_ID]
Aggiorna le autorizzazioni per la destinazione
Le autorizzazioni della destinazione, in questo caso il bucket Cloud Storage, non vengono modificate quando crei un sink. Devi modificare le impostazioni delle autorizzazioni del tuo bucket Cloud Storage per concedere l'autorizzazione in scrittura al tuo sink.
Per aggiornare le autorizzazioni per il bucket Cloud Storage:
Identifica l'identità del creator del sink:
Vai alla pagina Router di log:
Vai alla pagina Router dei log
La pagina Router di log contiene un riepilogo dei sink, inclusa l'identità dell'autore del sink.
IMPORTANTE: per ciascuno dei tre (3) sink, è presente un'email dell'account di servizio separata a cui devono essere concesse le autorizzazioni per il bucket Cloud Storage
Da Google Cloud Console, fai clic su Archiviazione > Browser:
Per aprire la visualizzazione dettagliata, fai clic sul nome del bucket.
Seleziona Autorizzazioni e fai clic su Aggiungi entità.
Imposta il Ruolo su
Storage Object Creator
e inserisci l'identità dell'autore del sink.
Per ulteriori informazioni, consulta la sezione Autorizzazioni di destinazione.
È possibile verificare i percorsi degli oggetti log utilizzando il seguente comando:
gsutil ls gs://$BUCKET_NAME | grep service
Quando l'output contiene tutte e tre le voci, puoi procedere con i passaggi per eseguire la pipeline di dati:
gs://$BUCKET_NAME/browse-service/ gs://$BUCKET_NAME/home-service/ gs://$BUCKET_NAME/locate-service/
Crea il set di dati BigQuery
bq mk $DATASET_NAME
Generare un carico sui servizi dell'applicazione
Installa le utilità del server HTTP Apache
Utilizzi lo strumento di benchmarking del server HTTP Apache (ab) per generare il carico sui servizi.
sudo apt-get update
sudo apt-get install -y apache2-utils
Lo script della shell load.sh
genera un carico sui microservizi richiedendo risposte da HomeService
, BrowseService
e LocateService
.
Un singolo set di caricamento comprende una richiesta al servizio home e 20 richieste (20) ciascuna ai servizi di navigazione e localizzazione.
L'opzione seguente genera mille (1000) set di carico (con contemporaneità impostata su 3 richieste simultanee)
cd ../services
./load.sh 1000 3
Lascia in esecuzione per alcuni minuti per creare una quantità sufficiente di log.
Avvia la pipeline di Dataflow
Dopo che una quantità sufficiente di traffico ha raggiunto i servizi, puoi avviare la pipeline di Dataflow.
Ai fini di questo tutorial, la pipeline di Dataflow viene eseguita in modalità batch. Lo script della shell pipeline.sh
avvia manualmente la pipeline.
cd ../dataflow
./pipeline.sh $PROJECT_ID $DATASET_NAME $BUCKET_NAME run
Comprendere la pipeline Dataflow
Dataflow può essere utilizzato per molti tipi di attività di elaborazione dati. L'SDK Dataflow fornisce un modello di dati unificato che può rappresentare un set di dati di qualsiasi dimensione, incluso un set di dati illimitato o illimitato proveniente da un'origine dati che si aggiorna continuamente. È adatto per lavorare con i dati di log in questa soluzione. Il servizio gestito Dataflow può eseguire job batch e flussi. Ciò significa che puoi utilizzare un unico codebase per l'elaborazione basata su eventi basata su eventi in modo asincrono o sincrono.
L'SDK Dataflow fornisce rappresentazioni di dati semplici tramite una classe di raccolta specializzata denominata
PCollection
.
L'SDK fornisce trasformazioni di dati integrate e personalizzate tramite la classe PTransform
. In Dataflow, le trasformazioni rappresentano la logica di elaborazione di una pipeline. Le trasformazioni possono essere utilizzate per una serie di operazioni di elaborazione come l'unione dei dati, il calcolo matematico dei valori, il filtro dell'output dei dati o la conversione dei dati da un formato all'altro. Per ulteriori informazioni su pipeline, PCollection, trasformazioni e origini e sink di I/O, consulta il modello di programmazione Dataflow.
Il seguente diagramma mostra le operazioni della pipeline per i dati di log memorizzati in Cloud Storage:
Sebbene il diagramma possa sembrare complesso, Dataflow semplifica la creazione e l'utilizzo della pipeline. Le seguenti sezioni descrivono le operazioni specifiche in ogni fase della pipeline.
Ricezione dei dati
La pipeline inizia a utilizzare l'input dai bucket Cloud Storage che contengono i log dei tre microservizi. Ogni raccolta di log diventa un
PCollection
di elementi String
, dove ogni elemento corrisponde a un singolo
oggetto LogEntry
. Nello snippet seguente, i tipi homeLogs
, browseLogs
e locateLogs
sono di tipo PCollection<String>:
Per affrontare le sfide di un set di dati in continuo aggiornamento, l'SDK Dataflow utilizza una tecnica chiamata windowing.
La funzionalità di suddivisione prevede la suddivisione logica dei dati in una PCollection in base ai timestamp dei singoli elementi. Poiché in questo caso il tipo di origine è TextIO
, tutti gli oggetti vengono inizialmente letti in un'unica finestra globale, che è il comportamento predefinito.
Raccolta dei dati negli oggetti
Il passaggio successivo combina le singole PCollection di microservizi in una singola
PCollection utilizzando l'operazione Flatten
.
Questa operazione è utile perché ogni PCollection di origine contiene lo stesso tipo di dati e utilizza la stessa strategia di Windowsing globale. Sebbene le origini e la struttura di ciascun log siano le stesse in questa soluzione, puoi estendere questo approccio in uno in cui l'origine e la struttura sono diverse.
Con una singola PCollection creata, ora puoi elaborare i singoli elementi String
utilizzando una trasformazione personalizzata che esegue diversi passaggi nella voce di log. Ecco i passaggi illustrati nel diagramma seguente:
- Deserializzare la stringa JSON in un oggetto Java
LogEntry
di Cloud Logging. - Estrai il timestamp dai metadati
LogEntry
. - Estrai i seguenti singoli campi dal messaggio di log utilizzando le espressioni regolari:
timestamp
,responseTime
,httpStatusCode
,httpMethod
,source
indirizzo IP ed endpointdestination
. Utilizza questi campi per creare un oggetto personalizzatoLogMessage
con timestamp. - Visualizza gli oggetti
LogMessage
in un nuovoPCollection
.
Il seguente codice esegue i passaggi seguenti:
Aggregazione dei dati in base ai giorni
Ricorda che l'obiettivo è elaborare gli elementi ogni giorno per generare metriche aggregate in base ai log per ogni giorno. Per ottenere questa aggregazione è necessaria una funzione di finestre che suddivide i dati per giorno, il che è possibile perché ogni LogMessage
nella PCollection ha un timestamp. Dopo che
Dataflow partiziona la PCollection lungo i confini giornalieri,
le operazioni che supportano le PCollection con finestra rispettano lo schema di Windowsing.
Con una singola PCollection a finestre, ora puoi calcolare metriche giornaliere aggregate su tutte e tre le origini di log di più giorni eseguendo un singolo job Dataflow.
In primo luogo, una trasformazione prende gli oggetti LogMessage
come input e poi genera un
PCollection
di coppie chiave-valore che mappano gli endpoint di destinazione come chiavi ai
valori del tempo di risposta, come illustrato nel diagramma seguente.
Con questa PCollection, puoi calcolare due metriche aggregate: il tempo di risposta massimo per destinazione e il tempo medio di risposta per destinazione. Poiché la PCollection è ancora partizionata per giorno, l'output di ogni calcolo rappresenta i dati di log di un singolo giorno. Questo significa che hai due PCollection: una contenente il tempo di risposta massimo per destinazione al giorno e una contenente il tempo medio di risposta per destinazione al giorno.
Caricamento dei dati in BigQuery
Il passaggio finale della pipeline genera le PCollection derivanti in BigQuery per l'analisi e il data warehousing downstream.
Innanzitutto, la pipeline trasforma la PCollection che contiene oggetti LogMessage
per tutte le origini log in una PCollection di oggetti TableRow
BigQuery.
Questo passaggio è necessario per utilizzare il supporto integrato in Dataflow per utilizzare BigQuery come sink per una pipeline.
Le tabelle BigQuery richiedono schemi definiti. Per questa soluzione, gli schemi vengono definiti in LogAnalyticsPipelineOptions.java
utilizzando un'annotazione con valore predefinito. Ad esempio, lo schema per la tabella del tempo massimo di risposta è definito come segue:
Un'operazione sulle PCollection che contengono i valori dei tempi di risposta aggregati le converte in PCollection di oggetti TableRow
, applicando gli schemi appropriati e creando le tabelle, se non sono presenti.
Questa soluzione aggiunge sempre nuovi dati ai dati esistenti. È una scelta appropriata perché questa pipeline viene eseguita su base periodica per analizzare i nuovi dati di log. Tuttavia, è possibile troncare i dati della tabella esistente o scrivere nella tabella solo se è vuoto, se una di queste opzioni ha senso in uno scenario diverso.
Esecuzione di query sui dati da BigQuery
La console di BigQuery consente di eseguire query sui dati di output e connettersi a strumenti di business intelligence di terze parti come Tableau e QlikView per ulteriori analisi.
In BigQuery, apri Google Cloud Console.
Fai clic sul progetto
processing-logs-at-scale
e poi sul set di datiprocessing_logs_using_dataflow
.Seleziona
all_logs_table
e nel riquadro dei dati seleziona Anteprima, per visualizzare un esempio dei dati nella tabella Tutti i log.Nell'Editor query inserisci la seguente query:
SELECT * FROM `processing_logs_using_dataflow.max_response_time_table` ORDER BY aggResponseTime DESC LIMIT 100;
Per eseguire la query, fai clic su Esegui.
Utilizzo di una pipeline in modalità flusso
L'esempio include il supporto per eseguire la pipeline in modalità flusso o batch. Bastano pochi passaggi per cambiare la pipeline da flusso in modalità flusso a flusso. Innanzitutto, la configurazione di Cloud Logging esporta le informazioni di logging in Pub/Sub anziché in Cloud Storage. Il passaggio successivo consiste nel modificare le origini di input nella pipeline Dataflow da Cloud Storage agli abbonamenti a argomenti Pub/Sub. È necessaria una sottoscrizione per ogni origine di input.
Puoi vedere i comandi SDK in uso in logging.sh
.
Le raccolte create da dati di input Pub/Sub utilizzano una finestra globale senza limiti. Tuttavia, le singole voci includono già i timestamp. Ciò significa che non è necessario estrarre i dati del timestamp dall'oggetto Cloud Logging LogEntry
, ma estrarre i timestamp del log per creare gli oggetti LogMessage
personalizzati.
Il resto della pipeline rimane invariato, incluse operazioni di Appiattimento, trasformazione, aggregazione e output a valle.
Monitoraggio della pipeline
Quando esegui il job Dataflow, puoi utilizzare la Google Cloud Console per monitorare l'avanzamento e visualizzare le informazioni su ogni fase della pipeline.
L'immagine seguente mostra Google Cloud Console durante l'esecuzione di una pipeline di esempio:
Eseguire la pulizia
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina tutti i componenti
Assicurati che alcune variabili di ambiente siano ancora impostate sui valori utilizzati durante la configurazione
Elimina il set di dati BigQuery:
bq rm $DATASET_NAME
Disattiva le esportazioni ((logging_name)). Questo passaggio elimina le esportazioni e il bucket Cloud Storage specificato:
cd ../services ./logging.sh $PROJECT_ID $BUCKET_NAME batch down
Elimina il cluster di Compute Engine utilizzato per eseguire le applicazioni web di esempio:
/cluster.sh $PROJECT_ID $CLUSTER_NAME down
Ampliare la soluzione
La pipeline e l'insieme di operazioni descritti in questa soluzione possono essere estesi in vari modi. Le estensioni più evidenti sarebbero quelle di
eseguire ulteriori aggregazioni nei dati di LogMessage
. Ad esempio, se nell'output del log sono state incluse informazioni sugli utenti anonimizzate o relative alle sessioni, potresti creare aggregazioni relative alle attività degli utenti. Puoi anche utilizzare la trasformazione Approssimativo Quantianti per generare una distribuzione dei tempi di risposta.
Passaggi successivi
- Rivedi il codice campione nel repository Processing Logs at Scale using Cloud Dataflow su GitHub.
- Scopri di più su altre soluzioni di analisi dei log.
- Esplora architetture di riferimento, diagrammi, tutorial e best practice su Google Cloud. Consulta il nostro Centro di architettura cloud.