pgpool2.git / summary / log / commit / refs

commit    dfc568688ef03d41fc327b55d0a2bccb015a497d
Author:   Tatsuo Ishii <ishii@sraoss.co.jp>
Date:     Tue Feb 25 08:05:16 2020 +0000

    Add pgpool_adm's pcp_health_check_stats function.


doc.ja/src/sgml/ref/allfiles.sgml | 1 + .../ref/pgpool_adm_pcp_health_check_stats.sgml | 163 +++++++++++++++++++++ doc.ja/src/sgml/reference.sgml | 1 + doc/src/sgml/ref/allfiles.sgml | 1 + .../ref/pgpool_adm_pcp_health_check_stats.sgml | 162 ++++++++++++++++++++ doc/src/sgml/reference.sgml | 1 + src/sql/pgpool_adm/Makefile | 3 +- src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql | 6 +- src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql | 10 ++ src/sql/pgpool_adm/pgpool_adm--1.3.sql | 101 +++++++++++++ src/sql/pgpool_adm/pgpool_adm.c | 163 ++++++++++++++++++++- src/sql/pgpool_adm/pgpool_adm.control | 2 +- src/sql/pgpool_adm/pgpool_adm.h | 2 + 13 files changed, 608 insertions(+), 8 deletions(-) diff --git a/doc.ja/src/sgml/ref/allfiles.sgml b/doc.ja/src/sgml/ref/allfiles.sgml index 195ae28db..ec82045ab 100644 --- a/doc.ja/src/sgml/ref/allfiles.sgml +++ b/doc.ja/src/sgml/ref/allfiles.sgml @@ -34,6 +34,7 @@ Complete list of usable sgml source files in this directory. <!ENTITY showPoolCache SYSTEM "show_pool_cache.sgml"> <!ENTITY showPoolHealthCheckStats SYSTEM "show_pool_health_check_stats.sgml"> <!ENTITY pgpoolAdmPcpNodeInfo SYSTEM "pgpool_adm_pcp_node_info.sgml"> +<!ENTITY pgpoolAdmPcpHealthCheckStats SYSTEM "pgpool_adm_pcp_health_check_stats.sgml"> <!ENTITY pgpoolAdmPcpPoolStatus SYSTEM "pgpool_adm_pcp_pool_status.sgml"> <!ENTITY pgpoolAdmPcpNodeCount SYSTEM "pgpool_adm_pcp_node_count.sgml"> <!ENTITY pgpoolAdmPcpAttachNode SYSTEM "pgpool_adm_pcp_attach_node.sgml"> diff --git a/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml b/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml new file mode 100644 index 000000000..cbbe263c7 --- /dev/null +++ b/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml @@ -0,0 +1,163 @@ +<!-- +doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml +Pgpool-II documentation +--> + +<refentry id="PGPOOL-ADM-PCP-HEAlTH-CHECK-STATS"> + <indexterm zone="pgpool-adm-pcp-health-check-stats"> + <primary>pgpool_adm_pcp_health_check_stats</primary> + </indexterm> + + <refmeta> + <refentrytitle>pgpool_adm_pcp_health_check_stats</refentrytitle> + <manvolnum>3</manvolnum> + <refmiscinfo>pgpool_adm extension</refmiscinfo> + </refmeta> + + <refnamediv> + <refname>pgpool_adm_pcp_health_check_stats</refname> + <refpurpose> + 与えられたノードIDのヘルスチェック統計データを表示する関数 + </refpurpose> + </refnamediv> + + <refsynopsisdiv> + <funcsynopsis> + <funcprototype> + <funcdef><function>pcp_health_check_stats</function> returns record</funcdef> + <paramdef>integer <parameter>node_id</parameter></paramdef> + <paramdef>text <parameter>host</parameter></paramdef> + <paramdef>integer <parameter>port</parameter></paramdef> + <paramdef>text <parameter>username</parameter></paramdef> + <paramdef>text <parameter>password</parameter></paramdef> + <paramdef>out <parameter>node_id integer</parameter></paramdef> + <paramdef>out <parameter>host text</parameter></paramdef> + <paramdef>out <parameter>port integer</parameter></paramdef> + <paramdef>out <parameter>status text</parameter></paramdef> + <paramdef>out <parameter>role text</parameter></paramdef> + <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef> + <paramdef>out <parameter>total_count bigint</parameter></paramdef> + <paramdef>out <parameter>success_count bigint</parameter></paramdef> + <paramdef>out <parameter>fail_count bigint</parameter></paramdef> + <paramdef>out <parameter>skip_count bigint</parameter></paramdef> + <paramdef>out <parameter>retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef> + <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef> + </funcprototype> + + <funcprototype> + <funcdef><function>pcp_health_check_stats</function> returns record</funcdef> + <paramdef>integer <parameter>node_id</parameter></paramdef> + <paramdef>text <parameter>pcp_server</parameter></paramdef> + <paramdef>out <parameter>node_id integer</parameter></paramdef> + <paramdef>out <parameter>host text</parameter></paramdef> + <paramdef>out <parameter>port integer</parameter></paramdef> + <paramdef>out <parameter>status text</parameter></paramdef> + <paramdef>out <parameter>role text</parameter></paramdef> + <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef> + <paramdef>out <parameter>total_count bigint</parameter></paramdef> + <paramdef>out <parameter>success_count bigint</parameter></paramdef> + <paramdef>out <parameter>fail_count bigint</parameter></paramdef> + <paramdef>out <parameter>skip_count bigint</parameter></paramdef> + <paramdef>out <parameter>retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef> + <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef> + </funcprototype> + + </funcsynopsis> + </refsynopsisdiv> + + <refsect1 id="R3-PCP-HEALTH-CHECK-STATS-3"> + <title>説明</title> + <para> + <function>pcp_health_check_stats</function> + 与えられたノードIDのヘルスチェック統計データを表示します。 + </para> + </refsect1> + + <refsect1> + <title>引数</title> + <para> + <variablelist> + + <varlistentry> + <term><replaceable class="parameter">node_id</replaceable></term> + <listitem> + <para> + 情報を取得するバックエンドノード + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable class="parameter">pcp_server</replaceable></term> + <listitem> + <para> + pcpサーバの外部サーバ名 + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>他の引数</option></term> + <listitem> + <para> + <xref linkend="pcp-common-options">を参照ください。 + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </refsect1> + + <refsect1> + <title>使用例</title> + <para> + 使用例です。 + <programlisting> +test=# select * from pcp_health_check_stats(0,'',11001,'t-ishii','t-ishii'); +-[ RECORD 1 ]-----------------+-------------------- +node_id | 0 +host | /tmp +port | 11002 +status | up +role | primary +last_status_change | 2020-02-25 16:05:29 +total_count | 3 +success_count | 3 +fail_count | 0 +skip_count | 0 +retry_count | 0 +average_retry_count | 0 +max_retry_count | 0 +max_health_check_duration | 5 +min_health_check_duration | 3 +average_health_check_duration | 4.333333 +last_health_check | 2020-02-25 16:05:47 +last_successful_health_check | 2020-02-25 16:05:47 +last_skip_health_check | +last_failed_health_check | + </programlisting> + </para> + + <para> + 表示データの詳細に関しては<xref linkend="health-check-stats-data-table">をご覧ください。 + </para> + + </refsect1> + +</refentry> diff --git a/doc.ja/src/sgml/reference.sgml b/doc.ja/src/sgml/reference.sgml index 2393fef0f..4333af8d9 100644 --- a/doc.ja/src/sgml/reference.sgml +++ b/doc.ja/src/sgml/reference.sgml @@ -345,6 +345,7 @@ </partintro> &pgpoolAdmPcpNodeInfo + &pgpoolAdmPcpHealthCheckStats &pgpoolAdmPcpPoolStatus &pgpoolAdmPcpNodeCount &pgpoolAdmPcpAttachNode diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index 195ae28db..ec82045ab 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -34,6 +34,7 @@ Complete list of usable sgml source files in this directory. <!ENTITY showPoolCache SYSTEM "show_pool_cache.sgml"> <!ENTITY showPoolHealthCheckStats SYSTEM "show_pool_health_check_stats.sgml"> <!ENTITY pgpoolAdmPcpNodeInfo SYSTEM "pgpool_adm_pcp_node_info.sgml"> +<!ENTITY pgpoolAdmPcpHealthCheckStats SYSTEM "pgpool_adm_pcp_health_check_stats.sgml"> <!ENTITY pgpoolAdmPcpPoolStatus SYSTEM "pgpool_adm_pcp_pool_status.sgml"> <!ENTITY pgpoolAdmPcpNodeCount SYSTEM "pgpool_adm_pcp_node_count.sgml"> <!ENTITY pgpoolAdmPcpAttachNode SYSTEM "pgpool_adm_pcp_attach_node.sgml"> diff --git a/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml b/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml new file mode 100644 index 000000000..aa454918f --- /dev/null +++ b/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml @@ -0,0 +1,162 @@ +<!-- +doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml +Pgpool-II documentation +--> + +<refentry id="PGPOOL-ADM-PCP-HEAlTH-CHECK-STATS"> + <indexterm zone="pgpool-adm-pcp-health-check-stats"> + <primary>pgpool_adm_pcp_health_check_stats</primary> + </indexterm> + + <refmeta> + <refentrytitle>pgpool_adm_pcp_health_check_stats</refentrytitle> + <manvolnum>3</manvolnum> + <refmiscinfo>pgpool_adm extension</refmiscinfo> + </refmeta> + + <refnamediv> + <refname>pgpool_adm_pcp_health_check_stats</refname> + <refpurpose> + a function to display health check statistics data on given node ID</refpurpose> + </refnamediv> + + <refsynopsisdiv> + <funcsynopsis> + <funcprototype> + <funcdef><function>pcp_health_check_stats</function> returns record</funcdef> + <paramdef>integer <parameter>node_id</parameter></paramdef> + <paramdef>text <parameter>host</parameter></paramdef> + <paramdef>integer <parameter>port</parameter></paramdef> + <paramdef>text <parameter>username</parameter></paramdef> + <paramdef>text <parameter>password</parameter></paramdef> + <paramdef>out <parameter>node_id integer</parameter></paramdef> + <paramdef>out <parameter>host text</parameter></paramdef> + <paramdef>out <parameter>port integer</parameter></paramdef> + <paramdef>out <parameter>status text</parameter></paramdef> + <paramdef>out <parameter>role text</parameter></paramdef> + <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef> + <paramdef>out <parameter>total_count bigint</parameter></paramdef> + <paramdef>out <parameter>success_count bigint</parameter></paramdef> + <paramdef>out <parameter>fail_count bigint</parameter></paramdef> + <paramdef>out <parameter>skip_count bigint</parameter></paramdef> + <paramdef>out <parameter>retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef> + <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef> + </funcprototype> + + <funcprototype> + <funcdef><function>pcp_health_check_stats</function> returns record</funcdef> + <paramdef>integer <parameter>node_id</parameter></paramdef> + <paramdef>text <parameter>pcp_server</parameter></paramdef> + <paramdef>out <parameter>node_id integer</parameter></paramdef> + <paramdef>out <parameter>host text</parameter></paramdef> + <paramdef>out <parameter>port integer</parameter></paramdef> + <paramdef>out <parameter>status text</parameter></paramdef> + <paramdef>out <parameter>role text</parameter></paramdef> + <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef> + <paramdef>out <parameter>total_count bigint</parameter></paramdef> + <paramdef>out <parameter>success_count bigint</parameter></paramdef> + <paramdef>out <parameter>fail_count bigint</parameter></paramdef> + <paramdef>out <parameter>skip_count bigint</parameter></paramdef> + <paramdef>out <parameter>retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef> + <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef> + <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef> + <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef> + <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef> + </funcprototype> + + </funcsynopsis> + </refsynopsisdiv> + + <refsect1 id="R3-PCP-HEALTH-CHECK-STATS-3"> + <title>Description</title> + <para> + <function>pcp_health_check_stats</function> + displays health check statistics data on given node ID. + </para> + </refsect1> + + <refsect1> + <title>Arguments</title> + <para> + <variablelist> + + <varlistentry> + <term><replaceable class="parameter">node_id</replaceable></term> + <listitem> + <para> + The index of backend node to get information of. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable class="parameter">pcp_server</replaceable></term> + <listitem> + <para> + The foreign server name for pcp server. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>Other arguments </option></term> + <listitem> + <para> + See <xref linkend="pcp-common-options">. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </refsect1> + + <refsect1> + <title>Example</title> + <para> + Here is an example output: + <programlisting> +test=# select * from pcp_health_check_stats(0,'',11001,'t-ishii','t-ishii'); +-[ RECORD 1 ]-----------------+-------------------- +node_id | 0 +host | /tmp +port | 11002 +status | up +role | primary +last_status_change | 2020-02-25 16:05:29 +total_count | 3 +success_count | 3 +fail_count | 0 +skip_count | 0 +retry_count | 0 +average_retry_count | 0 +max_retry_count | 0 +max_health_check_duration | 5 +min_health_check_duration | 3 +average_health_check_duration | 4.333333 +last_health_check | 2020-02-25 16:05:47 +last_successful_health_check | 2020-02-25 16:05:47 +last_skip_health_check | +last_failed_health_check | + </programlisting> + </para> + + <para> + See <xref linkend="health-check-stats-data-table"> for details of data. + </para> + + </refsect1> + +</refentry> diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index 5ba2892fb..41fb2e672 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -239,6 +239,7 @@ </partintro> &pgpoolAdmPcpNodeInfo + &pgpoolAdmPcpHealthCheckStats &pgpoolAdmPcpPoolStatus &pgpoolAdmPcpNodeCount &pgpoolAdmPcpAttachNode diff --git a/src/sql/pgpool_adm/Makefile b/src/sql/pgpool_adm/Makefile index cb8c5c007..abd457fc8 100644 --- a/src/sql/pgpool_adm/Makefile +++ b/src/sql/pgpool_adm/Makefile @@ -5,7 +5,8 @@ OBJS = pgpool_adm.o PG_CPPFLAGS = -I$(libpq_srcdir) -I../../include/pcp EXTENSION = pgpool_adm -DATA = pgpool_adm--1.0.sql pgpool_adm--1.1.sql pgpool_adm--1.2.sql pgpool_adm--1.0--1.1.sql pgpool_adm--1.1--1.2.sql +DATA = pgpool_adm--1.0.sql pgpool_adm--1.1.sql pgpool_adm--1.2.sql pgpool_adm--1.3.sql \ +pgpool_adm--1.0--1.1.sql pgpool_adm--1.1--1.2.sql pgpool_adm--1.2--1.3.sql SHLIB_LINK = -L../../libs/pcp/.libs -lpcp -Wl,--as-needed -Wl,-rpath,'${prefix}/lib',--enable-new-dtags # if you are using PostgreSQL 8.0 or later, # using pg_config is recommended. diff --git a/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql b/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql index 547e2a15a..9d84671b7 100644 --- a/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql +++ b/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql @@ -3,9 +3,7 @@ -- complain if script is sourced in psql, rather than via ALTER EXTENSION \echo Use "ALTER EXTENSION pgpool_adm UPDATE TO '1.1'" to load this file. \quit -ALTER EXTENSION pgpool_adm DROP FUNCTION CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT last_status_change timestamp) - -CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT replication_state text, OUT replication_sync_state text, OUT last_status_change timestamp) +CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp); RETURNS record -AS 'MODULE_PATHNAME', '_pcp_node_info' +AS 'MODULE_PATHNAME', '_pcp_health_check_stats' LANGUAGE C VOLATILE STRICT; diff --git a/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql b/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql new file mode 100644 index 000000000..8c84f64c7 --- /dev/null +++ b/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql @@ -0,0 +1,10 @@ +/* contrib/pgpool_adm/pgpool_adm--1.2--1.3.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pgpool_adm UPDATE TO '1.3'" to load this file. \quit + +CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT node_id integer, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT success_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_health_check_stats' +LANGUAGE C VOLATILE STRICT; + diff --git a/src/sql/pgpool_adm/pgpool_adm--1.3.sql b/src/sql/pgpool_adm/pgpool_adm--1.3.sql new file mode 100644 index 000000000..069f88652 --- /dev/null +++ b/src/sql/pgpool_adm/pgpool_adm--1.3.sql @@ -0,0 +1,101 @@ +/* contrib/pgpool_adm/pgpool_adm--1.3.sql */ + +/* *********************************************** + * Administrative functions for pgPool + * *********************************************** */ + +/** + * input parameters: node_id, host, port, username, password + */ +CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT replication_state text, OUT replication_sync_state text, OUT last_status_change timestamp) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_node_info' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, server_name + */ +CREATE FUNCTION pcp_node_info(integer, text, OUT host text, OUT port integer, OUT status text, OUT weight float4) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_node_info' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, host, port, username, password + */ +CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT node_id integer, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT success_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_health_check_stats' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, server_name + */ +CREATE FUNCTION pcp_health_check_stats(integer, text, OUT host text, OUT port integer, OUT status text, OUT weight float4) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_health_check_stats' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: host, port, username, password + */ +CREATE FUNCTION pcp_pool_status(text, integer, text, text, OUT item text, OUT value text, OUT description text) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_pool_status' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: server_name + */ +CREATE FUNCTION pcp_pool_status(text, OUT item text, OUT value text, OUT description text) +RETURNS record +AS 'MODULE_PATHNAME', '_pcp_pool_status' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: host, port, username, password + */ +CREATE FUNCTION pcp_node_count(text, integer, text, text, OUT node_count integer) +RETURNS integer +AS 'MODULE_PATHNAME', '_pcp_node_count' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: server_name + */ +CREATE FUNCTION pcp_node_count(text, OUT node_count integer) +RETURNS integer +AS 'MODULE_PATHNAME', '_pcp_node_count' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, host, port, username, password + */ +CREATE FUNCTION pcp_attach_node(integer, text, integer, text, text, OUT node_attached boolean) +RETURNS boolean +AS 'MODULE_PATHNAME', '_pcp_attach_node' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, server_name + */ +CREATE FUNCTION pcp_attach_node(integer, text, OUT node_attached boolean) +RETURNS boolean +AS 'MODULE_PATHNAME', '_pcp_attach_node' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, gracefully, host, port, username, password + */ +CREATE FUNCTION pcp_detach_node(integer, boolean, text, integer, text, text, OUT node_detached boolean) +RETURNS boolean +AS 'MODULE_PATHNAME', '_pcp_detach_node' +LANGUAGE C VOLATILE STRICT; + +/** + * input parameters: node_id, gracefully, server_name + */ +CREATE FUNCTION pcp_detach_node(integer, boolean, text, OUT node_detached boolean) +RETURNS boolean +AS 'MODULE_PATHNAME', '_pcp_detach_node' +LANGUAGE C VOLATILE STRICT; diff --git a/src/sql/pgpool_adm/pgpool_adm.c b/src/sql/pgpool_adm/pgpool_adm.c index 85b73ca57..f2295d908 100644 --- a/src/sql/pgpool_adm/pgpool_adm.c +++ b/src/sql/pgpool_adm/pgpool_adm.c @@ -3,7 +3,7 @@ * pgpool_adm.c * * - * Copyright (c) 2002-2019, PostgreSQL Global Development Group + * Copyright (c) 2002-2020, PostgreSQL Global Development Group * * Author: Jehan-Guillaume (ioguix) de Rorthais <jgdr@dalibo.com> * @@ -38,7 +38,7 @@ static PCPConnInfo * connect_to_server(char *host, int port, char *user, char *pass); static PCPConnInfo * connect_to_server_from_foreign_server(char *name); - +static Timestamp str2timestamp(char *str); /** * Wrapper around pcp_connect @@ -570,3 +570,162 @@ _pcp_detach_node(PG_FUNCTION_ARGS) PG_RETURN_BOOL(true); } + +/** + * nodeID: the node id to get info from + * host_or_srv: server name or ip address of the pgpool server + * port: pcp port number + * user: user to connect with + * pass: password + **/ +Datum +_pcp_health_check_stats(PG_FUNCTION_ARGS) +{ + int16 nodeID = PG_GETARG_INT16(0); + char *host_or_srv = text_to_cstring(PG_GETARG_TEXT_PP(1)); + + PCPConnInfo *pcpConnInfo; + PCPResultInfo *pcpResInfo; + + POOL_HEALTH_CHECK_STATS *stats; + Datum values[20]; /* values to build the returned tuple from */ + bool nulls[] = {false, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false}; + TupleDesc tupledesc; + HeapTuple tuple; + AttrNumber an; + int i; + + if (nodeID < 0 || nodeID >= MAX_NUM_BACKENDS) + ereport(ERROR, (0, errmsg("NodeID is out of range."))); + + if (PG_NARGS() == 5) + { + char *user, + *pass; + int port; + + port = PG_GETARG_INT16(2); + user = text_to_cstring(PG_GETARG_TEXT_PP(3)); + pass = text_to_cstring(PG_GETARG_TEXT_PP(4)); + pcpConnInfo = connect_to_server(host_or_srv, port, user, pass); + } + else if (PG_NARGS() == 2) + { + pcpConnInfo = connect_to_server_from_foreign_server(host_or_srv); + } + else + { + ereport(ERROR, (0, errmsg("Wrong number of argument."))); + } + + pcpResInfo = pcp_health_check_stats(pcpConnInfo, nodeID); + if (pcpResInfo == NULL || PCPResultStatus(pcpResInfo) != PCP_RES_COMMAND_OK) + { + char *error = pcp_get_last_error(pcpConnInfo) ? pstrdup(pcp_get_last_error(pcpConnInfo)) : NULL; + + pcp_disconnect(pcpConnInfo); + pcp_free_connection(pcpConnInfo); + ereport(ERROR, (0, + errmsg("failed to get node information"), + errdetail("%s\n", error ? error : "unknown reason"))); + } + + /** + * Construct a tuple descriptor for the result rows. + **/ +#if defined(PG_VERSION_NUM) && (PG_VERSION_NUM >= 120000) + tupledesc = CreateTemplateTupleDesc(20); +#else + tupledesc = CreateTemplateTupleDesc(20, false); +#endif + an = 1; + TupleDescInitEntry(tupledesc, an++, "node_id", INT4OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "hostname", TEXTOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "port", INT4OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "status", TEXTOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "role", TEXTOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "last_status_change", TIMESTAMPOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "total_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "success_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "fail_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "skip_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "retry_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "average_retry_count", FLOAT4OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "max_retry_count", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "max_health_check_duration", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "min_health_check_duration", INT8OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "average_health_check_duration", FLOAT4OID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "last_health_check", TIMESTAMPOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "last_successful_health_check", TIMESTAMPOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "last_skip_health_check", TIMESTAMPOID, -1, 0); + TupleDescInitEntry(tupledesc, an++, "last_failed_health_check", TIMESTAMPOID, -1, 0); + + tupledesc = BlessTupleDesc(tupledesc); + + stats = (POOL_HEALTH_CHECK_STATS *) pcp_get_binary_data(pcpResInfo, 0); + + /* set values */ + i = 0; + values[i++] = Int32GetDatum(nodeID); + values[i++] = CStringGetTextDatum(stats->hostname); + values[i++] = Int32GetDatum(atoi(stats->port)); + values[i++] = CStringGetTextDatum(stats->status); + values[i++] = CStringGetTextDatum(stats->role); + + if (*stats->last_status_change == '\0') + nulls[i++] = true; + else + values[i++] = str2timestamp(stats->last_status_change); + + values[i++] = Int64GetDatum(atol(stats->total_count)); + values[i++] = Int64GetDatum(atol(stats->success_count)); + values[i++] = Int64GetDatum(atol(stats->fail_count)); + values[i++] = Int64GetDatum(atol(stats->skip_count)); + values[i++] = Int64GetDatum(atol(stats->retry_count)); + values[i++] = Float4GetDatum(atof(stats->average_retry_count)); + values[i++] = Int64GetDatum(atol(stats->max_retry_count)); + values[i++] = Int64GetDatum(atol(stats->max_health_check_duration)); + values[i++] = Int64GetDatum(atol(stats->min_health_check_duration)); + values[i++] = Float4GetDatum(atof(stats->average_health_check_duration)); + + if (*stats->last_health_check =='\0' ) + nulls[i++] = true; + else + values[i++] = str2timestamp(stats->last_health_check); + + if (*stats->last_successful_health_check == '\0') + nulls[i++] = true; + else + values[i++] = str2timestamp(stats->last_successful_health_check); + + if (*stats->last_skip_health_check == '\0') + nulls[i++] = true; + else + values[i++] = str2timestamp(stats->last_skip_health_check); + + if (*stats->last_failed_health_check == '\0') + nulls[i++] = true; + else + values[i++] = str2timestamp(stats->last_failed_health_check); + + pcp_disconnect(pcpConnInfo); + pcp_free_connection(pcpConnInfo); + + /* build and return the tuple */ + tuple = heap_form_tuple(tupledesc, values, nulls); + + ReleaseTupleDesc(tupledesc); + + PG_RETURN_DATUM(HeapTupleGetDatum(tuple)); +} + +static +Timestamp str2timestamp(char *str) +{ + return (DatumGetTimestamp(DirectFunctionCall3(timestamp_in, + CStringGetDatum(str), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1)))); +} + diff --git a/src/sql/pgpool_adm/pgpool_adm.control b/src/sql/pgpool_adm/pgpool_adm.control index fc550df3d..9310ca0ad 100644 --- a/src/sql/pgpool_adm/pgpool_adm.control +++ b/src/sql/pgpool_adm/pgpool_adm.control @@ -1,5 +1,5 @@ # pcp extension comment = 'Administrative functions for pgPool' -default_version = '1.2' +default_version = '1.3' module_pathname = '$libdir/pgpool_adm' relocatable = true diff --git a/src/sql/pgpool_adm/pgpool_adm.h b/src/sql/pgpool_adm/pgpool_adm.h index 7dbbd9ec5..e10e81e56 100644 --- a/src/sql/pgpool_adm/pgpool_adm.h +++ b/src/sql/pgpool_adm/pgpool_adm.h @@ -20,12 +20,14 @@ PG_MODULE_MAGIC; Datum _pcp_node_info(PG_FUNCTION_ARGS); +Datum _pcp_health_check_stats(PG_FUNCTION_ARGS); Datum _pcp_pool_status(PG_FUNCTION_ARGS); Datum _pcp_node_count(PG_FUNCTION_ARGS); Datum _pcp_attach_node(PG_FUNCTION_ARGS); Datum _pcp_detach_node(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(_pcp_node_info); +PG_FUNCTION_INFO_V1(_pcp_health_check_stats); PG_FUNCTION_INFO_V1(_pcp_pool_status); PG_FUNCTION_INFO_V1(_pcp_node_count); PG_FUNCTION_INFO_V1(_pcp_attach_node); [parent: fbf29db03a36]