PoWA V5 - Quoi de neuf ?

PG Session 17, Janvier 2025, Paris

Julien ROUHAUD, Pierre GIRAUD

Julien ROUHAUD (Taipei, Taiwan)
Nile

@rjuju123
Blog: rjuju.github.io
Pierre GIRAUD (Chambéry, France)
Dalibo

@pgira

Introduction

PoWA - C’est quoi ?

PoWA

=

PostgreSQL Workload Analyzer

A quoi ça sert ?

  • Un outil d’analyse de performance dédié à PostgreSQL
  • Stocke et aggrège efficacement de nombreuses sources de données
    • stockage compressé utilisant tableaux et TOAST
    • extensions : pg_stat_statements, pg_stat_kcache, …
    • vues statistiques : pg_stat_activity, pg_stat_bgwriter, …
    • statistique par base : pg_stat_user_functions, …
    • extensible : on peut ajouter ses propres sources de données
  • UI dédiée pour extraire et présenter les données de manière utile

À qui ça sert ?

  • PoWA montre comment une application se comporte et intéragit avec la base
  • Outil de liaison entre les DBA et les développeurs
  • Focalise l’attention sur les possibles problèmes et sources de contention
  • Et suggère même automatiquement des optimisations

Sondage

  • Qui connait PoWA ?
  • Qui a déjà utilisé PoWA ?
  • Qui utilise PoWA en production ?

Fonctionnement

2 modes

  • Local
  • Distant

Mode local

Sur une seule instance, entièrement autonome (quelques limitations)

PoWA Local Mode

Mode distant

  • Supervise autant de serveurs que l’on veut
  • Stocke les données sur une instance postgres dédiée
  • Permet également de superviser des serveurs en réplication physique
PoWA Remote Mode

Description (rapide) des composants

  • Extensions obligatoires :
    • pg_stat_statements
    • powa_archivist
  • Extensions facultatives :
    • pg_stat_kcache
    • pg_qualstats
    • pg_wait_sampling
    • pg_track_settings
  • Autres composants :
    • powa-collector
    • powa-web

V5 - Refonte de l’interface

Pourquoi ?

Moderniser le code

Améliorer l’expérience utilisateur
(Esthétique et utilisabilité)

Historique

  • V1 (2014) : première version, seulement basé sur pg_stat_statements et UI en Perl
  • V2 (2015) : réécriture de l’UI en python, extensibilité et support de pg_qualstats et pg_stat_kcache
  • V3 (2015) : introduction de la suggestion d’index globale, support de hypopg, pg_track_settings…
  • V4 (2020) : introduction du mode distant et powa-collector, support de pg_wait_sampling…

Réécriture de l’UI: Quand ?

UI V5 (2024)

Début du développement courant de l’été 2022, temps R&D Dalibo.

Réécriture : libraries

Backbone.js
Foundation
Rickshaw
Bower
VueJS
Vuetify
D3.js
ViteJS

Réécriture : Découpage

Fonctionnement initial conservé et amélioré

Structure arborescente en JSON

Composants responsables de leurs données


{
  "dashboard": {
    "title": "All databases",
    "type": "dashboard",
    "widgets": [
      [{
        "title": "All databases",
        "type": "tabcontainer",
        "tabs": [{
          "title": "General Overview",
          "type": "dashboard",
          "widgets": [
            [{
              "server": "1",
              "title": "Query runtime per second (all databases)",
              "metrics": ["all_databases.avg_runtime", "all_databases.load", ...],
              "axistype": "time",
              "stack": false,
              "type": "graph"
            }, {
              ...
            }]
        }, {
          ...
        }]
      }],
      [{
        "server": "1",
        "title": "Details for all databases",
        "metrics": ["by_database.plantime", "by_database.calls", ...],
        "columns": [{
          "name": "datname",
          "label": "Database",
          "url_attr": "url"
        }],
        "type": "grid"
      }],
      ...
    ]
  },
  "datasources": [{
    "name": "all_databases",
    "xaxis": "ts",
    "data_url": "/server/1/metrics/databases_globals/",
    "metrics": [{
      "name": "avg_runtime",
      "label": "Avg runtime",
      "yaxis": "avg_runtime",
      "desc": "Average query duration",
      "type": "duration"
    }, {
      ...
    }]
  }],
  ...
}

Réécriture : rendu visuel

Pour une meilleure lisibilité.

Exemple : les tableaux

Autre exemple : les graphiques (et leur légende)

Réécriture : pseudo SPA

(quasi) Single Page App
pour une meilleure expérience utilisateur

Quelques fonctionnalités phares de PoWA

“Optimiser base”

Suggestion d’index globale

Autres nouveautés
de la v5

Général

  • Snapshot à la demande via l’UI
  • Historique du catalogue, rafraîchissement automatique et/ou à la demande

UI

  • Mode sombre / clair
  • Sélecteur de dates

Back end / Métriques

  • Support des métriques “par base” (mode distant uniquement)
    • statistiques sur l’exécution des fonctions pl et affichage du code source grâce à l’historique du catalogue
    • statistiques sur les objets dans la base (taille, scans, autovacuum…)
  • Ajout de métriques plus généralistes
    • historique de pg_stat_activity, à l’instance ou à la base
    • historique de l’archivage des WAL
    • statistiques sur la réplication (physique et logique, slots, conflits)
  • Et plus de métriques sur les resources
    • nouvelles métriques pg_stat_statements (WAL, JIT…)
    • statistiques sur les IO
    • statistiques sur les SLRU (pg_xact etc)
    • statistiques sur les WALs
  • Support de PG17
  • Support de pg_stat_statements 1.11

Idées d’améliorations / futur

  • Davantage de messages explicatifs pour guider les utilisateurs
  • Contrôle de PoWA via l’interface web
    • création / configuration / suppression d’instances
    • prise en compte et mise à jour des extensions
  • Support de nouveaux outils et plus de suggestion d’optimisation
    • ex: support de plpgsql_check, problème sur autovacuum…

Questions ?

Doc : powa.readthedocs.io

Code : github.com/powateam