{"id":381632,"date":"2024-06-29T03:46:52","date_gmt":"2024-06-29T03:46:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=381632"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T03:46:52","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=381632","title":{"rendered":"<span>Monitoring CPU\/RAM\/disk metrics with OpenTelemetry and Uptrace<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>OpenTeleletry Collector is an open source data collection pipeline that allows you to monitor CPU, RAM, disk, network metrics, and many more.<\/p>\n<p>Collector itself does not include built-in storage or analysis capabilities, but you can export the data to Uptrace and ClickHouse, using them as a replacement for Grafana and Prometheus.<\/p>\n<p>When compared to Prometheus, ClickHouse can offer smaller on-disk data size and better query performance when analyzing millions of timeseries.<\/p>\n<h3>What is OpenTelemetry?<\/h3>\n<p><a href=\"https:\/\/uptrace.dev\/opentelemetry\/\" rel=\"noopener noreferrer nofollow\">OpenTelemetry<\/a> is an open-source observability framework hosted by Cloud Native Computing Foundation. It is a merger of OpenCensus and OpenTracing projects.<\/p>\n<p>OpenTelemetry provides a standardized way to capture and transmit metrics, traces, and logs from various software components in a distributed system.<\/p>\n<p>OpenTelemetry is designed to be vendor-agnostic and supports multiple programming languages, making it suitable for a wide range of applications and environments.<\/p>\n<h3>OpenTelemetry Collector<\/h3>\n<p>OpenTelemetry Collector is a middleware between instrumented applications and various backends or observability platforms.<\/p>\n<p>OpenTelemetry Collector can also act as an agent that pulls telemetry data from systems you want to monitor and sends it to tracing tools using the OpenTelemetry protocol.<\/p>\n<p>For example, Collector can <a href=\"https:\/\/uptrace.dev\/blog\/redis-monitoring.html\" rel=\"noopener noreferrer nofollow\">monitor Redis<\/a> by periodically running the <code>INFO<\/code> command to collect telemetry data and send it to your observability pipeline for analysis and monitoring.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ho\/yr\/30\/hoyr30lkvxrzebkgudlycelmnfu.png\" alt=\"Otel Collector Pipeline\" data-src=\"https:\/\/habrastorage.org\/webt\/ho\/yr\/30\/hoyr30lkvxrzebkgudlycelmnfu.png\"\/><\/p>\n<div><figcaption>Otel Collector Pipeline<\/figcaption><\/div>\n<\/figure>\n<h3>Host metrics<\/h3>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-collector-contrib\/blob\/main\/receiver\/hostmetricsreceiver\/README.md\" rel=\"noopener noreferrer nofollow\">hostmetricsreceiver<\/a> is an OpenTelemetry Collector plugin that gathers various metrics about the host system, for example, CPU, RAM, disk metrics and other system-level metrics.<\/p>\n<p>However, OpenTelemetry itself does not include built-in storage or analysis capabilities for the collected data. Instead, you can export the data to an <a href=\"https:\/\/uptrace.dev\/blog\/opentelemetry-backend.html\" rel=\"noopener noreferrer nofollow\">OpenTelemetry backend<\/a> of your choice such as Prometheus or Uptrace.<\/p>\n<p>To start collecting host metrics, you need to <a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector.html#installation\" rel=\"noopener noreferrer nofollow\">install Otel Collector<\/a> on each system you want to monitor and add the following lines to the Collector config:<\/p>\n<pre><code class=\"yaml\">receivers:   hostmetrics:     collection_interval: 10s     scrapers:       # CPU utilization metrics       cpu:       # Disk I\/O metrics       disk:       # File System utilization metrics       filesystem:       # CPU load metrics       load:       # Memory utilization metrics       memory:       # Network interface I\/O metrics &amp; TCP connection metrics       network:       # Paging\/Swap space utilization and I\/O metrics       paging: <\/code><\/pre>\n<p>See <a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector-host-metrics.html\" rel=\"noopener noreferrer nofollow\">OpenTelemetry Collector host metrics<\/a> documentation for details.<\/p>\n<h3>What is Uptrace?<\/h3>\n<p>Uptrace is an <a href=\"https:\/\/uptrace.dev\/get\/open-source-apm.html\" rel=\"noopener noreferrer nofollow\">open source APM tool<\/a> that supports distributed tracing, metrics, and logs. You can use it to monitor applications and set up automatic alerts to receive notifications via email, Slack, Telegram, and more.<\/p>\n<p>Uptrace uses OpenTelelemetry to collect data and ClickHouse database to store it. Uptrace also requires PostgreSQL database to store metadata such as metric names and alerts.<\/p>\n<p>You can <a href=\"https:\/\/uptrace.dev\/get\/install.html\" rel=\"noopener noreferrer nofollow\">install Uptrace<\/a> binary or use the <a href=\"https:\/\/github.com\/uptrace\/uptrace\/tree\/master\/example\/docker\" rel=\"noopener noreferrer nofollow\">Docker example<\/a> to run the backend with a single command.<\/p>\n<p>After starting Uptrace, you will receive a data source name (DSN) that contains connection details for Uptrace.<\/p>\n<p>You can then export the data from Collector to Uptrace using the OTLP exporter and passing the DSN in headers:<\/p>\n<pre><code class=\"yaml\">exporters:   otlp\/uptrace:     endpoint: localhost:14317     tls: { insecure: true }     headers: { 'uptrace-dsn': 'http:\/\/project1_secret_token@localhost:14317\/1' } <\/code><\/pre>\n<h3>Dashboards<\/h3>\n<p>Uptrace maintains dashboards templates for monitoring system metrics, Redis, PostgreSQL, MySQL, Kafka, JVM, and many more. When the relevant metrics start arriving to Uptrace, it automatically creates dashboards from templates saving your time.<\/p>\n<p>Uptrace supports 2 types of dashboards:<\/p>\n<ul>\n<li>\n<p>A <strong>grid-based<\/strong> dashboard looks like a classical grid of charts.<\/p>\n<\/li>\n<li>\n<p>A <strong>table-based<\/strong> dashboard is a table of items where each item leads to a separate grid-based dashboard for the item, for example, a table of hostnames with some metrics for each hostname.<\/p>\n<\/li>\n<\/ul>\n<p>In other words, table-based dashboards allow to parameterize grid-based dashboards with attributes from the table. For example, Uptrace uses a table-based dashboard to monitor number of sampled and dropped spans for each project:<\/p>\n<pre><code class=\"yaml\">metrics:   - uptrace.projects.spans as $spans query:   - $spans{type='spans'} as sampled_spans   - $spans{type='dropped'} as dropped_spans   - group by project_id <\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">project_id<\/p>\n<\/th>\n<th>\n<p align=\"left\">sampled_spans<\/p>\n<\/th>\n<th>\n<p align=\"left\">dropped_spans<\/p>\n<\/th>\n<th>\n<p align=\"left\">Link to a grid-based dashboard<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 1<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">110<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">999<\/p>\n<\/td>\n<td>\n<p align=\"left\">90<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 999<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ep\/yq\/ih\/epyqihxljohayjzdgdplu7uwkvo.png\" alt=\"CPU metrics by host\" data-src=\"https:\/\/habrastorage.org\/webt\/ep\/yq\/ih\/epyqihxljohayjzdgdplu7uwkvo.png\"\/><\/p>\n<div><figcaption>CPU metrics by host<\/figcaption><\/div>\n<\/figure>\n<h3>Monitoring<\/h3>\n<p>You can also use Uptrace to create alerts and receive notifications when metric values meet certain conditions, for example, you can create an alert when <code>system.filesystem.usage<\/code> metric exceeds 90%.<\/p>\n<pre><code class=\"yaml\">monitors:   - name: Filesystem usage     metrics:       - system.filesystem.usage as $fs_usage     query:       - $fs_usage{state='used'} \/ $fs_usage as fs_util       - group by host.name, mountpoint       - where mountpoint !~ \"\/snap\"     columns:       fs_util: { unit: utilization }     max_value: 0.9     for_duration: 3 <\/code><\/pre>\n<p>To monitor CPU usage, you can use the <code>system.cpu.load_average.15m<\/code> metrics and number of cores from the <code>system.cpu.time<\/code> metric:<\/p>\n<pre><code class=\"yaml\">monitors:   - name: CPU usage     metrics:       - system.cpu.load_average.15m as $load_avg_15m       - system.cpu.time as $cpu_time     query:       - $load_avg_15m \/ uniq($cpu_time.cpu) as cpu_util       - group by host.name     columns:       cpu_util: { unit: utilization }     max_value: 3     for_duration: 10 <\/code><\/pre>\n<h3>Conclusion<\/h3>\n<p>Uptrace complements the data collection capabilities of OpenTelemetry by providing the necessary infrastructure and functionality for storing, analyzing, and extracting insights from the collected telemetry data.<\/p>\n<p>Besides metrics, Uptrace also supports 2 other major observability signals such as traces and logs, allowing you have all data on a single pane.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/uptrace.dev\/get\/get-started.html\" rel=\"noopener noreferrer nofollow\">Get started with Uptrace<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector.html\" rel=\"noopener noreferrer nofollow\">Install OpenTelemetry Collector<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/737508\/\"> https:\/\/habr.com\/ru\/articles\/737508\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>OpenTeleletry Collector is an open source data collection pipeline that allows you to monitor CPU, RAM, disk, network metrics, and many more.<\/p>\n<p>Collector itself does not include built-in storage or analysis capabilities, but you can export the data to Uptrace and ClickHouse, using them as a replacement for Grafana and Prometheus.<\/p>\n<p>When compared to Prometheus, ClickHouse can offer smaller on-disk data size and better query performance when analyzing millions of timeseries.<\/p>\n<h3>What is OpenTelemetry?<\/h3>\n<p><a href=\"https:\/\/uptrace.dev\/opentelemetry\/\" rel=\"noopener noreferrer nofollow\">OpenTelemetry<\/a> is an open-source observability framework hosted by Cloud Native Computing Foundation. It is a merger of OpenCensus and OpenTracing projects.<\/p>\n<p>OpenTelemetry provides a standardized way to capture and transmit metrics, traces, and logs from various software components in a distributed system.<\/p>\n<p>OpenTelemetry is designed to be vendor-agnostic and supports multiple programming languages, making it suitable for a wide range of applications and environments.<\/p>\n<h3>OpenTelemetry Collector<\/h3>\n<p>OpenTelemetry Collector is a middleware between instrumented applications and various backends or observability platforms.<\/p>\n<p>OpenTelemetry Collector can also act as an agent that pulls telemetry data from systems you want to monitor and sends it to tracing tools using the OpenTelemetry protocol.<\/p>\n<p>For example, Collector can <a href=\"https:\/\/uptrace.dev\/blog\/redis-monitoring.html\" rel=\"noopener noreferrer nofollow\">monitor Redis<\/a> by periodically running the <code>INFO<\/code> command to collect telemetry data and send it to your observability pipeline for analysis and monitoring.<\/p>\n<figure class=\"\">\n<div><figcaption>Otel Collector Pipeline<\/figcaption><\/div>\n<\/figure>\n<h3>Host metrics<\/h3>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-collector-contrib\/blob\/main\/receiver\/hostmetricsreceiver\/README.md\" rel=\"noopener noreferrer nofollow\">hostmetricsreceiver<\/a> is an OpenTelemetry Collector plugin that gathers various metrics about the host system, for example, CPU, RAM, disk metrics and other system-level metrics.<\/p>\n<p>However, OpenTelemetry itself does not include built-in storage or analysis capabilities for the collected data. Instead, you can export the data to an <a href=\"https:\/\/uptrace.dev\/blog\/opentelemetry-backend.html\" rel=\"noopener noreferrer nofollow\">OpenTelemetry backend<\/a> of your choice such as Prometheus or Uptrace.<\/p>\n<p>To start collecting host metrics, you need to <a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector.html#installation\" rel=\"noopener noreferrer nofollow\">install Otel Collector<\/a> on each system you want to monitor and add the following lines to the Collector config:<\/p>\n<pre><code class=\"yaml\">receivers:   hostmetrics:     collection_interval: 10s     scrapers:       # CPU utilization metrics       cpu:       # Disk I\/O metrics       disk:       # File System utilization metrics       filesystem:       # CPU load metrics       load:       # Memory utilization metrics       memory:       # Network interface I\/O metrics &amp; TCP connection metrics       network:       # Paging\/Swap space utilization and I\/O metrics       paging: <\/code><\/pre>\n<p>See <a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector-host-metrics.html\" rel=\"noopener noreferrer nofollow\">OpenTelemetry Collector host metrics<\/a> documentation for details.<\/p>\n<h3>What is Uptrace?<\/h3>\n<p>Uptrace is an <a href=\"https:\/\/uptrace.dev\/get\/open-source-apm.html\" rel=\"noopener noreferrer nofollow\">open source APM tool<\/a> that supports distributed tracing, metrics, and logs. You can use it to monitor applications and set up automatic alerts to receive notifications via email, Slack, Telegram, and more.<\/p>\n<p>Uptrace uses OpenTelelemetry to collect data and ClickHouse database to store it. Uptrace also requires PostgreSQL database to store metadata such as metric names and alerts.<\/p>\n<p>You can <a href=\"https:\/\/uptrace.dev\/get\/install.html\" rel=\"noopener noreferrer nofollow\">install Uptrace<\/a> binary or use the <a href=\"https:\/\/github.com\/uptrace\/uptrace\/tree\/master\/example\/docker\" rel=\"noopener noreferrer nofollow\">Docker example<\/a> to run the backend with a single command.<\/p>\n<p>After starting Uptrace, you will receive a data source name (DSN) that contains connection details for Uptrace.<\/p>\n<p>You can then export the data from Collector to Uptrace using the OTLP exporter and passing the DSN in headers:<\/p>\n<pre><code class=\"yaml\">exporters:   otlp\/uptrace:     endpoint: localhost:14317     tls: { insecure: true }     headers: { 'uptrace-dsn': 'http:\/\/project1_secret_token@localhost:14317\/1' } <\/code><\/pre>\n<h3>Dashboards<\/h3>\n<p>Uptrace maintains dashboards templates for monitoring system metrics, Redis, PostgreSQL, MySQL, Kafka, JVM, and many more. When the relevant metrics start arriving to Uptrace, it automatically creates dashboards from templates saving your time.<\/p>\n<p>Uptrace supports 2 types of dashboards:<\/p>\n<ul>\n<li>\n<p>A <strong>grid-based<\/strong> dashboard looks like a classical grid of charts.<\/p>\n<\/li>\n<li>\n<p>A <strong>table-based<\/strong> dashboard is a table of items where each item leads to a separate grid-based dashboard for the item, for example, a table of hostnames with some metrics for each hostname.<\/p>\n<\/li>\n<\/ul>\n<p>In other words, table-based dashboards allow to parameterize grid-based dashboards with attributes from the table. For example, Uptrace uses a table-based dashboard to monitor number of sampled and dropped spans for each project:<\/p>\n<pre><code class=\"yaml\">metrics:   - uptrace.projects.spans as $spans query:   - $spans{type='spans'} as sampled_spans   - $spans{type='dropped'} as dropped_spans   - group by project_id <\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">project_id<\/p>\n<\/th>\n<th>\n<p align=\"left\">sampled_spans<\/p>\n<\/th>\n<th>\n<p align=\"left\">dropped_spans<\/p>\n<\/th>\n<th>\n<p align=\"left\">Link to a grid-based dashboard<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 1<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">110<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">999<\/p>\n<\/td>\n<td>\n<p align=\"left\">90<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dash with <code>where project_id = 999<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"\">\n<div><figcaption>CPU metrics by host<\/figcaption><\/div>\n<\/figure>\n<h3>Monitoring<\/h3>\n<p>You can also use Uptrace to create alerts and receive notifications when metric values meet certain conditions, for example, you can create an alert when <code>system.filesystem.usage<\/code> metric exceeds 90%.<\/p>\n<pre><code class=\"yaml\">monitors:   - name: Filesystem usage     metrics:       - system.filesystem.usage as $fs_usage     query:       - $fs_usage{state='used'} \/ $fs_usage as fs_util       - group by host.name, mountpoint       - where mountpoint !~ \"\/snap\"     columns:       fs_util: { unit: utilization }     max_value: 0.9     for_duration: 3 <\/code><\/pre>\n<p>To monitor CPU usage, you can use the <code>system.cpu.load_average.15m<\/code> metrics and number of cores from the <code>system.cpu.time<\/code> metric:<\/p>\n<pre><code class=\"yaml\">monitors:   - name: CPU usage     metrics:       - system.cpu.load_average.15m as $load_avg_15m       - system.cpu.time as $cpu_time     query:       - $load_avg_15m \/ uniq($cpu_time.cpu) as cpu_util       - group by host.name     columns:       cpu_util: { unit: utilization }     max_value: 3     for_duration: 10 <\/code><\/pre>\n<h3>Conclusion<\/h3>\n<p>Uptrace complements the data collection capabilities of OpenTelemetry by providing the necessary infrastructure and functionality for storing, analyzing, and extracting insights from the collected telemetry data.<\/p>\n<p>Besides metrics, Uptrace also supports 2 other major observability signals such as traces and logs, allowing you have all data on a single pane.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/uptrace.dev\/get\/get-started.html\" rel=\"noopener noreferrer nofollow\">Get started with Uptrace<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/uptrace.dev\/opentelemetry\/collector.html\" rel=\"noopener noreferrer nofollow\">Install OpenTelemetry Collector<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/737508\/\"> https:\/\/habr.com\/ru\/articles\/737508\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-381632","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/381632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=381632"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/381632\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=381632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=381632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=381632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}