{"id":7931,"date":"2016-05-16T17:18:35","date_gmt":"2016-05-16T15:18:35","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/"},"modified":"2016-05-16T17:18:35","modified_gmt":"2016-05-16T15:18:35","slug":"a-look-at-postgresql-9-6-the-wait-interface","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/","title":{"rendered":"A look at PostgreSQL 9.6  &#8211; The wait interface"},"content":{"rendered":"<p>For a long time there was no real wait interface in PostgreSQL core. Now, with the upcoming <a href=\"http:\/\/www.postgresql.org\/docs\/9.6\/static\/release-9-6.html\" target=\"_blank\" rel=\"noopener\">9.6<\/a>, <a href=\"http:\/\/www.postgresql.org\/docs\/9.6\/static\/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW\" target=\"_blank\" rel=\"noopener\">pg_stat_activity<\/a> was extended to provide more meaningful information for what a session is currently waiting on.  If you are interested in reading through the history: It all started <a href=\"http:\/\/www.postgresql.org\/message-id\/CA+TgmoYd3GTz2_mJfUHF+RPe-bCy75ytJeKVv9x-o+SonCGApw@mail.gmail.com\" target=\"_blank\" rel=\"noopener\">here<\/a>. Lets have a look at it by doing same simple tests.<\/p>\n<p><!--more--><\/p>\n<p>When I want to see what a session is waiting for I&#8217;ll at least need two sessions: One doing some work and the other for querying the wait event information. Obviously I&#8217;ll need to know my backend process identifier which I then can use to query pg_stat_activity. PostgreSQL provides a function to get the backend process id:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; select * from pg_backend_pid();\n pg_backend_pid \n----------------\n           3048\n(1 row)\n<\/pre>\n<p>Using this session lets create a table and populate it with some rows: <\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; create table t1 (a int);\nCREATE TABLE\n(postgres@[local]:5432) [postgres] &gt; insert into t1 (a) values ( generate_series(1,1000000) );\nINSERT 0 1000000\n<\/pre>\n<p>If you are fast enough to switch to the other session and query for the wait event you&#8217;ll see this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; select wait_event_type,wait_event from pg_stat_activity where pid = 3048;\n wait_event_type |  wait_event  \n-----------------+--------------\n LWLockNamed     | WALWriteLock\n(1 row)\n<\/pre>\n<p>So, what does this mean? The <a href=\"http:\/\/www.postgresql.org\/docs\/9.6\/static\/monitoring-stats.html#WAIT-EVENT-TABLE\" target=\"_blank\" rel=\"noopener\">documentation<\/a> gives the answer:<\/p>\n<ul>\n<li><b>LWLockNamed<\/b>: The backend is waiting for a specific named lightweight lock. Each such lock protects a particular data structure in shared memory. wait_event will contain the name of the lightweight lock.<\/li>\n<li><b>WALWriteLock<\/b>: Waiting for WAL buffers to be written to disk.<\/li>\n<\/ul>\n<p>Makes sense: Changed data needs to be written to the <a href=\"http:\/\/www.postgresql.org\/docs\/9.6\/static\/runtime-config-wal.html\" target=\"_blank\" rel=\"noopener\">WAL<\/a>. <\/p>\n<p>Another example: In one session I&#8217;ll start a transaction and update one row in the table without closing\/committing the same: <\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; begin;\nBEGIN\nTime: 0.103 ms\n(postgres@[local]:5432) [postgres] &gt; update t1 set a = 2 where a = 1;\nUPDATE 1\nTime: 56.086 ms\n(postgres@[local]:5432) [postgres] &gt; \n<\/pre>\n<p>In a third session lets try to update the same row:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; select * from pg_backend_pid();\n pg_backend_pid \n----------------\n           3397\n(1 row)\n\nTime: 0.220 ms\n(postgres@[local]:5432) [postgres] &gt; update t1 set a = 2 where a = 1;\n<\/pre>\n<p>This should cause a wait event, but which one?<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; select wait_event_type,wait_event from pg_stat_activity where pid = 3397;\n wait_event_type |  wait_event   \n-----------------+---------------\n Lock            | transactionid\n(1 row)\n<\/pre>\n<p>Another event type and another event:<\/p>\n<ul>\n<li><b>Lock<\/b>: The backend is waiting for a heavyweight lock. Heavyweight locks, also known as lock manager locks or simply locks, primarily protect SQL-visible objects such as tables. However, they are also used to ensure mutual exclusion for certain internal operations such as relation extension. wait_event will identify the type of lock awaited.<\/li>\n<li><b>transactionid<\/b>: Waiting for a transaction to finish<\/li>\n<\/ul>\n<p>In PostgreSQL <a href=\"http:\/\/dbi-services.com\/blog\/transactional-ddl\/\" target=\"_blank\" rel=\"noopener\">DDL is transactional<\/a>, too, so we should be able to create another wait event when we try to modify the table in one session:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; begin;\nBEGIN\nTime: 0.085 ms\n(postgres@[local]:5432) [postgres] &gt; alter table t1 add column b int;\nALTER TABLE\nTime: 0.318 ms\n(postgres@[local]:5432) [postgres] &gt; \n<\/pre>\n<p>&#8230; and then try to update a row in another session:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; update t1 set a = 2 where a = 1;\n<\/pre>\n<p>What is reported?<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5432) [postgres] &gt; select wait_event_type,wait_event from pg_stat_activity where pid = 3397;\n wait_event_type | wait_event \n-----------------+------------\n Lock            | relation\n(1 row)\n<\/pre>\n<ul>\n<li><b>Lock<\/b>: The backend is waiting for a heavyweight lock. Heavyweight locks, also known as lock manager locks or simply locks, primarily protect SQL-visible objects such as tables. However, they are also used to ensure mutual exclusion for certain internal operations such as relation extension. wait_event will identify the type of lock awaited.<\/li>\n<li><b>relation<\/b>: Waiting to acquire a lock on a relation.<\/li>\n<\/ul>\n<p>Currently there are <a href=\"http:\/\/www.postgresql.org\/docs\/9.6\/static\/monitoring-stats.html#WAIT-EVENT-TABLE\" target=\"_blank\" rel=\"noopener\">68 documented wait events<\/a> and I am sure more will show up during the next releases. This is a huge help if you need to troubleshoot sessions because now you do not need extensions any more and do not need to compile PostgreSQL with <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/dynamic-trace.html\" target=\"_blank\" rel=\"noopener\">dynamic tracing<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For a long time there was no real wait interface in PostgreSQL core. Now, with the upcoming 9.6, pg_stat_activity was extended to provide more meaningful information for what a session is currently waiting on. If you are interested in reading through the history: It all started here. Lets have a look at it by doing [&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":[67,77,230],"type_dbi":[],"class_list":["post-7931","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-performance","tag-postgresql","tag-wait-event"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A look at PostgreSQL 9.6 - The wait interface - 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\/a-look-at-postgresql-9-6-the-wait-interface\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A look at PostgreSQL 9.6 - The wait interface\" \/>\n<meta property=\"og:description\" content=\"For a long time there was no real wait interface in PostgreSQL core. Now, with the upcoming 9.6, pg_stat_activity was extended to provide more meaningful information for what a session is currently waiting on. If you are interested in reading through the history: It all started here. Lets have a look at it by doing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-16T15:18:35+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=\"3 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\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"A look at PostgreSQL 9.6 &#8211; The wait interface\",\"datePublished\":\"2016-05-16T15:18:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/\"},\"wordCount\":482,\"commentCount\":0,\"keywords\":[\"Performance\",\"PostgreSQL\",\"wait event\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/\",\"name\":\"A look at PostgreSQL 9.6 - The wait interface - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2016-05-16T15:18:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/a-look-at-postgresql-9-6-the-wait-interface\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A look at PostgreSQL 9.6 &#8211; The wait interface\"}]},{\"@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":"A look at PostgreSQL 9.6 - The wait interface - 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\/a-look-at-postgresql-9-6-the-wait-interface\/","og_locale":"en_US","og_type":"article","og_title":"A look at PostgreSQL 9.6 - The wait interface","og_description":"For a long time there was no real wait interface in PostgreSQL core. Now, with the upcoming 9.6, pg_stat_activity was extended to provide more meaningful information for what a session is currently waiting on. If you are interested in reading through the history: It all started here. Lets have a look at it by doing [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/","og_site_name":"dbi Blog","article_published_time":"2016-05-16T15:18:35+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"A look at PostgreSQL 9.6 &#8211; The wait interface","datePublished":"2016-05-16T15:18:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/"},"wordCount":482,"commentCount":0,"keywords":["Performance","PostgreSQL","wait event"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/","url":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/","name":"A look at PostgreSQL 9.6 - The wait interface - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-05-16T15:18:35+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-look-at-postgresql-9-6-the-wait-interface\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A look at PostgreSQL 9.6 &#8211; The wait interface"}]},{"@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\/7931","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=7931"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/7931\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=7931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=7931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=7931"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=7931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}