{"id":26722,"date":"2024-02-05T05:00:00","date_gmt":"2024-02-05T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=26722"},"modified":"2024-02-14T13:05:23","modified_gmt":"2024-02-14T12:05:23","slug":"performance-under-control-with-k6-creating-extensions-for-k6","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-creating-extensions-for-k6\/","title":{"rendered":"Performance under control with k6 \u2013 creating extensions for k6"},"content":{"rendered":"\n<p>Performance testing tools provide invaluable support for developers, allowing them to assess the performance and scalability of applications under increasing loads. However, it&#8217;s worth noting that not all functionalities are available in every tool, especially in open-source solutions.<\/p>\n\n\n\n<p>Custom solutions are often required when working with new or less popular tools. In such situations, extensions play a crucial role by enabling developers to add custom features to performance testing tools. They empower developers to <strong>enhance the potential of the tools<\/strong> and tailor them to specific project requirements, whether it involves simulating real-world loads, integrating with other tools, or monitoring additional metrics.<\/p>\n\n\n\n<p>Extensions thus serve as <strong>a key element<\/strong> that bridges the available functionalities of tools with the unique needs of projects.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Testy wydajno\u015bciowe z k6: Tworzenie rozszerze\u0144 | cz\u0119\u015b\u0107 8\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/BR3ZpdtHRRk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>xk6<\/strong><\/h2>\n\n\n\n<p>In k6, a powerful performance testing tool, there&#8217;s an opportunity to create custom extensions through <a href=\"https:\/\/github.com\/grafana\/xk6\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >a tool called xk6<\/a>. It allows developers to develop extensions and plugins that can significantly expand the capabilities of k6. This flexibility enables the developer community to easily create custom tools that meet the specific testing project requirements. Some of the available extensions can be found in the <a href=\"https:\/\/k6.io\/docs\/extensions\/get-started\/explore\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >k6 documentation<\/a>.<\/p>\n\n\n\n<p>Installing the tool is straightforward and looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01.png\"><img decoding=\"async\" width=\"962\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01.png\" alt=\"xk6 installation \" class=\"wp-image-26704\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01.png 962w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01-300x132.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01-768x337.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-01-370x162.png 370w\" sizes=\"(max-width: 962px) 100vw, 962px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 1 xk6 installation<\/figcaption><\/figure>\n\n\n\n<p>After successful installation, we are ready to use xk6. However, before we proceed with that, let&#8217;s start by writing our first extension.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Implementing the first extension<\/strong><\/strong><\/h2>\n\n\n\n<p>To begin, let&#8217;s choose the functionality we want to cover. We&#8217;ll focus on covering the SMTP protocol. SMTP (Simple Mail Transfer Protocol) is a communication protocol for sending email messages between mail servers. It&#8217;s a standard protocol used to send emails from one mail server to another over the internet.<\/p>\n\n\n\n<p>The next step is to write a simple template that we will then expand with additional parts.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02.png\"><img decoding=\"async\" width=\"1024\" height=\"815\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02-1024x815.png\" alt=\"Writing a simple template\" class=\"wp-image-26706\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02-1024x815.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02-300x239.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02-768x611.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-02.png 1066w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 2 Writing a simple template<\/figcaption><\/figure>\n\n\n\n<p>The script registers a module named &#8220;k6\/x\/smtp&#8221; using the modules.Register function. This registration allows the module to be used later in test scripts written in JavaScript. The next step is to initialize the GO module. We&#8217;ll use the following command for that.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-03.png\"><img decoding=\"async\" width=\"584\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-03.png\" alt=\"Initializing the GO module \" class=\"wp-image-26708\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-03.png 584w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-03-300x217.png 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 3 Initializing the GO module<\/figcaption><\/figure>\n\n\n\n<p>Let&#8217;s assume we want to define a single function in the test responsible for both authentication and sending an email. Based on the available <a href=\"https:\/\/pkg.go.dev\/net\/smtp\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >smtp documentation<\/a>, let&#8217;s implement the functionality to use it as an extension.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04.png\"><img decoding=\"async\" width=\"808\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-808x1024.png\" alt=\"Implementation of the functionality\" class=\"wp-image-26710\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-808x1024.png 808w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-237x300.png 237w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-768x973.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-1213x1536.png 1213w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04-1617x2048.png 1617w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-04.png 2048w\" sizes=\"(max-width: 808px) 100vw, 808px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 4 Implementation of the functionality<\/figcaption><\/figure>\n\n\n\n<p>In the implemented logic, the following elements are included:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The options structure \u2013 a structure named options are defined, containing fields: Subject, Message, and UDW. These are optional parameters that can be passed when sending an email.<\/li>\n\n\n\n<li>The plainAuth function \u2013 a helper function that creates an smtp.Auth object using PlainAuth authentication. This authentication requires specifying the host, password, and sender.<\/li>\n\n\n\n<li>The SendMail function \u2013 the primary function that performs email sending. It takes parameters such as host, port, sender, password, recipient, and options (options structure). Based on these parameters, an email message is created and sent using smtp.SendMail.<\/li>\n<\/ul>\n\n\n\n<p>&#8220;Go mod tidy&#8221; is a command that synchronizes the go.mod file with the dependencies used in our code. Let&#8217;s apply it to synchronize our project.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-05.png\"><img decoding=\"async\" width=\"498\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-05.png\" alt=\"Synchronization of the project\" class=\"wp-image-26712\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-05.png 498w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-05-300x254.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-05-400x340.png 400w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 5 Synchronization of the project<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Building the scenario<\/strong><\/h2>\n\n\n\n<p>We can build k6 binary packages using xk6 on the local system or within Docker. The latter approach is more stable as it mitigates the possibility of errors stemming from the specific system or distribution. However, building an image is necessary for this. You can find an example of it in my <a href=\"https:\/\/github.com\/gpiechnik2\/xk6-anomaly\/blob\/main\/Dockerfile\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >repository<\/a>.<\/p>\n\n\n\n<p>Let&#8217;s proceed with building the image locally.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-06-1.png\"><img decoding=\"async\" width=\"774\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-06-1.png\" alt=\"Building the image\" class=\"wp-image-26724\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-06-1.png 774w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-06-1-300x164.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-06-1-768x419.png 768w\" sizes=\"(max-width: 774px) 100vw, 774px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 6 Building the image<\/figcaption><\/figure>\n\n\n\n<p>This will create a binary file named k6. The example script that we can run using the extension looks as follows.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07.png\"><img decoding=\"async\" width=\"876\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07-876x1024.png\" alt=\"The example script\" class=\"wp-image-26717\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07-876x1024.png 876w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07-257x300.png 257w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07-768x898.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/p8-attachment-07.png 980w\" sizes=\"(max-width: 876px) 100vw, 876px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 7 The example script<\/figcaption><\/figure>\n\n\n\n<p>In this way, we can utilize the library within test scenarios by running k6 using the binary file instead of a system command<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p>In today&#8217;s <a href=\"https:\/\/sii.pl\/blog\/en\/all\/k6-en\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">eighth part of the series<\/a>, we delved into the topic of extensions in k6 and understood their significant role in enhancing this tool&#8217;s functionality. We learned the definition of extensions as custom add-ons that allow developers to tailor k6 to the specific needs of a project.<\/p>\n\n\n\n<p>Throughout the article, we constructed our own k6 extension from scratch, which helped us understand how to implement custom features step by step within this tool. Through practical examples, we had the opportunity to witness the flexibility and adaptability of k6 through the capabilities of extensions.<\/p>\n\n\n\n<p>This also marks the final article in the &#8220;<a href=\"https:\/\/sii.pl\/blog\/en\/all\/k6-en\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance Under Control with k6<\/a>&#8221; series, where we conclude our journey of exploring k6 from the ground up. I want to express sincere gratitude to all those who persevered and followed our series from the first article. I hope you gained insights into the possibilities and potential that k6 offers and acquired valuable skills necessary for effective performance testing of applications.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>If you haven&#8217;t had a chance to read the articles in the series yet, you can find them here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-introduction\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 introduction<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-recording-parametrization-and-running-the-first-test-scenario\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 recording, parametrization, and running the first test scenario<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-metrics-quality-thresholds-tagging\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 metrics, quality thresholds, tagging<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-additional-configurations-types-of-scenario-models-and-executors\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 additional configurations types of scenario models and executors<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-framework-initialization\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 framework initialization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-best-practices-test-suite-creation-and-configuration\/\" target=\"_blank\" rel=\"noreferrer noopener\">Performance under control with k6 \u2013 best practices, test suite creation, and configuration<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-docker-and-integration-with-influxdb-and-grafana\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Performance under control with k6 \u2013 Docker and integration with InfluxDB and Grafana<\/a><\/li>\n<\/ul>\n\n\n\n<p>In addition, I encourage you to&nbsp;check out <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/gpiechnik2\/xk6-smtp\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >the project&#8217;s repository<\/a> and <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/gpiechnik2\/k6-boilerplate\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >repository for previous parts<\/a>.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;26722&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;1&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( vote: 1)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Performance under control with k6 \u2013 creating extensions for k6&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( vote: 1)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Performance testing tools provide invaluable support for developers, allowing them to assess the performance and scalability of applications under increasing &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/performance-under-control-with-k6-creating-extensions-for-k6\/\">Continued<\/a><\/p>\n","protected":false},"author":517,"featured_media":26721,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1321],"tags":[1790,1791,1639,1590],"class_list":["post-26722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testing","tag-k6-en","tag-tosca-en","tag-przeglad-narzedzi-en","tag-tools"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/01\/Wydajnosc-pod-kontrola-\u2013-co-sklania-mnie-do-wyboru-k6.jpg","category_names":["Testing"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26722"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/517"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=26722"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26722\/revisions"}],"predecessor-version":[{"id":26803,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/26722\/revisions\/26803"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/26721"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=26722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=26722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=26722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}