{"id":11402,"date":"2018-07-12T05:17:46","date_gmt":"2018-07-12T03:17:46","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/"},"modified":"2018-07-12T05:17:46","modified_gmt":"2018-07-12T03:17:46","slug":"active-session-history-in-postgresql-say-hello-to-pgsentinel","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/","title":{"rendered":"Active session history in PostgreSQL: Say hello to pgSentinel"},"content":{"rendered":"<p>There is new project, currently in beta, which aims to bring active session history (and probably more) to PostgreSQL: <a href=\"https:\/\/www.pgsentinel.com\/\" target=\"_blank\" rel=\"noopener\">pgSentinel<\/a>. Because PostgreSQL is highly extensible such projects are possible and usually are coming as an extension. pgSentinel is no exception to that so lets see how it can be installed. When you want to try the beta for your own, please connect with the project on <a href=\"https:\/\/twitter.com\/Pg_Sentinel\" target=\"_blank\" rel=\"noopener\">twitter<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>This is what I got:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/beta\/ [pg103] ll\ntotal 120\n-rw-r--r--. 1 postgres postgres   1108 Jul  8 22:13 pgsentinel--1.0.sql\n-rw-r--r--. 1 postgres postgres    117 Jul  5 22:15 pgsentinel.control\n-rwxr-xr-x. 1 postgres postgres 108000 Jul  9 11:12 pgsentinel.so\n-rw-r--r--. 1 postgres postgres    623 Jul  9 11:22 readme.txt\n<\/pre>\n<p>You can already see from here that we probably need to load a library because of the pgsentinel.so file. Lets copy that to the correct locations, in my case:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/beta\/ [pg103] cp pgsentinel--1.0.sql pgsentinel.control \/u01\/app\/postgres\/product\/10\/db_3\/share\/extension\/\npostgres@pgbox:\/home\/postgres\/beta\/ [pg103] cp pgsentinel.so \/u01\/app\/postgres\/product\/10\/db_3\/lib\/\n<\/pre>\n<p>As I plan to run <a href=\"https:\/\/www.postgresql.org\/docs\/10\/current\/pgbench.html\" target=\"_blank\" rel=\"noopener\">pgbench<\/a> later to get some load onto the system I&#8217;ve created a separate database for installing the extension:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG10] psql -c \"create database bench\" postgres\nCREATE DATABASE\npostgres@pgbox:\/home\/postgres\/ [PG10] pgbench -i -s 10 bench\n<\/pre>\n<p>When we need to load a library we need to tell PostgreSQL about that by setting the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-client.html#GUC-SHARED-PRELOAD-LIBRARIES\" target=\"_blank\" rel=\"noopener\">shared_preload_libraries<\/a> parameter. As pgsentinel depends on <a href=\"https:\/\/www.postgresql.org\/docs\/10\/static\/pgstatstatements.html\" target=\"_blank\" rel=\"noopener\">pg_stat_statements<\/a> this needs to be installed as well.<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# alter system set shared_preload_libraries='pg_stat_statements,pgsentinel';\nALTER SYSTEM\n<\/pre>\n<p>So once we have that set and the instance is restarted:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/beta\/ [PG10] pg_ctl -D $PGDATA restart -m fast\n<\/pre>\n<p>&#8230; we should see the new extension in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/view-pg-available-extensions.html\" target=\"_blank\" rel=\"noopener\">pg_available_extensions<\/a> view:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select * from pg_available_extensions where name = 'pgsentinel';\n    name    | default_version | installed_version |        comment         \n------------+-----------------+-------------------+------------------------\n pgsentinel | 1.0             |                   | active session history\n(1 row)\n<\/pre>\n<p>Ready to install the extensions:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create extension pg_stat_statements;\nCREATE EXTENSION\npostgres=# create extension pgsentinel ;\nCREATE EXTENSION\npostgres=# dx\n                                     List of installed extensions\n        Name        | Version |   Schema   |                        Description                        \n--------------------+---------+------------+-----------------------------------------------------------\n pg_stat_statements | 1.5     | public     | track execution statistics of all SQL statements executed\n pgsentinel         | 1.0     | public     | active session history\n plpgsql            | 1.0     | pg_catalog | PL\/pgSQL procedural language\n(3 rows)\n<\/pre>\n<p>So what did we get? One solution is to look at the sql file:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\ncat pgsentinel--1.0.sql\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\necho Use \"CREATE EXTENSION pgsentinel\" to load this file. quit\n\nCREATE FUNCTION pg_active_session_history(\n    OUT ash_time timestamptz,\n    OUT datid Oid,\n    OUT datname text,\n    OUT pid integer,\n    OUT usesysid Oid,\n    OUT usename text,\n    OUT application_name text,\n    OUT client_addr text,\n    OUT client_hostname text,\n    OUT client_port integer,\n    OUT backend_start timestamptz,\n    OUT xact_start timestamptz,\n    OUT query_start timestamptz,\n    OUT state_change timestamptz,\n    OUT wait_event_type text,\n    OUT wait_event text,\n    OUT state text,\n    OUT backend_xid xid,\n    OUT backend_xmin xid,\n    OUT top_level_query text,\n    OUT query text,\n    OUT queryid bigint,\n    OUT backend_type text\n   \n)\nRETURNS SETOF record\nAS 'MODULE_PATHNAME', 'pg_active_session_history'\nLANGUAGE C STRICT VOLATILE PARALLEL SAFE;\n\n-- Register a view on the function for ease of use.\nCREATE VIEW pg_active_session_history AS\n  SELECT * FROM pg_active_session_history();\n\nGRANT SELECT ON pg_active_session_history TO PUBLIC;\n<\/pre>\n<p>The other solution is to ask PostgreSQL directly:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nbench=# dx+ pgsentinel \n  Objects in extension \"pgsentinel\"\n          Object description          \n--------------------------------------\n function pg_active_session_history()\n view pg_active_session_history\n(2 rows)\n<\/pre>\n<p>Basically we got a function and a view over that function. Lets have a look at the view then:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# d pg_active_session_history\n                   View \"public.pg_active_session_history\"\n      Column      |           Type           | Collation | Nullable | Default \n------------------+--------------------------+-----------+----------+---------\n ash_time         | timestamp with time zone |           |          | \n datid            | oid                      |           |          | \n datname          | text                     |           |          | \n pid              | integer                  |           |          | \n usesysid         | oid                      |           |          | \n usename          | text                     |           |          | \n application_name | text                     |           |          | \n client_addr      | text                     |           |          | \n client_hostname  | text                     |           |          | \n client_port      | integer                  |           |          | \n backend_start    | timestamp with time zone |           |          | \n xact_start       | timestamp with time zone |           |          | \n query_start      | timestamp with time zone |           |          | \n state_change     | timestamp with time zone |           |          | \n wait_event_type  | text                     |           |          | \n wait_event       | text                     |           |          | \n state            | text                     |           |          | \n backend_xid      | xid                      |           |          | \n backend_xmin     | xid                      |           |          | \n top_level_query  | text                     |           |          | \n query            | text                     |           |          | \n queryid          | bigint                   |           |          | \n backend_type     | text                     |           |          | \n<\/pre>\n<p>Most of the columns are already in <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW\" target=\"_blank\" rel=\"noopener\">pg_stat_activity<\/a> but there is more. Before going further lets generate some load:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG10] pgbench -c 5 -j 4 -T 60 bench \nstarting vacuum...end.\ntransaction type: \nscaling factor: 10\nquery mode: simple\nnumber of clients: 5\nnumber of threads: 4\nduration: 60 s\nnumber of transactions actually processed: 151397\nlatency average = 1.982 ms\ntps = 2522.898859 (including connections establishing)\ntps = 2523.280694 (excluding connections establishing)\n<\/pre>\n<p>Now we should see sampled data in the pg_active_session_history view:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nbench=# select ash_time,top_level_query,query,queryid,wait_event_type,wait_event from pg_active_session_history limit 10;\n           ash_time            |                               top_level_query                               |                                   query                                    |  queryid   | wait_event_type |  wait_event   \n-------------------------------+-----------------------------------------------------------------------------+----------------------------------------------------------------------------+------------+-----------------+---------------\n 2018-07-09 14:51:48.883599+02 | create database bench                                                       | create database bench                                                      | 3222771996 | CPU             | CPU\n 2018-07-09 14:52:37.291115+02 | copy pgbench_accounts from stdin                                            | copy pgbench_accounts from stdin                                           | 4164808321 | CPU             | CPU\n 2018-07-09 14:52:38.292674+02 | alter table pgbench_accounts add primary key (aid)                          | alter table pgbench_accounts add primary key (aid)                         | 4164808321 | CPU             | CPU\n 2018-07-09 14:55:51.111621+02 | UPDATE pgbench_branches SET bbalance = bbalance + 2228 WHERE bid = 4;       | UPDATE pgbench_branches SET bbalance = bbalance + 2228 WHERE bid = 4       |  553956422 | Lock            | transactionid\n 2018-07-09 14:55:51.111621+02 | END;                                                                        | END                                                                        | 3376944276 | CPU             | CPU\n 2018-07-09 14:55:51.111621+02 | UPDATE pgbench_accounts SET abalance = abalance + -2408 WHERE aid = 973208; | UPDATE pgbench_accounts SET abalance = abalance + -2408 WHERE aid = 973208 | 2992934481 | CPU             | CPU\n 2018-07-09 14:55:52.112507+02 | UPDATE pgbench_tellers SET tbalance = tbalance + -4957 WHERE tid = 87;      | UPDATE pgbench_tellers SET tbalance = tbalance + -4957 WHERE tid = 87      | 3459630226 | Client          | ClientRead\n 2018-07-09 14:55:52.112507+02 | END;                                                                        | END                                                                        | 3376944276 | LWLock          | WALWriteLock\n 2018-07-09 14:55:52.112507+02 | END;                                                                        | END                                                                        | 3376944276 | CPU             | CPU\n 2018-07-09 14:55:52.112507+02 | UPDATE pgbench_branches SET bbalance = bbalance + -3832 WHERE bid = 8;      | UPDATE pgbench_branches SET bbalance = bbalance + -3832 WHERE bid = 8      |  553956422 | Lock            | transactionid\n(10 rows)\n<\/pre>\n<p>The important point here is that we have the queryid which we can use to map that back to pg_stat_statements. So if we want to know what the shared_blks_* statistics for the update statement with query id 553956422 are, we can do that (or write a join over the two views, of course):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nbench=# select shared_blks_hit,shared_blks_read,shared_blks_dirtied,shared_blks_written from pg_stat_statements where queryid = 553956422;\n shared_blks_hit | shared_blks_read | shared_blks_dirtied | shared_blks_written \n-----------------+------------------+---------------------+---------------------\n          453201 |               29 |                  37 |                   0\n(1 row)\n<\/pre>\n<p>Really looks promising, automatic session sampling in PostgreSQL. More tests to come &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There is new project, currently in beta, which aims to bring active session history (and probably more) to PostgreSQL: pgSentinel. Because PostgreSQL is highly extensible such projects are possible and usually are coming as an extension. pgSentinel is no exception to that so lets see how it can be installed. When you want to try [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-11402","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Active session history in PostgreSQL: Say hello to pgSentinel - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Active session history in PostgreSQL: Say hello to pgSentinel\" \/>\n<meta property=\"og:description\" content=\"There is new project, currently in beta, which aims to bring active session history (and probably more) to PostgreSQL: pgSentinel. Because PostgreSQL is highly extensible such projects are possible and usually are coming as an extension. pgSentinel is no exception to that so lets see how it can be installed. When you want to try [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-12T03:17:46+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Active session history in PostgreSQL: Say hello to pgSentinel\",\"datePublished\":\"2018-07-12T03:17:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/\"},\"wordCount\":340,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/\",\"name\":\"Active session history in PostgreSQL: Say hello to pgSentinel - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2018-07-12T03:17:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/active-session-history-in-postgresql-say-hello-to-pgsentinel\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Active session history in PostgreSQL: Say hello to pgSentinel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\\\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/westermanndanie\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/daniel-westermann\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Active session history in PostgreSQL: Say hello to pgSentinel - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/","og_locale":"en_US","og_type":"article","og_title":"Active session history in PostgreSQL: Say hello to pgSentinel","og_description":"There is new project, currently in beta, which aims to bring active session history (and probably more) to PostgreSQL: pgSentinel. Because PostgreSQL is highly extensible such projects are possible and usually are coming as an extension. pgSentinel is no exception to that so lets see how it can be installed. When you want to try [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/","og_site_name":"dbi Blog","article_published_time":"2018-07-12T03:17:46+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Active session history in PostgreSQL: Say hello to pgSentinel","datePublished":"2018-07-12T03:17:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/"},"wordCount":340,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/","url":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/","name":"Active session history in PostgreSQL: Say hello to pgSentinel - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2018-07-12T03:17:46+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/active-session-history-in-postgresql-say-hello-to-pgsentinel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Active session history in PostgreSQL: Say hello to pgSentinel"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=11402"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11402\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=11402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=11402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=11402"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=11402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}