{"id":1440,"date":"2022-03-29T11:41:30","date_gmt":"2022-03-29T09:41:30","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1440"},"modified":"2022-03-29T11:51:56","modified_gmt":"2022-03-29T09:51:56","slug":"google-cloud-functions-2nd-gen","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/google-cloud-functions-2nd-gen\/","title":{"rendered":"Google Cloud Functions 2nd gen"},"content":{"rendered":"<p>Google has just released in beta the second generation of Google Cloud Functions. For those who are not yet familiar with Google Cloud Functions you can read my article <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/quarkus-et-les-google-cloud-functions\/\">Quarkus and Google Cloud Functions<\/a>.<\/p>\n<p>This second generation brings:<\/p>\n<ul><li>A longer maximum processing time: 60mn instead of 10mn.<\/li>\n\n<li>Instances up to 16GB\/4vCPU instead of 8GB\/4vCPU.<\/li>\n\n<li>The ability to have instances always available.<\/li>\n\n<li>Better concurrency management: up to 1000 concurrent calls per instance.<\/li>\n\n<li>CloudEvents support via EventArc: more than 90 events available.<\/li>\n<\/ul>\n<p>All the new features of Cloud Functions gen2 are available <a href=\"https:\/\/cloud.google.com\/functions\/docs\/2nd-gen\/overview\" rel=\"noopener\" target=\"_blank\">here<\/a>.<\/p>\n<p>Icing on the cake, Quarkus is already ready for them! I have had access to the private alpha version, so I already made the Quarkus extension compatible ;).<\/p>\n<p>In this article, I will talk about to the two points that seem to me the most interesting ones: better concurrency and support for CloudEvents.<\/p>\n<h2>Deployment and first call<\/h2>\n<p>First, let&#8217;s deploy the same function in the 1st gen and 2nd gen runtimes. I will use the HTTP function from the Quarkus extension integration test for Google Cloud Functions available <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/tree\/main\/integration-tests\/google-cloud- functions\" title=\"Quarkus Google Cloud Functions integration test\" rel=\"noopener\" target=\"_blank\">here<\/a>.<\/p>\n<p>First thing to do, package the function via <code>mvn clean package<\/code>. Quarkus will generate an uber jar in the <code>target\/deployment<\/code> directory which we will then use to deploy our function.<\/p>\n<p>To deploy the function in the 1st gen runtime:<\/p>\n<pre>\ngcloud functions deploy quarkus-example-http-v1 \\\n    --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \\\n    --runtime=java11 --trigger-http --source=target\/deployment\n<\/pre>\n<p>The build is done via Cloud Build and takes about 22s. After deployment, I make a first call to the function via curl then I access its logs to see the function startup time, and the time of the first call.<\/p>\n<pre>\nD      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.446  Function execution took 277 ms, finished with status code: 200\nD      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.169  Function execution started\n       quarkus-example-http-v1                2022-03-22 17:31:38.441  2022-03-22 17:31:38.441:INFO:oejs.Server:main: Started @1476ms\n[...]\nI      quarkus-example-http-v1                2022-03-22 17:31:38.339  Installed features: [cdi, google-cloud-functions]\nI      quarkus-example-http-v1                2022-03-22 17:31:38.339  Profile prod activated.\nI      quarkus-example-http-v1                2022-03-22 17:31:38.338  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 0.690s.\nI      quarkus-example-http-v1                2022-03-22 17:31:38.266  JBoss Threads version 3.4.2.Final\n       quarkus-example-http-v1                2022-03-22 17:31:37.431  2022-03-22 17:31:37.430:INFO::main: Logging initialized @457ms to org.eclipse.jetty.util.log.StdErrLog\n       quarkus-example-http-v1                2022-03-22 17:31:36.969  Picked up JAVA_TOOL_OPTIONS: -XX:MaxRAM=256m -XX:MaxRAMPercentage=70\n<\/pre>\n<p>We note that the function started in 1.5s including 0.7s for starting Quarkus. The first call took 277ms.<\/p>\n<p>Let&#8217;s do the same for the 2nd gen runtime for which we can deploy the same function with:<\/p>\n<pre>\ngcloud beta functions deploy quarkus-example-http-v2  \\\n    --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \\\n    --runtime=java11 --trigger-http --source=target\/deployment --gen2\n<\/pre>\n<p>The build is done via Cloud Build and takes about 25s. After deployment, I make a first call to the function via curl, and then I immediately notice that the call is very very long! I access its logs to see the function startup time and the time of the first call.<\/p>\n<pre>\nI      quarkus-example-http-v2  2022-03-22 17:38:44.464\n       quarkus-example-http-v2  2022-03-22 17:38:43.041  2022-03-22 17:38:43.041:INFO:oejs.Server:main: Started @14069ms\n[...]\nI      quarkus-example-http-v2  2022-03-22 17:38:41.943  Installed features: [cdi, google-cloud-functions]\nI      quarkus-example-http-v2  2022-03-22 17:38:41.943  Profile prod activated.\nI      quarkus-example-http-v2  2022-03-22 17:38:41.942  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 7.283s.\nI      quarkus-example-http-v2  2022-03-22 17:38:41.343  JBoss Threads version 3.4.2.Final\n----&gt; OTHER STARTING LOGS <\/pre>\n<p>Several observations: the start-up time is much longer, around 14s including 7s for Quarkus, we find the same ratio start-up runtime vs Quarkus one but 10 times more! Also, the curl call just after the deployment triggers another function startup. Successive calls will be much faster.<\/p>\n<p>There is a very different behavior here between generations 1 and 2, I will contact the Google team on the subject for investigation.<\/p>\n<h2>Better concurrency<\/h2>\n<p>To compare the concurrency management, I will simulate a heavy load with the tool <a href=\"https:\/\/github.com\/wg\/wrk\" rel=\"noopener\" target=\"_blank\">wrk<\/a> on both runtimes.<\/p>\n<p>On each runtime, I perform two successive tests, one over 1 minute with 10 threads for 100 connections, and another over 5 minutes with 20 threads for 200 connections:<\/p>\n<pre>\nwrk -c 100 -t 10 -d 60 --latency https:\/\/my-function-host\/quarkus-example-http-v1\nwrk -c 200 -t 20 -d 300 --latency https:\/\/my-function-host\/quarkus-example-http-v1\n<\/pre>\n<p>Here are the results for the 1st gen runtime:<\/p>\n<pre>\n  10 threads and 100 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   144.47ms  111.63ms   2.00s    97.54%\n    Req\/Sec    69.62     17.30   101.00     64.76%\n  Latency Distribution\n     50%  123.09ms\n     75%  129.64ms\n     90%  174.37ms\n     99%  601.22ms\n  40755 requests in 1.00m, 16.36MB read\n  Socket errors: connect 0, read 0, write 0, timeout 175\nRequests\/sec:    678.27\nTransfer\/sec:    278.89KB\n\n  20 threads and 200 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   126.24ms   31.54ms   1.92s    93.47%\n    Req\/Sec    79.79     13.07   101.00     76.19%\n  Latency Distribution\n     50%  118.99ms\n     75%  122.78ms\n     90%  138.27ms\n     99%  224.09ms\n  477829 requests in 5.00m, 191.86MB read\n  Socket errors: connect 0, read 0, write 0, timeout 30\n  Non-2xx or 3xx responses: 20\nRequests\/sec:   1592.29\nTransfer\/sec:    654.69KB\n<\/pre>\n<p>And here are the results for the 2nd gen runtime:<\/p>\n<pre>\n  10 threads and 100 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   138.16ms   63.56ms   1.95s    95.26%\n    Req\/Sec    65.04     23.10   101.00     63.66%\n  Latency Distribution\n     50%  119.94ms\n     75%  140.14ms\n     90%  190.22ms\n     99%  230.52ms\n  27713 requests in 1.00m, 8.72MB read\n  Socket errors: connect 0, read 0, write 0, timeout 169\n  Non-2xx or 3xx responses: 64\nRequests\/sec:    461.20\nTransfer\/sec:    148.58KB\n\n  20 threads and 200 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   125.02ms   30.51ms   1.98s    92.59%\n    Req\/Sec    79.25     14.82   101.00     71.28%\n  Latency Distribution\n     50%  117.89ms\n     75%  120.57ms\n     90%  136.77ms\n     99%  210.77ms\n  474727 requests in 5.00m, 148.95MB read\n  Socket errors: connect 0, read 0, write 0, timeout 79\n  Non-2xx or 3xx responses: 38\nRequests\/sec:   1581.91\nTransfer\/sec:    508.26KB\n<\/pre>\n<p>The average performance is similar for the two runtimes, with a slightly lower average time for the 2nd gen. When we look in detail at the 99% latency (tail latency), we notice a more marked difference for the 2nd gen which has a much lower latency, especially during the first load test (230ms versus 601ms). We can clearly see the interest of increased concurrency for 2nd gen functions: more requests processed per instance, equals fewer function startups, and therefore fewer cold starts.<\/p>\n<p>We can validate this by looking at the number of instances started via the Google Cloud console, and we see that there are about half as many instances started in 2nd gen as in 1st gen (65 to 70 instances versus 140 to 200 instances).<\/p>\n<p><figure id=\"attachment_1445\" aria-describedby=\"caption-attachment-1445\" style=\"width: 618px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=618%2C343&#038;ssl=1\" alt=\"\" width=\"618\" height=\"343\" class=\"size-full wp-image-1445\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?w=618&amp;ssl=1 618w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=300%2C167&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=486%2C270&amp;ssl=1 486w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><figcaption id=\"caption-attachment-1445\" class=\"wp-caption-text\">1st gen &#8211; Nb instances<\/figcaption><\/figure> <figure id=\"attachment_1446\" aria-describedby=\"caption-attachment-1446\" style=\"width: 601px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=601%2C338&#038;ssl=1\" alt=\"\" width=\"601\" height=\"338\" class=\"size-full wp-image-1446\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?w=601&amp;ssl=1 601w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=480%2C270&amp;ssl=1 480w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption id=\"caption-attachment-1446\" class=\"wp-caption-text\">2nd gen &#8211; Nb instances<\/figcaption><\/figure><\/p>\n<h2>CloudEvents<\/h2>\n<p>One of the most exciting 2nd gen functionality is the ability to create functions of Cloud Events type. These are event functions that, instead of receiving an event in a proprietary Google Cloud format, will receive one in a standard format as described in the <a href=\"https:\/\/github.com\/cloudevents\/spec\">Cloud Events specification<\/a>.<\/p>\n<p>Here is an example of a cloud function receiving an event of type Storage and using the proprietary Google Cloud event; it&#8217;s a background function that uses a proprietary <code>StorageEvent<\/code> event object:<\/p>\n<pre>\npublic class BackgroundFunctionStorageTest implements BackgroundFunction {\n\n    @Override\n    public void accept(StorageEvent event, Context context) throws Exception {\n        System.out.println(\"Receive event on file: \" + event.name);\n    }\n\n    public static class StorageEvent {\n        public String name;\n    }\n}\n<\/pre>\n<p>To deploy this function and make it listen on an event on the <strong>quarkus-hello<\/strong> bucket we can use the following command:<\/p>\n<pre>\ngcloud functions deploy quarkus-example-storage \\\n    --entry-point=com.example.BackgroundFunctionStorageTest \\\n    --trigger-resource quarkus-hello --trigger-event google.storage.object.finalize \\\n    --runtime=java11 --source=target\/deployment\n<\/pre>\n<p>Here is an example of a cloud function receiving a standard event of type CloudEvents; it uses the Java CloudEvents library which provides the <code>CloudEvent<\/code> object:<\/p>\n<pre>\npublic class CloudEventStorageTest implements CloudEventsFunction {\n\n    @Override\n    public void accept(CloudEvent cloudEvent) throws Exception {\n        System.out.println(\"Receive event Id: \" + cloudEvent.getId());\n        System.out.println(\"Receive event Subject: \" + cloudEvent.getSubject());\n        System.out.println(\"Receive event Type: \" + cloudEvent.getType());\n        System.out.println(\"Receive event Data: \" + new String(cloudEvent.getData().toBytes()));\n    }\n}\n<\/pre>\n<p>It is at deployment time of this function that we will specify that the trigger will be on a Storage type event by specifying the bucket.<\/p>\n<pre>\ngcloud beta functions deploy quarkus-example-cloud-event --gen2 \\\n  --entry-point=com.example.CloudEventsFunctionStoragetTest \\\n  --runtime=java11 --trigger-bucket=example-cloud-event --source=target\/deployment\n<\/pre>\n<p>The content of the Storage event will be in the <code>data<\/code> attribute of the CloudEvent object.<\/p>\n<h2>Conclusion<\/h2>\n<p>Even if the 2nd gen is still in preview, the advantage offered in terms of performance and cold start alone makes it worth starting to use it (even if it remains to solve the issue of the first function startup which take a lot of time).<\/p>\n<p>Moreover, support for the CloudEvents standard makes it possible to write functions that are less dependent on Google Cloud, and above all to use a format that is supported on other clouds and in other technologies (Kafka broker, HTTP client, .. .).\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Google has just released in beta the second generation of Google Cloud Functions. For those who are not yet familiar with Google Cloud Functions you can read my article Quarkus and Google Cloud Functions. This second generation brings: A longer maximum processing time: 60mn instead of 10mn. Instances up to 16GB\/4vCPU instead of 8GB\/4vCPU. The ability to have instances always available. Better concurrency management: up to 1000 concurrent calls per instance. CloudEvents support via EventArc: more than 90 events available&#8230;.<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/google-cloud-functions-2nd-gen\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[206,179,205,11,167],"class_list":["post-1440","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-gcf","tag-gcp","tag-google-cloud-functions","tag-java","tag-quarkus"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1560,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/quarkus-tip-tester-une-fonction-google-cloud\/","url_meta":{"origin":1440,"position":0},"title":"Quarkus Tip: Testing a Google Cloud function","author":"admin","date":"Thursday December 29th, 2022","format":false,"excerpt":"I recently contributed a PR to Quarkus that contains a testing framework for Google Cloud functions. Quarkus supports creating Google Cloud functions three different ways: Using the Google Cloud API. Using a Quarkus HTTP extension: RESTEasy, Reactive routes, Servlet, Spring Web. Using Funqy, the cloud provider agnostic Quarkus function API.\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1345,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/quarkus-et-les-google-cloud-functions\/","url_meta":{"origin":1440,"position":1},"title":"Quarkus and  the Google Cloud Functions","author":"admin","date":"Tuesday November  2nd, 2021","format":false,"excerpt":"Quarkus is a microservice framework designed for the cloud and the containers. It is designed to have a reduced memory usage and the shortest possible startup time. It is mainly based on standards (Jakarta EE, Eclipse MicroProfile, ...) and allows the use of mature and widespread Java libraries via its\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1068,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/j-ai-teste-java-google-cloud-functions-aplha\/","url_meta":{"origin":1440,"position":2},"title":"(Fran\u00e7ais) J&#8217;ai test\u00e9 Java Google Cloud Functions Alpha","author":"admin","date":"Wednesday May  6th, 2020","format":false,"excerpt":"Sorry, this entry is only available in Fran\u00e7ais.","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1960,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/creer-un-chatbot-avec-google-gemini-vertex-ai-et-quarkus\/","url_meta":{"origin":1440,"position":3},"title":"Creating a chatbot with Google Gemini Vertex AI and Quarkus","author":"admin","date":"Friday June 27th, 2025","format":false,"excerpt":"I recently created a Quarkus extension that provides access to Google Vertex AI. In this article, I'm going to use this extension to create a chatbot. The first step is to create a Quarkus project containing the REST and Google Cloud Vertex AI extensions. Here are the extensions to add\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2089,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/deploy-a-quarkus-application-in-cloud-run\/","url_meta":{"origin":1440,"position":4},"title":"Deploy a Quarkus application in Cloud Run","author":"admin","date":"Tuesday December 30th, 2025","format":false,"excerpt":"Quarkus is a microservice development framework designed for the cloud and containers. It is designed to have reduced memory usage and the shortest possible startup time. It is mainly based on standards (Jakarta EE, Eclipse MicroProfile, etc.) and allows the use of mature and widely used Java libraries via its\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1532,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/tester-une-java-google-cloud-function\/","url_meta":{"origin":1440,"position":5},"title":"Testing a Java Google Cloud Function","author":"admin","date":"Tuesday October  4th, 2022","format":false,"excerpt":"Until recently, testing a Google Cloud Function written in Java could be done via the invoker provided by the Google Cloud Functions SDK but not via a unit test. But this changed recently! Let's take the following HTTP function as an example: public class HelloHttpFunction implements HttpFunction { @Override public\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=1440"}],"version-history":[{"count":12,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1440\/revisions"}],"predecessor-version":[{"id":1456,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1440\/revisions\/1456"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=1440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=1440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=1440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}