Using Postgres Workload Report
==============================

Prerequisites
-------------

Postgres Workload Report can provide reports for Postgres servers only
where the ``edb_wait_states`` extension, version 1.2 or later, is
loaded. Furthermore, PWR can provide query wait reports only for
intervals of time when the ``edb_wait_states`` extension was loaded on
the server.

For more information, see :ref:`edb_wait_states </pg_extensions/wait_states/>`  .

Source information for reports
------------------------------

After the ``edb-pwr`` and ``edb-lasso`` packages are installed on the
machine, and the server has been running with the ``edb_wait_states``
extension loaded for a long enough period of time, you can use Postgres
Workload Report to extract reports of wait states for the queries that
were running during the interval of time specified.

Alternatively, Postgres Workload Report can generate reports from an
existing Lasso report, assuming the report was executed on a server with
``edb_wait_states`` loaded. For this reason, Postgres Workload Report
has a mandatory first argument, which can be either of the following:

-  ``execute`` — Performs end-to-end execution. It calls ``lasso`` with
   appropriate options and uses the generated tarball report as the
   input to generate an HTML, Markdown, DOCX, or PDF report.

-  ``report`` — Uses the directory for the stored ``lasso`` report
   contents as input for processing and generating the wait states
   report. Before you can use the ``report`` argument, a decompressed
   and untarred ``lasso`` report must already exist.

Example for the ``execute`` option
----------------------------------

This example generates a report on query waits for the Postgres server
``myserver`` for the interval between January 10th at 9:00 and January
10th at 13:00. An incident happened around that time that must be
investigated to provide a root cause. The main database on the server
where ``edb_wait_states`` is installed is ``my-oltp`` .

To get the report in HTML format, use the following command:

.. code:: shell

   pwr execute --host-name myserver --sampling-start 2024-01-10 09:00:00+00:00 \
       --sampling-end 2024-01-10 13:00:00+00:00 --html \
       --report-name Jan10_incident my-oltp postgres 

..  Note::
   `--sampling-start`  and `--sampling-end`  accept timestamps with or without time zone. If no time zone is explicitly set in the timestamp(s), PWR uses the system time zone.

Run ``pwr execute -h`` to get the full list of options available.

Example for the ``report`` option
---------------------------------

..  Note::
   To avoid overwriting previous reports, the `pwr execute`  command appends the database name and a timestamp to the report name provided in the format `%Y%m%d%H%M%S` , for example, `March_report-mydatabase-20240321-133727.html` .  To avoid this behavior, use the `--use-plain-report-name`  option when executing `pwr execute` .

In some cases, you already have a Lasso report and want PWR to use the
Lasso report as the source and build a report based on it. For these
cases, the ``pwr report`` option is useful.

This example uses the same scenario already described but uses a Lasso
report that was executed using the time boundaries in the previous
example. Suppose that the Lasso report’s name is
``edb-lasso-Jan10-incident.tar.bz2`` and is located in the home
directory of the machine where ``pwr report`` will be executed.

The following commands generate an HTML report saved in
``~/pwr_output/Jan10_incident.html`` :

.. code:: shell

   cd ~/
   mkdir -p pwr_tmp/
   tar jxf ../edb-lasso-Jan10-incident.tar.bz2 -C ~/pwr_tmp/ --strip-components=1
   pwr report \
       --input-dir ~/pwr_tmp/postgresql/dbs/my-oltp/edb_wait_states/ \
       --html --output-dir ~/pwr_output/ --report-name Jan10_incident

Run ``pwr report -h`` to get the full list of options available.
