Monitora le prestazioni delle query utilizzando le funzionalità avanzate di Query Insights

Seleziona una versione della documentazione:

Query Insights avanzato ti consente di rilevare, diagnosticare e prevenire i problemi di prestazioni delle query nel database AlloyDB Omni. Acquisisce la telemetria del database, incluse le statistiche delle query normalizzate, gli eventi di attesa, gli indirizzi IP client, i tag e il carico dell'istanza, e conserva le metriche storiche per 30 giorni.

Puoi utilizzare Query Insights avanzato per eseguire le seguenti attività:

  • Identificare le query a latenza elevata e a uso intensivo di risorse analizzando il tempo di esecuzione, il tempo di I/O, il tempo di attesa, l'attività del buffer condiviso e i conteggi delle righe.
  • Risolvere i problemi relativi ai colli di bottiglia correlando le query lente con gli eventi di attesa e le classi di eventi di attesa.
  • Trace le prestazioni delle query in base a componenti specifici dell'applicazione contrassegnando le query con SQLCommenter.
  • Monitorare le query attive e le transazioni aperte in tempo reale e interrompere le sessioni problematiche.

Prima di iniziare

Prima di abilitare Query Insights avanzato, verifica i seguenti requisiti:

  • Stai eseguendo un'istanza AlloyDB Omni standalone in un container.

  • Disponi dell'accesso come superutente postgres all'istanza del database e dell'accesso amministrativo per riavviare il container.

  • Il database alloydbadmin esiste nell'istanza. AlloyDB Omni crea questo database per impostazione predefinita durante l'inizializzazione.

Abilitare Query Insights avanzato

Per abilitare Query Insights avanzato:

  1. Connettiti al database postgres come superutente postgres:

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Sostituisci CONTAINER_NAME con il nome del container AlloyDB Omni, ad esempio my-omni-1.

  2. Controlla le librerie caricate in shared_preload_libraries, aggiungi Query Insights avanzato all'elenco di precaricamento, abilita l'estensione ed esci da psql:

    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2';
    ALTER SYSTEM SET google_insights_v2.enabled = on;
    \q
    

    Sostituisci LIBRARY_1, LIBRARY_2 e tutte le altre librerie esistenti con i nomi delle librerie restituiti da SHOW shared_preload_libraries. Racchiudi ogni singola voce della libreria tra virgolette singole, ad esempio 'g_stats','google_columnar_engine','google_insights_v2', e includi tutte le librerie esistenti richieste da AlloyDB Omni in modo da non sovrascriverle.

  3. Riavvia il server AlloyDB Omni per applicare le impostazioni di precaricamento:

    Docker

    docker restart CONTAINER_NAME
    

    Docker

    docker restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    
  4. Connettiti al database alloydbadmin come superutente postgres:

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    
  5. Crea l'estensione Query Insights avanzato nel database alloydbadmin:

    CREATE EXTENSION IF NOT EXISTS google_insights_v2;
    
  6. Verifica che la libreria sia caricata, che l'estensione sia abilitata e che l'estensione google_insights_v2 sia installata in alloydbadmin:

    SHOW shared_preload_libraries;
    SHOW google_insights_v2.enabled;
    SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';
    

    Verifica che shared_preload_libraries includa google_insights_v2, google_insights_v2.enabled restituisca on e che pg_extension restituisca una riga per google_insights_v2.

Dimensioni e parametri di funzionalità

In AlloyDB Omni, Query Insights avanzato registra la telemetria del database in tabelle, viste e funzioni SQL nel database alloydbadmin in base alle seguenti dimensioni e funzionalità:

  • Query: utilizza questa opzione per identificare le istruzioni SQL lente o a uso intensivo di risorse quando la latenza delle query aumenta.
  • Tipi di eventi di attesa: utilizza questa opzione per determinare se i colli di bottiglia del carico di lavoro sono causati da CPU, I/O del disco o contesa dei blocchi.
  • Eventi di attesa: utilizza questa opzione per identificare l'evento di attesa PostgreSQL specifico, ad esempio DataFileRead o WALWrite, che ritarda l'esecuzione della query.
  • Database: utilizza questa opzione per confrontare il consumo di risorse tra i database logici e isolare i database a carico elevato sulle istanze condivise.
  • Utenti e indirizzi IP client: utilizza questa opzione per attribuire il carico delle query a ruoli di database o indirizzi IP client specifici e identificare i client dell'applicazione problematici.
  • Tag: utilizza questa opzione per correlare il carico del database con servizi, route o azioni ORM specifici dell'applicazione contrassegnati con SQLCommenter.
  • Query attive: utilizza questa opzione per diagnosticare in tempo reale i picchi di prestazioni live, le transazioni bloccate e le sessioni a lunga esecuzione.

Quando imposti google_insights_v2.enabled su on, AlloyDB Omni raccoglie automaticamente le metriche per query, tipi di eventi di attesa, eventi di attesa, database e utenti.

Per aggiornare qualsiasi parametro google_insights_v2.* in fase di runtime senza riavviare il server di database, esegui ALTER SYSTEM SET e ricarica la configurazione:

ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();

Sostituisci quanto segue:

  • PARAMETER_NAME: il nome del parametro di Query Insights avanzato da configurare, ad esempio google_insights_v2.qi_track_active_queries, google_insights_v2.qi_track_tag o google_insights_v2.qi_track_client_address.
  • VALUE: il nuovo valore del parametro, ad esempio on.

Per le descrizioni di ogni parametro, le visualizzazioni di osservabilità corrispondenti e le metriche e le colonne restituite da ogni visualizzazione, consulta la documentazione di riferimento di Query Insights avanzato.

Granularità temporali

Ogni visualizzazione storica observability_service_* è disponibile in tre granularità temporali:

  • Visualizzazioni di base (*_view): intervalli di scaricamento di 15 secondi. Utilizza queste visualizzazioni per esaminare i picchi o gli incidenti recenti nelle ultime 1-6 ore.
  • Visualizzazioni di livello 1 grossolane (*_coarse_1_view): intervalli aggregati di 5 minuti per le prime 2000 query. Utilizza queste visualizzazioni per analizzare le tendenze delle prestazioni in un periodo di 6-24 ore.
  • Visualizzazioni di livello 2 grossolane (*_coarse_2_view): intervalli aggregati di 30 minuti per le prime 2000 query. Utilizza queste visualizzazioni per analizzare le tendenze su più giorni fino al limite di conservazione di 30 giorni.

Le visualizzazioni di osservabilità storiche memorizzano tutte le colonne relative al tempo di esecuzione, di attesa e di I/O in microsecondi, inclusi total_execution_time, total_wait_time, total_read_time, total_write_time e time_spent.

Metriche sul rendimento storico delle query

Connettiti al database alloydbadmin per eseguire query di diagnostica sulle visualizzazioni di osservabilità storiche. Per saperne di più, consulta Eseguire e connettersi ad AlloyDB Omni.

Le istruzioni SQL in questa sezione sono esempi di query per scenari di risoluzione dei problemi comuni nelle dimensioni. Puoi personalizzare questi esempi, ad esempio modificando la finestra temporale recorded_on, filtrando in base a database o ruoli specifici o eseguendo query su *_coarse_1_view e *_coarse_2_view per l'analisi su più giorni, in base al tuo carico di lavoro.

Identificare le query a latenza elevata

Per trovare le prime 10 query normalizzate con il tempo di esecuzione totale più elevato nell'ultima ora, esegui la seguente query di esempio su google_insights_v2.observability_service_query_view:

SELECT
  query_id,
  database,
  username,
  left(query, 100) AS normalized_query,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
  sum(total_rows) AS total_rows,
  sum(total_shared_blocks_hit) AS shared_blocks_hit,
  sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;

Analizzare gli eventi di attesa per query

Per identificare le categorie di eventi di attesa (wait_class) e gli eventi di attesa granulari (wait_event) che contribuiscono maggiormente al tempo di attesa di un query_id specifico, esegui la seguente query di esempio su google_insights_v2.observability_service_wait_event_stats_by_query_view:

SELECT
  query_id,
  database,
  username,
  wait_class,
  wait_event,
  sum(count) AS wait_occurrences,
  sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
  AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;

Sostituisci QUERY_ID con il valore query_id restituito da observability_service_query_view.

Analizzare il carico di database, utenti e IP client

Per confrontare il tempo di esecuzione totale, il tempo di attesa e il volume delle query tra i database logici e i ruoli di database nell'ultima ora, esegui la seguente query di esempio su google_insights_v2.observability_service_db_load_conn_view:

SELECT
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;

Se abiliti google_insights_v2.qi_track_client_address, puoi anche identificare gli indirizzi IP client di connessione che generano il maggior tempo di query utilizzando la seguente query di esempio su google_insights_v2.observability_service_client_address_stats_by_query_view:

SELECT
  client_address,
  username,
  database,
  query_id,
  sum(count) AS total_executions,
  sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;

Trace il rendimento delle query per tag

Quando google_insights_v2.qi_track_tag è impostato su on e le query includono SQLCommenter, esegui la seguente query di esempio per aggregare il tempo di esecuzione in base ai metadati dei tag dell'applicazione utilizzando google_insights_v2.observability_service_tag_view:

SELECT
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username
ORDER BY total_execution_time_us DESC
LIMIT 10;

Monitorare le query attive

Quando imposti google_insights_v2.qi_track_active_queries su on, puoi monitorare le query in esecuzione e le transazioni aperte in tempo reale eseguendo query su google_insights_v2.stat_activity e google_insights_v2.stat_activity_v3 nel database alloydbadmin.

Queste visualizzazioni espongono le connessioni client attive, le durate delle sessioni e delle transazioni e gli eventi di attesa attuali, escludendo i worker in background e le connessioni alloydbadmin.

Eseguire query sulle sessioni attive e sulle durate delle transazioni

Per identificare le query attualmente in esecuzione sull'istanza e le transazioni in esecuzione da più tempo, esegui la seguente query di esempio in alloydbadmin:

SELECT
  pid AS "Process ID",
  left(normalized_query, 40) AS "Query",
  state AS "Status",
  round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
  CASE
    WHEN xact_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
    ELSE NULL
  END AS "Transaction duration (secs)",
  CASE
    WHEN query_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
    ELSE NULL
  END AS "Query duration (secs)",
  COALESCE(wait_event_type, '') AS "Wait event type",
  COALESCE(wait_event, '') AS "Wait event",
  database AS "Database",
  COALESCE(application_name, '') AS "Application name",
  username AS "Username",
  COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;

Interrompere una query o una transazione a lunga esecuzione

Per interrompere una query a lunga esecuzione o una transazione bloccata identificata in google_insights_v2.stat_activity_v3, passa il relativo ID di processo a pg_terminate_backend:

SELECT pg_terminate_backend(PROCESS_ID);

Sostituisci PROCESS_ID con il valore Process ID (pid) restituito da google_insights_v2.stat_activity_v3.

Disabilitare Query Insights avanzato

Per interrompere la raccolta di telemetria senza riavviare l'istanza AlloyDB Omni, imposta google_insights_v2.enabled su off e ricarica la configurazione:

ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();

Per rimuovere gli oggetti dell'estensione e i dati storici archiviati dal database alloydbadmin, connettiti a alloydbadmin ed elimina l'estensione:

DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;

Passaggi successivi