{"id":92073,"date":"2020-08-22T19:41:56","date_gmt":"2020-08-22T17:41:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io"},"modified":"2020-08-22T19:41:56","modified_gmt":"2020-08-22T17:41:56","slug":"post-mortem-po-nedostupnosti-quay-io","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io","title":{"rendered":"Post Mortem on Quay.io Downtime","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Note: translation.<\/b>: in early August, Red Hat publicly discussed the resolution of accessibility issues that users of its service had encountered in recent months <noindex><a rel=\"nofollow\" href=\"http:\/\/quay.io\/\">Quay.io<\/a><\/noindex> (based on a registry for container images, which came to the company with the acquisition of CoreOS). Regardless of your interest in this service itself, the journey that the SRE engineers took to diagnose and resolve the causes of the outage is enlightening.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Post Mortem on Quay.io Downtime\" src=\"\/wp-content\/uploads\/2020\/08\/67ef7fddee25448ae68ae7f4700bb25b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOn May 19, early in the morning (EDT), the quay.io service went down. The outage affected both quay.io customers and open source projects using quay.io as a platform for building and distributing software. Red Hat values the trust of both groups.<\/p>\n<p>The SRE engineering team immediately engaged and tried to stabilize the Quay service as quickly as possible. However, while they were working on that, customers lost the ability to push new images and could only occasionally pull existing ones. For unknown reasons, the quay.io database was locking up after scaling the service to full capacity.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>\u00ab<b>What Changed?<\/b>\" \u2014 this is the first question typically asked in such cases. We noticed that shortly before the problem, the OpenShift Dedicated cluster (on which quay.io runs) began updating to version 4.3.19. Since quay.io operates on Red Hat OpenShift Dedicated (OSD), regular updates had been a routine operation and had never caused issues. Moreover, over the past six months, we had updated the Quay clusters several times without any service interruptions.<\/p>\n<p>While we were trying to restore service, other engineers started preparing a new OSD cluster with the previous version of the software, so that everything could be deployed on it if needed.<\/p>\n<h2>Root Cause Analysis<\/h2>\n<p>\nThe main symptom of the failure was an avalanche of tens of thousands of connections to the database, rendering the MySQL instance virtually inoperative. This made it difficult to diagnose the problem. We set a limit on the maximum number of client connections to help the SRE team assess the issue. No unusual traffic to the database was noted: in fact, most queries were for reading, with only a few for writing.<\/p>\n<p>We also tried to identify a pattern in the database traffic that could have triggered this avalanche. However, no patterns could be found in the logs. While waiting for the new cluster with OSD 4.3.18 to be ready, we continued our attempts to launch the quay.io pods. Each time the cluster reached full capacity, the database would hang. This meant it was necessary to restart the RDS instance in addition to all quay.io pods.<\/p>\n<p>By evening, we stabilized the service in read-only mode and disabled as many non-critical functions (such as garbage collection in the namespace) to reduce the load on the database. The hangs stopped, <b>but the root cause was never found.<\/b>. The new OSD cluster was ready, and we moved the service, connected the traffic, and continued monitoring.<\/p>\n<p>Quay.io was running smoothly on the new OSD cluster, so we returned to the database logs, but we still couldn\u2019t find any correlation to explain the locks. OpenShift engineers worked with us to try to determine whether changes in Red Hat OpenShift 4.3.19 could have led to issues with Quay. However, nothing was discovered, and <b>we were unable to reproduce the problem in the lab.<\/b>.<\/p>\n<h2>The second failure<\/h2>\n<p>\non May 28, just before noon EDT, quay.io crashed again with the same symptom: the database operations were locked. Once again, we diverted all resources to the investigation. First and foremost, we needed to restore the service. However, <b>This time, restarting the RDS and the quay.io pods did not help.<\/b>Quay is written in Python, and each pod operates as a single monolithic container. Within the container runtime, multiple parallel tasks are executed simultaneously. We use the<\/p>\n<p>gevent <code>library for handling web requests. When a request comes to Quay (via our own API or through the Docker API), a gevent worker is assigned to it. This worker is usually supposed to connect to the database. After the first failure, we found that the gevent workers connected to the database using the default settings.<\/code> under <code>gunicorn<\/code> For processing web requests. When a request comes into Quay (through our own API or through Docker's API), a gevent worker is assigned. Typically, this worker should connect to the database. After the first failure, we found that the gevent workers connected to the database using default settings.<\/p>\n<p>Given the significant number of Quay pods and the thousands of incoming requests per second, a large number of database connections could theoretically overload the MySQL instance. Monitoring indicated that Quay was handling an average of 5,000 requests per second. Approximately the same number of connections to the database was noted. 5,000 connections comfortably fit within the capabilities of our RDS instance (unlike the tens of thousands). <b>For some reason, there were unexpected spikes in the number of connections<\/b>, however, we did not observe any correlation with incoming requests.<\/p>\n<p>This time we resolutely decided to find and eliminate the source of the problem rather than just rebooting. Changes were made in the Quay codebase <b>Changes were made to limit the number of database connections for each worker.<\/b> gevent. This number became a configurable parameter: it was possible to change it 'on the fly' without building a new container image. To determine the number of connections that could actually be handled, we conducted several tests in a staging environment, where different values were set to see how it would affect load testing scenarios. Ultimately, it turned out that <b>Quay starts returning 502 errors when the number of connections exceeds 10,000.<\/b><\/p>\n<p>We immediately deployed this new version to production and began monitoring the database connection graph. Previously, the database would lock up after about 20 minutes. After 30 problem-free minutes, we felt hopeful, and after an hour \u2014 confident. We restored write traffic to the site and began the postmortem analysis.<\/p>\n<p>By managing to bypass the problem that led to the blockage, <b>we did not uncover its true causes<\/b>. It was confirmed that it is not related to any changes in OpenShift 4.3.19, as the same issue occurred on version 4.3.18, which had previously worked with Quay without any problems.<\/p>\n<p>Clearly, something else was hidden in the cluster.<\/p>\n<h2>A detailed examination<\/h2>\n<p>\nQuay.io used default settings for connecting to the database for six years without any issues. What has changed? It is clear that traffic to quay.io has been steadily increasing all this time. In our case, it seemed like some threshold value had been reached, triggering a surge in connections. We continued to analyze the database logs after the second crash but found no patterns or obvious correlations.<\/p>\n<p>Meanwhile, the SRE team was working on improvements in request observability in Quay and the overall health of the service. <b>New metrics and dashboards were deployed<\/b>, showing which parts of Quay are most in demand by customers.<\/p>\n<p>Quay.io was functioning normally until June 9. In the morning (EDT), we again witnessed a significant increase in the number of database connections. <b>This time, there was no downtime<\/b>, as a new parameter limited their number and prevented exceeding MySQL's capacity. However, for about half an hour, many users reported slow performance on quay.io. We quickly gathered all possible data using the added monitoring tools. Suddenly, a pattern emerged.<\/p>\n<p><b>Right before the spike in connections, a large number of requests hit the App Registry API<\/b>. The App Registry is a lesser-known feature of quay.io. It allows storing things like Helm charts and containers with rich metadata. Most quay.io users do not work with this feature, but it is actively used by Red Hat OpenShift. The OperatorHub within OpenShift hosts all the operators in the App Registry. These operators form the foundation for the OpenShift workload ecosystem and operational model (within Day 2 operations) aimed at partners.<\/p>\n<p>Each OpenShift 4 cluster uses operators from the built-in OperatorHub to publish the catalog of available operators for installation and provide updates for those already installed. With the growing popularity of OpenShift 4, the number of clusters worldwide has also increased. Each of these clusters loads the contents of operators to launch the built-in OperatorHub, using App Registry within quay.io as a backend. <b>In the search for the source of the problem, we overlooked the fact that as OpenShift's popularity grew, the load on one of the rarely used features of quay.io also increased.<\/b>.<\/p>\n<p>We conducted some analysis of the request traffic to the App Registry and looked into the registry code. Immediately, shortcomings were revealed, causing database requests to be formed suboptimally. Under light load, they caused no issues; however, as the load increased, they became problematic. The App Registry had two problematic endpoints that poorly responded to increased load: the first returned a list of all packages in the repository, and the second returned all blobs for a package.<\/p>\n<h2>Addressing the causes<\/h2>\n<p>\nFor the entire following week, we focused on optimizing the code of the App Registry itself and its environment. Clearly inefficient SQL queries were rewritten, unnecessary command calls were eliminated (which were triggered on every blob extraction), and caching was added wherever possible. Then, extensive performance testing was conducted to compare the speed of the App Registry before and after the changes. <code>tar<\/code> (it was triggered on every blob extraction), caching was added wherever possible. Then extensive performance testing was conducted and the speed of App Registry was compared before and after the changes.<\/p>\n<p><b>. The following week, we deployed the changes to production, and since then, quay.io has been running smoothly. During this time, there were several sharp spikes in traffic on the App Registry endpoint, but the improvements made prevented database outages.<\/b>. Next week, we deployed the changes to production, and since then quay.io has been stable. During this time, there were several sharp spikes in traffic at the App Registry endpoint, but the improvements made prevented database outages.<\/p>\n<h2>It is clear that any service strives to avoid downtime. In our case, we believe that the recent failures helped make quay.io better. We took away several key lessons that we would like to share:<\/h2>\n<p>\nData on who and how uses your service is never unnecessary.<\/p>\n<ol>\n<li> <b>Since Quay was 'just working', we never felt the need to spend time optimizing traffic and managing load. All of this created a false sense of security that the service could scale indefinitely.<\/b>When a service goes down,<\/li>\n<li> restoring its operation is the top priority. <b>restoring its functionality is the main priority<\/b>As Quay continued to suffer from a locked database during the first outage, our standard procedures did not have the intended effect, and we were unable to restore service with their help. This led to a situation where we had to spend time analyzing and collecting data in hopes of finding the root cause \u2014 instead of directing all efforts toward restoring functionality.<\/li>\n<li> <b>Assess the impact of each service feature.<\/b>Clients rarely used the App Registry, so it was not a priority for our team. When certain product features are hardly utilized, their bugs rarely 'surface', and developers stop monitoring the code. It\u2019s easy to fall victim to the misconception that this is how it should be \u2014 until suddenly that feature becomes the center of a major incident.<\/li>\n<\/ol>\n<p><\/p>\n<h2>What's next?<\/h2>\n<p>\nWork on ensuring service stability never stops, and we continuously improve it. Traffic volumes on quay.io continue to grow, and we recognize that we must do everything possible to justify our clients' trust. Therefore, we are currently working on the following tasks:<\/p>\n<ol>\n<li> Deploying read-only database replicas to help the service handle the corresponding traffic in case there are issues with the primary RDS instance.<\/li>\n<li> Updating the RDS instance. The current version is not a problem in itself. Rather, we just want to eliminate the false lead (that we followed during the outage); keeping the software up to date will remove another factor in case of future outages.<\/li>\n<li> Additional caching throughout the cluster. We continue to look for areas where caching can reduce the load on the database.<\/li>\n<li> Adding a web application firewall (WAF) to see who connects to quay.io and why.<\/li>\n<li> Starting with the next release, Red Hat OpenShift clusters will discontinue the App Registry in favor of Operator Catalogs, which are based on container images available on quay.io.<\/li>\n<li> A long-term replacement for the App Registry may be support for the Open Container Initiative (OCI) artifact specifications. This is currently being implemented as native functionality in Quay and will be available to users once the specification is finalized.<\/li>\n<\/ol>\n<p>\nAll of the above is part of Red Hat's ongoing investment in quay.io as we transition from a small, startup-like team to a mature, SRE-managed platform. We understand that many of our clients rely on quay.io for their daily operations (including Red Hat!) and we strive to be as transparent as possible regarding recent outages and our ongoing efforts to improve.<\/p>\n<h2>P.S. from the translator<\/h2>\n<p>\nAlso read in our blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/news\/t\/475716\/\/\">Red Hat has open-sourced the container image registry from CoreOS \u2014 Quay<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/510486\/\">Practical stories from our SRE experiences. Part 2<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/461807\/\">How the priorities of pods in Kubernetes caused downtime at Grafana Labs<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/515932\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 Red Hat \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0430 \u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0435\u0451 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 Quay.io (\u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u2014 \u0440\u0435\u0435\u0441\u0442\u0440 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u043e\u043a\u0443\u043f\u043a\u043e\u0439 CoreOS). \u0412\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0448\u0435\u0439 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u043c, \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u0435\u043d \u0441\u0430\u043c \u043f\u0443\u0442\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u043b\u0438 SRE-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92074,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92073","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Post Mortem \u043f\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 Quay.io | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-22T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-22T17:41:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Post Mortem on the downtime of Quay.io | ProHoster","description":"Example.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Post Mortem \u043f\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 Quay.io | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/post-mortem-po-nedostupnosti-quay-io","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-22T17:41:56+00:00","article:modified_time":"2020-08-22T17:41:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92073","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:15:36","updated":"2022-10-02 22:37:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/92073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=92073"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/92073\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/92074"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=92073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=92073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=92073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}