{"id":830,"date":"2024-06-13T12:33:03","date_gmt":"2024-06-13T12:33:03","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=830"},"modified":"2024-06-13T12:33:03","modified_gmt":"2024-06-13T12:33:03","slug":"setup-prometheus-pushgateway-vm","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=830","title":{"rendered":"Setup Prometheus Pushgateway VM: A Step-by-Step Guide"},"content":{"rendered":"<p>In this blog, we are going to look at the installation and configuration of the Prometheus Pushgateway on a Linux <a href=\"https:\/\/devopscube.com\/install-configure-prometheus-linux\/\">VM based prometheus setup.<\/a><\/p>\n<blockquote><p><strong>Note:<\/strong> For Kubernetes based promtheus, refer <a href=\"https:\/\/devopscube.com\/setup-prometheus-pushgateway-on-kubernetes\/\">Pushgateway on Kubernetes <\/a>blog.<\/p><\/blockquote>\n<h2 id=\"pushgateway-workflow\"><strong>Pushgateway Workflow<\/strong><\/h2>\n<p>Assume that you have some short-lived jobs or batch jobs, Prometheus sometimes can&#8217;t scrape the metrics of that particular job due to the scrape interval settings. In such cases, we can use Pushgateway.<\/p>\n<p>The jobs short-lived jobs themselves push the metrics to the Pushgateway and will hold for a certain period. From the Pushgateway server, Prometheus will pull the metrics. So it is like a temporary hub to store the metrics so that prometheus wont miss it.<\/p>\n<p>The following image shows the <strong>Pushgateway<\/strong> workflow in detail.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/pushgateway-1.gif\" class=\"kg-image\" alt=\"Prometheus Pushgateway workflow.\" loading=\"lazy\" width=\"777\" height=\"760\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/pushgateway-1.gif 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/pushgateway-1.gif 777w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Here is how it works.<\/p>\n<ol>\n<li>First, we have to instrument our short lived jobs or tasks to send metrics to the Pushgateway over HTTP.<\/li>\n<li>When the task executes, the metrics will be sent to the Pushgateway.<\/li>\n<li>Prometheus will periodically pull the metrics from the Pushgateway and store them in the <strong>Time Series Database.<\/strong><\/li>\n<li>Finally, we can make <strong>PromQL<\/strong> queries from Prometheus or other tools like Grafana, to see the information.<\/li>\n<\/ol>\n<p><strong>Note<\/strong>: The Pushgateway will store the metrics in its temporary storage section. So when the new metrics comes in, the old ones will be deleted.<\/p>\n<h2 id=\"prometheus-pushgateway-on-virtual-machine\">Prometheus Pushgateway on Virtual Machine<\/h2>\n<p>In this setup, I am using two EC2 instances<\/p>\n<ol>\n<li>First instance has a running prometheus server<\/li>\n<li>In the second instance I am going to configure the Pushgateway as a standalone setup.<\/li>\n<\/ol>\n<h3 id=\"step-1-install-prometheus-pushgateway\">Step 1: Install Prometheus Pushgateway<\/h3>\n<p>The first step is to download the Prometheus Pushgateway binaries from the official repository. Here we are using the latest version of the Pushgateway, which is v1.6.2.<\/p>\n<pre><code>wget https:\/\/github.com\/prometheus\/pushgateway\/releases\/download\/v1.6.2\/pushgateway-1.6.2.linux-amd64.tar.gz<\/code><\/pre>\n<p>Unzip the tar file<\/p>\n<pre><code>tar xvf pushgateway-1.6.2.linux-amd64.tar.gz<\/code><\/pre>\n<p>Change the directory name to <strong>pushgateway<\/strong> and enter it into the directory.<\/p>\n<pre><code>mv pushgateway-1.6.2.linux-amd64 pushgateway\ncd pushgateway\/<\/code><\/pre>\n<p>Create a user for Pushgateway.<\/p>\n<pre><code>sudo useradd -rs \/bin\/false pushgateway<\/code><\/pre>\n<p>Copy the pushgateway directory to the <code>\/usr\/local\/bin<\/code> directory.<\/p>\n<pre><code>sudo cp pushgateway \/usr\/local\/bin\/<\/code><\/pre>\n<p>Give permission only for pushgateway users to that particular directory.<\/p>\n<pre><code>sudo chown pushgateway:pushgateway \/usr\/local\/bin\/pushgateway<\/code><\/pre>\n<p>Create a service file for Pushgateway.<\/p>\n<pre><code>sudo cat &lt;&lt;EOT &gt; \/etc\/systemd\/system\/pushgateway.service\n[Unit]\nDescription=Prometheus Pushgateway\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nUser=pushgateway\nGroup=pushgateway\nType=simple\nExecStart=\/usr\/local\/bin\/pushgateway\n\n[Install]\nWantedBy=multi-user.target\nEOT<\/code><\/pre>\n<p>Start and enable the Pushgateway service.<\/p>\n<pre><code>sudo systemctl enable pushgateway\nsudo systemctl start pushgateway<\/code><\/pre>\n<p>Check the status and ensure configurations are properly done.<\/p>\n<pre><code>sudo systemctl status pushgateway<\/code><\/pre>\n<p>To see the collected metrics from the local system, use the following command. The default Port number of the Prometheus Pushgateway is <code>9091<\/code>.<\/p>\n<pre><code>curl localhost:9091\/metrics<\/code><\/pre>\n<p>If you want to see the Pushgateway dashboard over the internet, use the <strong>Public IP<\/strong> of the server with the <strong>Port number.<\/strong><\/p>\n<p>The output you will see is this.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-32-16.png\" class=\"kg-image\" alt=\"prometheus pushgateway dashboard\" loading=\"lazy\" width=\"1146\" height=\"1031\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-32-16.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-32-16.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-32-16.png 1146w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Now, you can&#8217;t see any information in the Metrics tab, we have to configure it from the application or server to push the metrics, and then only it is visible to our Pushgateway dashboard.<\/p>\n<p>But before that, we have to configure the Prometheus to pull the metrics from the Pushgateway, then only we can make queries and visualize the metrics.<\/p>\n<h3 id=\"step-2-configure-a-job-on-prometheus\">Step 2: Configure a Job on Prometheus<\/h3>\n<p>The following configuration has be to done on the prometheus server.<\/p>\n<p>In the <strong>Prometheus<\/strong> configuration file <code>\/etc\/prometheus\/prometheus.yml<\/code>, you have to add a new scrape config for the <strong>pushgateway.<\/strong><\/p>\n<p>Open the configuration file.<\/p>\n<pre><code>sudo vim \/etc\/prometheus\/prometheus.yml<\/code><\/pre>\n<p>Add a job named Pushgateway in the configuration file as given below.<\/p>\n<pre><code>global:\n  scrape_interval: 5s \n  evaluation_interval: 5s \n  \nscrape_configs: \n  - job_name: \"pushgateway\"\n    honor_labels: true\n    static_configs:\n    - targets: [&lt;Public IP&gt;:9091]<\/code><\/pre>\n<p>Under the <strong>scrape_config<\/strong> section, you need to add a new job for Pushgateway.<\/p>\n<p>Instead of <code>scrape_configs.job_name: \"pushgateway\"<\/code>, you can give any name for your job, and the second parameter you can see is <code>scrape_configs.honor_labels: true<\/code><strong>,<\/strong> which means, that when we push the metrics to the Pushgateway, the labels from the <strong>target<\/strong> will be preserved, not overwritten by the gateway instance labels.<\/p>\n<p>The target parameter indicates the <strong>Public IP<\/strong> and the <strong>Port number<\/strong> of the Pushgateway server (Instance 02).<\/p>\n<p>You can also give the <strong>private IP<\/strong> if both your servers are in the same network, or if you are using a single server for the Prometheus and the Pushgateway, then you can simply mention <strong>[localhost:9091].<\/strong><\/p>\n<p>Now, you have to restart the service and ensure the configuration is properly done by viewing the status of the service.<\/p>\n<pre><code>sudo systemctl restart prometheus.service\nsudo systemctl status prometheus.service<\/code><\/pre>\n<p>You can also verify the job configuration from the Prometheus dashboard.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-19-18.png\" class=\"kg-image\" alt=\"prometheus dashboard for pushgateway target.\" loading=\"lazy\" width=\"1604\" height=\"1125\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-19-18.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-19-18.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2025\/03\/image-19-18.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-19-18.png 1604w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<h3 id=\"step-3-push-metrics-to-the-prometheus-pushgateway\">Step 3: Push Metrics to the Prometheus Pushgateway<\/h3>\n<p>For testing and validation purposes, we will use curl and python scripts to push the metrics to the Pushgateway and use Prometheus and Grafana to make queries and visualize the metrics.<\/p>\n<h4 id=\"example-1\">Example 1:<\/h4>\n<p>Create a simple script to push certain metrics.<\/p>\n<pre><code>vim curl_push.sh<\/code><\/pre>\n<p>Inside the file, add the below contents.<\/p>\n<pre><code>#!\/bin\/bash\n\ncat &lt;&lt;EOF | curl --data-binary @- http:\/\/&lt;pushgateway-address&gt;:9091\/metrics\/job\/batch_job\n\nbatch_job_duration_seconds $(date +%s)\nEOF\n<\/code><\/pre>\n<p>Instead of <code>&lt;pushgateway-address&gt;<\/code>, provide the actual IP of the Pushgateway, this script will track the current time of the script execution in milliseconds and push the values to the Pushgateway, and <code>batch_job_duration_seconds<\/code> is the metric name.<\/p>\n<p>After saving and quitting the script, give executable permission to this script.<\/p>\n<pre><code>chmod +x curl_push.sh<\/code><\/pre>\n<p>I am setting up this script with a <strong>cronjob<\/strong> so that it will run periodically.<\/p>\n<p>Open the crontab.<\/p>\n<pre><code>crontab -e<\/code><\/pre>\n<p>Add a line at the end of the file<\/p>\n<pre><code>*\/1 * * * * \/bin\/sh curl_push.sh<\/code><\/pre>\n<p>Then save and exit from the crontab, the script will automatically run every minute and push metrics to the Pushgateway.<\/p>\n<p>Now, you can check the Pushgateway dashboard to see the metrics.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-22-20.png\" class=\"kg-image\" alt=\"pushgateway dashboard\" loading=\"lazy\" width=\"1374\" height=\"1023\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-22-20.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-22-20.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-22-20.png 1374w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Let&#8217;s try to make a query from Prometheus so that we can know, whether the Prometheus scrape configuration is properly working or not.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-23-23.png\" class=\"kg-image\" alt=\"prometheus dashboard\" loading=\"lazy\" width=\"757\" height=\"467\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-23-23.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-23-23.png 757w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>If you want to visualize this metric using Grafana, you will get a similar output, and if you want to know the installation of Grafana, refer to this <a href=\"https:\/\/devopscube.com\/integrate-visualize-prometheus-grafana\/\">blog<\/a>.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-24-17.png\" class=\"kg-image\" alt=\"grafana dashboard\" loading=\"lazy\" width=\"761\" height=\"573\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-24-17.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-24-17.png 761w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>I will show you one more example of pushing metrics to the Pushgateway using a Python script with <strong>Prometheus Client Libraries<\/strong><\/p>\n<h4 id=\"example-2\">Example 2:<\/h4>\n<p>If you have a Python application and you want to send the metrics to the Pushgateway, then this example would help you.<\/p>\n<p>Make sure pip and Python or Python3 are available on your system, which is necessary to perform this example.<\/p>\n<p>First, you need to install the <strong>Prometheus client library<\/strong> in your system.<\/p>\n<pre><code>pip install prometheus_client<\/code><\/pre>\n<p>Now, you have to integrate this library into the application or the script to push the metrics. this script will create some random values and push them to the Pushgateway.<\/p>\n<p>To know more about the client libraries, please refer to the <a href=\"https:\/\/prometheus.io\/docs\/instrumenting\/clientlibs\/?ref=devopscube.com\">official documentation<\/a>.<\/p>\n<p>Create a file with <strong>.py <\/strong>as<strong> <\/strong>an extension.<\/p>\n<pre><code>vim python_script.py<\/code><\/pre>\n<p>Add the contents to this file <strong>python_script.py<\/strong><\/p>\n<pre><code>from prometheus_client import CollectorRegistry, Gauge, push_to_gateway, write_to_textfile\nimport random\nimport time\n\npush_gateway_url = 'http:\/\/&lt;pushgateway-IP_address&gt;:9091'\n\njob_name = 'python_job'\ninstance_name = 'my_instance'\n\nregistry = CollectorRegistry()\n\nrandom_metric = Gauge('random_metric', 'Random metric generated by Python script', ['label_name'], registry=registry)\n\nwhile True:\n    value = random.randint(1, 100)\n\n    labels = {'label_name': 'example_label'}\n\n    random_metric.labels(**labels).set(value)\n\n    push_to_gateway(push_gateway_url, job=job_name, registry=registry, grouping_key={'instance': instance_name})\n\n    write_to_textfile('metrics.txt', registry)\n\n    time.sleep(10)<\/code><\/pre>\n<p>Replace the <strong>push_gateway_url <\/strong>value and provide your Pushgateway IP address and port number. also, modify the <strong>job_name<\/strong> and the<strong> instance_name<\/strong> if you want.<\/p>\n<p>This time I want to see how <strong>Gauge<\/strong> metrics work with Pushgateway, for that, I have created this script to produce some random values.<\/p>\n<p>To run this script, use the following command.<\/p>\n<pre><code>python3 python_script.py<\/code><\/pre>\n<p>Let&#8217;s check the Pushgateway dashboard to see if the above script is generating metrics.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-28-16.png\" class=\"kg-image\" alt=\"pushgateway dashboard\" loading=\"lazy\" width=\"967\" height=\"570\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-28-16.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-28-16.png 967w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>The script will generate values every 10 seconds and push them to the Pushgateway. also, the Prometheus will scrape the metrics from the Pushgateway every 5 seconds.<\/p>\n<blockquote><p>Pushgateway will not store all the values it getting. in each push, the values will be replaced, which means you can see only one set of data in the Pushgateway.<\/p><\/blockquote>\n<p>In our setup, every 10 seconds the Pushgateway data will be overwritten. when a new set of data comes, the old one will be deleted.<\/p>\n<p>I am letting Prometheus collect some metrics so that we can visualize them better in the Grafana.<\/p>\n<p>First, make a query  Prometheus to see the result.<\/p>\n<pre><code>random_metric[1m]<\/code><\/pre>\n<p>This PromQL query will show the last one-minute changes in that particular metric <strong>random_metric.<\/strong><\/p>\n<p><strong>Prometheus output<\/strong><\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-29-18.png\" class=\"kg-image\" alt=\"prometheus dashboard\" loading=\"lazy\" width=\"967\" height=\"534\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-29-18.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-29-18.png 967w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Here, you can see the metric <strong>random_metric<\/strong> has 12 samples with timestamps, this is because I have set the <strong>scrape_interval<\/strong> to 5 seconds, which means that the Prometheus will collect <strong>60\/5=12 <\/strong>samples in a minute.<\/p>\n<p><strong>Grafana output<\/strong><\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-30-15.png\" class=\"kg-image\" alt=\"grafana dashboard for pushgateway metrics\" loading=\"lazy\" width=\"966\" height=\"801\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-30-15.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-30-15.png 966w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>This is how Grafana visualizes the metrics that we have collected from the Python script.<\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>I have implemented this setup for testing purposes, in real-time, the use cases might be different. So you can get the overall idea of the working principle of the Pushgateway from thia guide and make improvements when you implement it in your projects.<\/p>\n<p>There are some other Exporters also available, such as Node Exporter, Blackbox Exporter, etc. Explore them to get more ideas and use cases.<\/p>\n<hr>\n<p><strong>Ngu\u1ed3n:<\/strong> <a href=\"https:\/\/devopscube.com\/setup-prometheus-pushgateway-vm\/\" target=\"_blank\" rel=\"noopener noreferrer\">Setup Prometheus Pushgateway VM: A Step-by-Step Guide \u2014 DevOpsCube<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source: https:\/\/devopscube.com\/setup-prometheus-pushgateway-vm\/<\/p>\n","protected":false},"author":1,"featured_media":831,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-830","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=830"}],"version-history":[{"count":0,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/830\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/media\/831"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}