<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Zenika - Medium]]></title>
        <description><![CDATA[Zenika is an IT consulting firm of 550 people that helps companies in their digital transformation. Sharing, transparency and conviviality are values that belong to Zenika, so it is natural that our community is strongly committed to open source and responsible digital. - Medium]]></description>
        <link>https://medium.zenika.com?source=rss----5d9d5fd3ea4d---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Zenika - Medium</title>
            <link>https://medium.zenika.com?source=rss----5d9d5fd3ea4d---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 22 May 2026 02:36:23 GMT</lastBuildDate>
        <atom:link href="https://medium.zenika.com/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Create a nice bar chart in Kibana Vega step by step from Elasticsearch data]]></title>
            <link>https://medium.zenika.com/create-a-nice-bar-chart-in-kibana-vega-step-by-step-from-elasticsearch-data-0e0a61c052f5?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/0e0a61c052f5</guid>
            <category><![CDATA[vegas]]></category>
            <category><![CDATA[elastic]]></category>
            <category><![CDATA[kibana]]></category>
            <dc:creator><![CDATA[Ingrid Jardillier]]></dc:creator>
            <pubDate>Thu, 26 Mar 2026 12:44:54 GMT</pubDate>
            <atom:updated>2025-01-29T07:50:14.694Z</atom:updated>
            <content:encoded><![CDATA[<p>In a previous article (<a href="https://medium.com/@ingrid.jardillier/5118615f3415">Using transformations in Kibana Vega to adapt data from query DSL</a>), we saw <strong>how to retrieve data from Elasticsearch, enrich it with static data sources, and transform it to adapt it for simplified exploitation</strong>. This data represented J<strong>VM memory by cluster (environment) and role (tier)</strong>, derived from monitoring data.<br><br>For the record, the main data source (named <strong>”jvm”</strong>) after transformation gave the following results:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*NMybMQ1H75plKaC8Eb97fA.png" /></figure><p>In this article, we’ll see how to use our reworked data source to produce a bar chart visualization in Kibana Vega. The expected result is the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ebmdeWtatlufcLSLkcvPpg.png" /></figure><h3>Bar chart visualization</h3><h4>Definition</h4><p>The bar chart graph we want to set up will therefore have:</p><ul><li>on the <strong>X-axis</strong>: the <strong>JVM memory</strong> in Gb</li><li>on the <strong>Y-axis</strong>: the <strong>clusters</strong> (environments)</li></ul><p>Each environment will also have a <strong>series</strong> by <strong>role</strong> (tier).</p><h4>Set up in Vega</h4><p>As we already have defined the data for Vega in the previous article, we will only care about visualization creation, ie the <strong>scales</strong>, <strong>axes</strong>, <strong>marks</strong>, and <strong>legends</strong> in the Vega definition.</p><pre>{<br>  &quot;$schema&quot;: &quot;https://vega.github.io/schema/vega/v5.json&quot;,<br>  &quot;title&quot;: {<br>    &quot;text&quot;: &quot;JVM by cluster and role&quot;, <br>    &quot;color&quot;: &quot;black&quot;<br>  },<br>  &quot;description&quot;: &quot;Information about JVM on clusters&quot;,<br>  &quot;padding&quot;: 15,<br>  &quot;background&quot;: &quot;#FFFFFF&quot;,<br>  &quot;config&quot;: {<br>    &quot;title&quot;: { &quot;fontSize&quot;: 20 }<br>  },<br>  &quot;data&quot;: [<br>    // already done in previous article<br>  ],<br>  &quot;scales&quot;: [<br>    // TODO<br>  ],<br>  &quot;axes&quot;: [<br>    // TODO<br>  ],<br>  &quot;marks&quot;: [<br>    // TODO<br>  ],<br>  &quot;legends&quot;: [<br>    // TODO<br>  ]<br>}</pre><h3>Axes definition</h3><p>We will start by defining our 2 axes. These axes must be scaled relative to the values ​​we wish to display.</p><h4>X-axis</h4><p>The X-axis will be displayed at the <strong>bottom</strong> of our graph (“<strong>orientation</strong>”) and the value <strong>labels</strong> (“<strong>labelColor</strong>”) will be black. So we will have to base ourselves on a scale named “<strong>xscale</strong>” which we will define just after. What gives:</p><pre>&quot;axes&quot;: [<br>  {<br>    &quot;orient&quot;: &quot;bottom&quot;, <br>    &quot;scale&quot;: &quot;xscale&quot;, <br>    &quot;labelColor&quot;: &quot;black&quot;<br>  }<br>]</pre><p>The scale to be implemented will therefore be of the “<strong>linear”</strong> type, function of the value of the JVM memory (data source “<strong>jvm</strong>”), the scale has to go from 0 to the value “<strong>total_jvm</strong>” available in the data source and which occupies <strong>all the available width (“range”)</strong>.</p><pre>{<br>  &quot;name&quot;: &quot;xscale&quot;,<br>  &quot;type&quot;: &quot;linear&quot;,<br>  &quot;domain&quot;: {<br>    &quot;data&quot;: &quot;jvm&quot;, <br>    &quot;field&quot;: &quot;total_jvm&quot;<br>  },<br>  &quot;range&quot;: &quot;width&quot;<br>}</pre><p>This implementation of the X-axis gives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*azLRGhYYW3Tg8IxkqY8cKg.png" /></figure><h4>Y-axis</h4><p>The Y-axis will be displayed on the <strong>left</strong> and will show the names of the clusters (environments).</p><pre>&quot;axes&quot;: [<br>  // ...<br>  {<br>    &quot;orient&quot;: &quot;left&quot;, <br>    &quot;scale&quot;: &quot;yscale&quot;, <br>    &quot;labelColor&quot;: &quot;black&quot;, <br>    &quot;tickSize&quot;: 0, <br>    &quot;labelPadding&quot;: 25<br>  }<br>]</pre><p>The “<strong>tickSize</strong>” to 0 makes the tick on this axis disappear. And we add some padding after the label with “<strong>labelPadding</strong>”.</p><p>The scale for this axis will this time be of type “<strong>band</strong>” to allow us to group according to our clusters, it is the name of the cluster (“<strong>cluster_name</strong>”) that will be displayed as a <strong>label</strong> on this axis but the clusters on this axis will be <strong>sorted</strong> according to a predefined order contained in the field “<strong>cluster_id</strong>”, The axis will take all the <strong>space available in height</strong> (“<strong>range</strong>”).</p><pre>&quot;scales&quot;: [<br>    // ...<br>    {<br>      &quot;name&quot;: &quot;yscale&quot;,<br>      &quot;type&quot;: &quot;band&quot;,<br>      &quot;domain&quot;: {<br>        &quot;data&quot;: &quot;jvm&quot;, <br>        &quot;field&quot;: &quot;cluster_name&quot;, <br>        &quot;sort&quot;: {<br>          &quot;op&quot;: &quot;median&quot;, <br>          &quot;field&quot;: &quot;cluster_id&quot;, <br>          &quot;order&quot;: &quot;descending&quot;<br>        }<br>      },<br>      &quot;range&quot;: &quot;height&quot;<br>    }<br>]</pre><p>This implementation of the Y-axis gives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/88/1*zEc-wl_VpABuTpJqiVVaAQ.png" /></figure><h3>Legends</h3><p>Now we’re going to look at how to add a caption. Why not do it last? To go step by step through the difficulty 😉 in this article but, in fact, it is possible to do it at the very end or as needed.</p><h4>Legend values</h4><p>First, we will create the legend with only the values ​​of the roles (identifier allowing to order them). We want <strong>symbols</strong> (“<strong>type</strong>”) in the shape of a “<strong>square</strong>”. The title and labels will be in <strong>black</strong> (“<strong>titleColor</strong>” and “<strong>labelColor</strong>”). The legend will be placed at the <strong>bottom</strong> (“<strong>orient</strong>”), <strong>horizontally</strong> (“<strong>direction</strong>”). The “tickMinStep” will ensure we have only integer values.</p><pre>&quot;legends&quot;: [<br>  {<br>    &quot;type&quot;: &quot;symbol&quot;,<br>    &quot;symbolType&quot;: &quot;square&quot;,<br>    &quot;fill&quot;: &quot;color&quot;,<br>    &quot;labelColor&quot;: &quot;black&quot;,<br>    &quot;title&quot;: &quot;Roles&quot;,<br>    &quot;titleColor&quot;: &quot;black&quot;,<br>    &quot;orient&quot;: &quot;bottom&quot;,<br>    &quot;direction&quot;: &quot;horizontal&quot;,<br>    &quot;tickMinStep&quot;: 1<br>  }<br>]</pre><p>To <strong>limit</strong> the legend values ​​(exclude an unused one, like data_cold), we could use the “<strong>values</strong>” attribute instead of “<strong>tickMinStep</strong>”.</p><pre>&quot;values&quot; : [ 1, 3, 4] // remove 2 (data_cold)</pre><p>The “<strong>fill</strong>” field is associated with a new scale (“<strong>color</strong>”), based on the “<strong>role_id</strong>” field and whose “<strong>range</strong>” will allow us to define the colors we want to use for our legend, for each value (we could have used predefined ranges).</p><pre>&quot;scales&quot;: [<br>  //...<br>  {<br>    &quot;name&quot;: &quot;color&quot;,<br>    &quot;type&quot;: &quot;linear&quot;,<br>    &quot;domain&quot;: {<br>      &quot;data&quot;: &quot;jvm&quot;, <br>      &quot;field&quot;: &quot;role_id&quot;, <br>      &quot;sort&quot;: {<br>        &quot;op&quot;: &quot;median&quot;, <br>        &quot;field&quot;: &quot;role_id&quot;, <br>        &quot;order&quot;: &quot;ascending&quot;<br>      }<br>    },<br>    &quot;range&quot;: [&quot;#c0392b&quot;, &quot;#f1c40f&quot;, &quot;#27ae60&quot;, &quot;#3498db&quot;]<br>  }<br>]</pre><h4>Legend labels</h4><p>Now that we have a good base for our legend, we will improve it by <strong>associating labels with the roles&#39; names to each sorted “role_id</strong>.” For this, we will need another “<strong>scale</strong>” to display our “<strong>role</strong>” field (“<strong>range</strong>”) according to the “<strong>role_id</strong>” defined in the “<strong>domain</strong>.”</p><pre>&quot;scales&quot;: [<br>  //...<br>  {<br>    &quot;name&quot;: &quot;scale_legend_values&quot;,<br>    &quot;type&quot;: &quot;ordinal&quot;,<br>    &quot;domain&quot;: {&quot;data&quot;: &quot;jvm&quot;, &quot;field&quot;: &quot;role_id&quot;},<br>    &quot;range&quot;: {&quot;data&quot;: &quot;jvm&quot;, &quot;field&quot;: &quot;role&quot;}<br>  }<br>]</pre><p>We need to update our legend to indicate that we want to display the role label defined in the scale created previously instead of the role value. To do this, we need to use a new property that we haven’t covered yet, namely “<strong>encode</strong>” which allows us to customize some properties, such as the title, labels, symbols, etc.</p><p>In our case, we, therefore, want to update the text of the “<strong>labels</strong>”, using the lookup table defined in the “<strong>scale_legend_values”</strong> ​​scale.</p><pre>&quot;legends&quot;: [<br>    {<br>      //...<br>      &quot;encode&quot;: {<br>        &quot;labels&quot;: {<br>          &quot;update&quot;: {<br>            &quot;text&quot;: {<br>              &quot;signal&quot;: &quot;scale(&#39;scale_legend_values&#39;, datum.value)&quot;<br>            }<br>          }<br>        }<br>      }<br>    }<br>  ]</pre><p>This implementation of the legends gives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/234/1*Yq1p01BQEV9_JLIRbURnAw.png" /></figure><h3>Graphical Marks</h3><p>We will cover the last part of this article, which discusses how to display the JVM memory value by cluster (environment) and role (tier). The goal is to use a bar chart visualization. In Vega, marks are a visualization&#39;s basic visual building block, providing basic shapes whose properties can be set.</p><h4>Facetting by cluster</h4><p>To create our bar chart, we first need to define a grouping because we want to group our data by cluster (environment). This will be done by using the “<strong>group</strong>” brand type and creating a “<strong>facet</strong>” on the name of our clusters.</p><pre>&quot;marks&quot;: [<br>  {<br>    &quot;type&quot;: &quot;group&quot;,<br>    &quot;from&quot;: {<br>      &quot;facet&quot;: {<br>        &quot;data&quot;: &quot;jvm&quot;,<br>        &quot;name&quot;: &quot;facet&quot;,<br>        &quot;groupby&quot;: &quot;cluster_name&quot;<br>      }<br>    }<br>    // TODO<br>  }<br>]</pre><p>We also need to make each cluster (environment) have its range on the Y-axis, but this time, for the bar chart, hence a starting point for the value of “<strong>y</strong>” which is based on the same “<strong>yscale</strong>” defined in a previous section for the axis display.</p><pre>&quot;marks&quot;: [<br>  {<br>    &quot;type&quot;: &quot;group&quot;,<br>    &quot;from&quot;: {<br>      // ...<br>    },<br>    &quot;encode&quot;: {<br>      &quot;enter&quot;: {<br>        &quot;y&quot;: {&quot;scale&quot;: &quot;yscale&quot;, &quot;field&quot;: &quot;cluster_name&quot;}<br>      }<br>    }<br>    // TODO<br>  }<br>]</pre><p>The added lines of code allow us to properly display our clusters (environments) on the Y-axis (one band reserved by cluster).</p><h4>Scaling by role inside each cluster</h4><p>Inside each band reserved for our clusters, we must redefine a scale that will allow us to correctly place the bar associated with each role (defined by the field “<strong>role_id</strong>”). This scale will be of type “<strong>band</strong>” and as for the environments, we will use the “<strong>range</strong>” property and set it to “<strong>height</strong>” to have a band of a fixed height per role. However, this time, we need a height that depends on the “<strong>yscale</strong>” scale and allows us to divide the height allocated to each environment by the number of roles. Therefore, we must use the “signals” functionality, ie, dynamic variables that parameterize a visualization and can drive interactive behaviors.</p><pre>&quot;marks&quot;: [<br>  {<br>    &quot;type&quot;: &quot;group&quot;,<br>    &quot;from&quot;: {<br>      // ...<br>    },<br>    &quot;encode&quot;: {<br>      // ...<br>    },<br>    &quot;signals&quot;: [<br>      {<br>        &quot;name&quot;: &quot;height&quot;, <br>        &quot;update&quot;: &quot;bandwidth(&#39;yscale&#39;)&quot;<br>      }<br>    ],<br>    &quot;scales&quot;: [<br>      {<br>        &quot;name&quot;: &quot;role&quot;,<br>        &quot;type&quot;: &quot;band&quot;,<br>        &quot;range&quot;: &quot;height&quot;,<br>        &quot;domain&quot;: {&quot;data&quot;: &quot;facet&quot;, &quot;field&quot;: &quot;role_id&quot;, &quot;sort&quot;: true}<br>      }<br>    ]<br>    // TODO<br>  }<br>]</pre><h4>Displaying bars</h4><p>We can finally do what is necessary to display our bars representing JVM memory by cluster and role.</p><p>To do this, we will create “rect” type <strong>mark</strong> linked to the “facet” created previously. The following properties will need to be specified in the “encode” to be able to customize them.</p><ul><li>“<strong>x</strong>” and “<strong>x2</strong>” are used to define the <strong>min</strong> (0) and <strong>max</strong> (based on “<strong>total_jvm</strong>” field) for the length of the rectangle on the X-axis.</li><li>“<strong>y</strong>” allows us to define where to place the rectangle on the Y-axis, in relation to our “role” subscale, based on the “role_id” field.</li><li>“<strong>height</strong>” will indicate that the height of the rectangle will be the height of “<strong>1</strong>” band allocated for a role.</li><li>“<strong>fill</strong>” is used to use our “<strong>color</strong>” scale for each role.</li></ul><pre>&quot;marks&quot;: [<br>  {<br>    &quot;type&quot;: &quot;group&quot;,<br>    &quot;from&quot;: {<br>      // ...<br>    },<br>    &quot;encode&quot;: {<br>      // ...<br>    },<br>    &quot;signals&quot;: [<br>      // ...<br>    ],<br>    &quot;scales&quot;: [<br>      // ...<br>    ],<br>    &quot;marks&quot;: [<br>      {<br>        &quot;name&quot;: &quot;bars&quot;,<br>        &quot;from&quot;: {&quot;data&quot;: &quot;facet&quot;},<br>        &quot;type&quot;: &quot;rect&quot;,<br>        &quot;encode&quot;: {<br>          &quot;enter&quot;: {<br>            &quot;y&quot;: {&quot;scale&quot;: &quot;role&quot;, &quot;field&quot;: &quot;role_id&quot;},<br>            &quot;height&quot;: {&quot;scale&quot;: &quot;role&quot;, &quot;band&quot;: 1},  <br>            &quot;x2&quot;: {&quot;scale&quot;: &quot;xscale&quot;, &quot;field&quot;: &quot;total_jvm&quot;},<br>            &quot;x&quot;: {&quot;scale&quot;: &quot;xscale&quot;, &quot;value&quot;: 0},<br>            &quot;fill&quot;: {&quot;scale&quot;: &quot;color&quot;, &quot;field&quot;: &quot;role_id&quot;}<br>          }<br>        }<br>      }<br>      // TODO<br>    ]<br>  }<br>]</pre><p>This implementation of the “<strong>bars</strong>” mark gives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DBvJumJXnUvx39_aOe59AA.png" /></figure><p>The last thing to set up is to display the JVM memory value to the right of the rectangle. To do this, we will create another <strong>mark</strong> of type “<strong>text</strong>” based on our previous mark “<strong>bars</strong>” to display our text relative to our bar and with the associated data.</p><p>This time, we will define the following properties:</p><ul><li>“<strong>x</strong>” will place us at the level of “<strong>x2</strong>” of the “<strong>bars</strong>”, to position ourselves to the right of our bars.</li><li>“<strong>y</strong>” allows us to indicate that we want to start from the “<strong>y</strong>” of our “<strong>bars</strong>” but with an “<strong>offset</strong>” allowing us to center on the “<strong>height</strong>” of the bar.</li><li>“<strong>fill</strong>” to use “<strong>black</strong>” as text color.</li><li>“<strong>align</strong>” and “<strong>middle</strong>” to center text.</li><li>“<strong>text</strong>” to set the text to the “<strong>total_jvm</strong>” value</li></ul><p>These last lines allow us to arrive at the final version of our visualization:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EEZYfVOffzY3ZDu-W6AJfw.png" /></figure><p>We were thus able to <strong>create a step-by-step visualization</strong> with <strong>data from Elasticsearch from several data sources</strong>, and <strong>fully customized to best meet our needs</strong>.</p><p>This <strong>requires a little practice</strong> but the <strong>result is rather interesting</strong>. However, be careful: when you are looking for resources on the Internet, you can find some related to Vega and some others related to Vega-Lite. Kibana supports both, but some features are missing or different between the two.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e0a61c052f5" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/create-a-nice-bar-chart-in-kibana-vega-step-by-step-from-elasticsearch-data-0e0a61c052f5">Create a nice bar chart in Kibana Vega step by step from Elasticsearch data</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using transformations in Kibana Vega to adapt data from query DSL]]></title>
            <link>https://medium.zenika.com/using-transformations-in-kibana-vega-to-adapt-data-from-query-dsl-5118615f3415?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/5118615f3415</guid>
            <category><![CDATA[elasticsearch]]></category>
            <category><![CDATA[transformation]]></category>
            <category><![CDATA[kibana]]></category>
            <category><![CDATA[vegas]]></category>
            <dc:creator><![CDATA[Ingrid Jardillier]]></dc:creator>
            <pubDate>Thu, 26 Mar 2026 12:44:52 GMT</pubDate>
            <atom:updated>2025-01-15T07:54:23.946Z</atom:updated>
            <content:encoded><![CDATA[<p>When using Kibana to create visualizations, we often need to work on <strong>several indices/datastreams</strong> in order to retrieve all the data needed to build our visualization. However, this is <strong>not possible with traditional tools like Lens</strong> (the goal is not to create several layers with our different indices/datastreams but to aggregate them to make a single source containing all the necessary information).</p><h3>Kibana Custom visualization : Vega</h3><p>One solution is to use Kibana’s <strong>Custom visualizations</strong>, such as <strong>Vega</strong>, which allows you to use multiple data sources from static data or Query DSL queries. In the latter case, <strong>it can be difficult to exploit the result</strong>, the structure is not a simple table but a fairly complex JSON, especially when using aggregations.</p><p>In this article, we will see how to create <strong>several data sources</strong> in Vega, but above all how to <strong>transform</strong> them to have something simple as an output (table) containing all the relevant information that we want to display.</p><h3>Example based on Monitoring metrics</h3><p>To discuss the necessary steps, we will take an example based on data known by Elasticsearch users, namely the data contained in <strong>.monitoring-es-*</strong>. These indices contain all the metrics needed to monitor the different clusters managed by a team/company.</p><p>We will start with a simple example, namely, to sum up the total amount of JVM by tier, and this, for each cluster (environment) that we manage. These clusters are managed in Elastic Cloud and are therefore defined by a UUID.</p><p>The <strong>tiers</strong> are:</p><ul><li>Hot</li><li>Warm (not used in our case)</li><li>Cold</li><li>Frozen</li></ul><p>The managed <strong>environments</strong> are:</p><ul><li>Production</li><li>PréProduction (Pre-Production)</li><li>Recette (Staging)</li><li>Intégration (Integration)</li><li>Monitoring</li></ul><h3>Creating the main query</h3><h4>Defining the main Query DSL</h4><p>Our main query DSL will aim to retrieve the total JVM memory by cluster (cluster_uuid) and role, from the data in the node_stats dataset. A role can contain several nodes and the metric used to obtain the JVM is at the node level, so we must go down to the node level and then sum this JVM for all nodes in the same role, which gives:</p><pre>POST /.monitoring-es-*/_search<br>{<br>  &quot;size&quot;: 0,<br>  &quot;query&quot;: {<br>    &quot;bool&quot;: {<br>      &quot;filter&quot;: [<br>        {<br>          &quot;term&quot;: {<br>            &quot;event.dataset&quot;: &quot;elasticsearch.node.stats&quot;<br>          }<br>        }<br>      ]<br>    }<br>  }, <br>  &quot;aggs&quot;: {<br>    &quot;cluster&quot;: {<br>      &quot;terms&quot;: {<br>        &quot;field&quot;: &quot;cluster_uuid&quot;,<br>        &quot;size&quot;: 10<br>      },<br>      &quot;aggs&quot;: {<br>        &quot;role&quot;: {<br>          &quot;terms&quot;: { <br>            &quot;field&quot;: &quot;elasticsearch.node.roles&quot;,<br>            &quot;include&quot;: &quot;data_.*&quot;,<br>            &quot;exclude&quot;: &quot;data_content&quot;,<br>            &quot;min_doc_count&quot;: 0<br>          },<br>          &quot;aggs&quot;: {<br>            &quot;node&quot;: {<br>              &quot;terms&quot;: {<br>                &quot;field&quot;: &quot;elasticsearch.node.name&quot;,<br>                &quot;size&quot;: 10<br>              },<br>              &quot;aggs&quot;: {<br>                &quot;max_jvm&quot;: {<br>                  &quot;max&quot;: {<br>                    &quot;field&quot;: &quot;elasticsearch.node.stats.jvm.mem.heap.max.bytes&quot;<br>                  }<br>                }<br>              }<br>            },<br>            &quot;sum_jvm&quot;: {<br>              &quot;sum_bucket&quot;: {<br>                &quot;buckets_path&quot;: &quot;node&gt;max_jvm&quot; <br>              }<br>            }<br>          }<br>        }<br>      }<br>    }<br>  }<br>}</pre><p>To make it easier to read, we can filter the output by using the “<strong>filter_path</strong>” attribute:</p><pre>POST /.monitoring-es-*/_search?filter_path=aggregations,-**.doc_count,-**.doc_count_error_upper_bound,-**.sum_other_doc_count,-**.node</pre><p>This will only keep the data useful for the rest by removing any superfluous and intermediate fields in the calculation of the JVM by tier.</p><p>This query therefore gives in output:</p><pre>{<br>  &quot;aggregations&quot;: {<br>    &quot;cluster&quot;: {<br>      &quot;buckets&quot;: [<br>        {<br>          &quot;key&quot;: &quot;PDIJyZMaSQOtFB2LEz9kwA&quot;,<br>          &quot;role&quot;: {<br>            &quot;buckets&quot;: [<br>              {<br>                &quot;key&quot;: &quot;data_hot&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 47764733952<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_cold&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 31893487616<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_frozen&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 15921577984<br>                }<br>              }<br>            ]<br>          }<br>        },<br>        {<br>          &quot;key&quot;: &quot;fN5Y2U2HRsK1HKw1X_H77A&quot;,<br>          &quot;role&quot;: {<br>            &quot;buckets&quot;: [<br>              {<br>                &quot;key&quot;: &quot;data_hot&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 5876219904<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_cold&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 884998144<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_frozen&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              }<br>            ]<br>          }<br>        },<br>        {<br>          &quot;key&quot;: &quot;ARezM52EQhGoxHoFJrm1oA&quot;,<br>          &quot;role&quot;: {<br>            &quot;buckets&quot;: [<br>              {<br>                &quot;key&quot;: &quot;data_hot&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 5876219904<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_cold&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_frozen&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              }<br>            ]<br>          }<br>        },<br>        {<br>          &quot;key&quot;: &quot;OtrL3B00RsuFpcOVCAQ08Q&quot;,<br>          &quot;role&quot;: {<br>            &quot;buckets&quot;: [<br>              {<br>                &quot;key&quot;: &quot;data_hot&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 15728640000<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_cold&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_frozen&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              }<br>            ]<br>          }<br>        },<br>        {<br>          &quot;key&quot;: &quot;erIavvd3TG6naKWwGag2TQ&quot;,<br>          &quot;role&quot;: {<br>            &quot;buckets&quot;: [<br>              {<br>                &quot;key&quot;: &quot;data_hot&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 884998144<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_cold&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 884998144<br>                }<br>              },<br>              {<br>                &quot;key&quot;: &quot;data_frozen&quot;,<br>                &quot;sum_jvm&quot;: {<br>                  &quot;value&quot;: 0<br>                }<br>              }<br>            ]<br>          }<br>        }<br>      ]<br>    }<br>  }<br>}</pre><p>we realize that it is not easy to exploit the result JSON to create a visualization..</p><h4>Integrating the main query into a Vega datasource</h4><p>Let’s now integrate our Query DSL into a Vega datasource. We will therefore use the data section, respecting the Vega syntax:</p><ul><li>give a <strong>name</strong> to the datasource in order to be able to use it later in the creation of our visualization or debug it easily</li><li>in the <strong>url</strong> part, specify the query and the body with the associated parts of our Query DSL</li><li>set the <strong>format</strong> to make it easier to access fields in the resulting JSON</li><li>prepare the <strong>transform</strong> attribute for future transformations</li></ul><p>Which gives:</p><pre>{<br>      &quot;name&quot;: &quot;jvm&quot;,<br>      &quot;url&quot;: {<br>        &quot;%context%&quot;: true,<br>        &quot;%timefield%&quot;: &quot;@timestamp&quot;,<br>        &quot;index&quot;: &quot;.monitoring-es-*&quot;,<br>        &quot;query&quot;: {<br>          &quot;bool&quot;: {<br>            // ...<br>          }<br>        }, <br>        &quot;body&quot;: {<br>          &quot;aggs&quot;: {<br>            // ...<br>          },<br>          &quot;size&quot;: 0<br>        }<br>      }<br>      &quot;format&quot;: {&quot;property&quot;: &quot;aggregations.cluster.buckets&quot;}<br>      &quot;transform&quot;: [<br><br>      ]<br>    }</pre><h4>Debugging the data source in Vega</h4><p>Kibana provides very handy <strong>inspection and debugging tools</strong> for Vega. Everything is done through the <strong>Inspect</strong> button in the toolbar.</p><p>The inspection pane provides 2 distinct views: <br>- <strong>View: Requests</strong> to visualize requests, responses and statistics on DSL requests<br>- <strong>View: Vega debug</strong> to inspect datasources as they are implemented</p><p>It is the latter that will interest us:</p><figure><img alt="Debugging Vega" src="https://cdn-images-1.medium.com/max/957/1*kQAJ6owgIT_Ci3yJdbzTDg.png" /></figure><p>As we have set up a format, we see that it has been taken into account since we start to see the data from the sub-attribute “<strong>aggregations</strong> / <strong>cluster</strong> / <strong>buckets</strong>”. The first column displayed (“<strong>key</strong>”) is none other than the key of our highest level aggregation: “<strong>cluster</strong>”, therefore, the cluster_uuid. The second column indicates the number of documents that allowed the calculation of this aggregation and the last one is a JSON representing the value of our aggregation, i.e. the buckets from the sub-aggregations.</p><h3>Transforming the main data source to make it usable</h3><h4>Contextualization of cluster information</h4><p>The <strong>cluster UUID</strong> is a good starting point to know which cluster it is, but when displaying, we will prefer to have a <strong>cluster name</strong> which will provide the associated <strong>environment</strong> and perhaps also a clue allowing us to <strong>order our clusters</strong> according to an order of importance.</p><p>To do this, we will add a <strong>new static data source</strong> with the information allowing us to complete the missing information and make the link with our UUID:</p><pre>{<br>      &quot;name&quot;: &quot;clusters&quot;,<br>      &quot;values&quot;: [<br>        {&quot;uuid&quot;: &quot;erIavvd3TG6naKWwGag2TQ&quot;, &quot;id&quot;: 1, &quot;name&quot;: &quot;Monitoring&quot;}, <br>        {&quot;uuid&quot;: &quot;OtrL3B00RsuFpcOVCAQ08Q&quot;, &quot;id&quot;: 2, &quot;name&quot;: &quot;Recette&quot;}, <br>        {&quot;uuid&quot;: &quot;fN5Y2U2HRsK1HKw1X_H77A&quot;, &quot;id&quot;: 3, &quot;name&quot;: &quot;Intégration&quot;}, <br>        {&quot;uuid&quot;: &quot;ARezM52EQhGoxHoFJrm1oA&quot;, &quot;id&quot;: 4, &quot;name&quot;: &quot;PréProduction&quot;}, <br>        {&quot;uuid&quot;: &quot;PDIJyZMaSQOtFB2LEz9kwA&quot;, &quot;id&quot;: 5, &quot;name&quot;: &quot;Production&quot;}<br>      ]<br>}</pre><p>We will now integrate the fields that interest us directly into our initial data source (jvm), using a <strong>transformation</strong>. To do this, we will use the <strong>lookup</strong> transformation:</p><pre>{<br>    &quot;type&quot;: &quot;lookup&quot;,<br>    &quot;from&quot;: &quot;clusters&quot;,<br>    &quot;key&quot;: &quot;uuid&quot;,<br>    &quot;fields&quot;: [&quot;key&quot;],<br>    &quot;values&quot;: [&quot;id&quot;, &quot;name&quot;],<br>    &quot;as&quot;: [&quot;cluster_id&quot;, &quot;cluster_name&quot;]<br>}</pre><p>This transformation will use the “<strong>clusters</strong>” datasource, which key is the <strong>“uuid” </strong>field, make it correspond to the key of our current data source (“jvm”) which is the <strong>“key”</strong> field, and use this new data source to add the 2 fields named <strong>“id”</strong> and <strong>“name”</strong> to our current datasource with the specified names <strong>“cluster_id”</strong> and <strong>“cluster_name”</strong>.</p><p>At this step, the jvm dataset becomes the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2dRzV6tg1C2CT-ccZnbubw.png" /></figure><h4>Flattening tier data (roles)</h4><p>We will now <strong>simplify the representation</strong> of the roles associated with each environment (cluster) by flattening the data, therefore, creating one line per output role (and this for each cluster). This can be done very easily using a <strong>flatten</strong> transformation:</p><pre>{<br>  &quot;type&quot;: &quot;flatten&quot;, <br>  &quot;fields&quot;: [&quot;role.buckets&quot;],<br>  &quot;as&quot; : [&quot;role&quot;]<br>}</pre><p>We use the field buckets (resulting of the aggregation) of the role column to flatten the data and erase the previous value of the column as we keep the same name in the “<strong>as</strong>” parameter:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LOQzvEcpWo27XVghMEAo5Q.png" /></figure><p>The role colum now has this kind of value:</p><pre>{<br>  &quot;key&quot;: &quot;data_hot&quot;,<br>  &quot;doc_count&quot;: 25933,<br>  &quot;node&quot;: {<br>    &quot;doc_count_error_upper_bound&quot;: 0,<br>    &quot;sum_other_doc_count&quot;: 0,<br>    &quot;buckets&quot;: [<br>      {<br>        &quot;key&quot;: &quot;instance-0000000031&quot;,<br>        &quot;doc_count&quot;: 8649,<br>        &quot;max_jvm&quot;: {<br>          &quot;value&quot;: 15921577984<br>        }<br>      },<br>      {<br>        &quot;key&quot;: &quot;instance-0000000029&quot;,<br>        &quot;doc_count&quot;: 8646,<br>        &quot;max_jvm&quot;: {<br>          &quot;value&quot;: 15921577984<br>        }<br>      },<br>      {<br>        &quot;key&quot;: &quot;instance-0000000030&quot;,<br>        &quot;doc_count&quot;: 8638,<br>        &quot;max_jvm&quot;: {<br>          &quot;value&quot;: 15921577984<br>        }<br>      }<br>    ]<br>  },<br>  &quot;sum_jvm&quot;: {<br>    &quot;value&quot;: 47764733952<br>  }<br>}</pre><h4>Retrieving the JVM metric for each cluster / role</h4><p>Now that we have one line per cluster and role as output, we will be able to easily access the field that interests us from a metric point of view “<strong>sum_jvm</strong>” (at the end of each <strong>role</strong> value) and rework it to <strong>convert it from bytes to Gb</strong>.</p><p>To do such a conversion, we will use the <strong>formula</strong> transformation:</p><pre>{<br>  &quot;type&quot;: &quot;formula&quot;, <br>  &quot;as&quot;: &quot;total_jvm&quot;, <br>  &quot;expr&quot;: &quot;ceil(datum.role.sum_jvm.value / 1024 / 1024 / 1024)&quot;<br>}</pre><p>We create a new field named “total_jvm”, using the expression “expr”, ie, for each row, we use the current (“datum”) value field “role.sum_value.value”, convert it to Gb and rounded it, which now gives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oNp8V8PVoBVBg4X1qfpCaQ.png" /></figure><h4>Keep only role name in the role column</h4><p>As the remaining buckets per node in the role is just here to made it able to calculate the sum of JVM by role, we won’t use them further, so we can replace it by only the name of the role by also using a <strong>formula</strong> transformation:</p><pre>{<br>  &quot;type&quot;: &quot;formula&quot;, <br>  &quot;as&quot;: &quot;role&quot;, <br>  &quot;expr&quot;: &quot;datum.role.key&quot;<br>}</pre><p>This formula will take each line of results, and apply the expression, so set the role value to the current role.key field, is the <strong>role name</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A5-gdjA9YAWJOrPD2wtGfw.png" /></figure><p>We now have a nice and usable output to be able to process it in a beautiful and easy Vega visualization.</p><h4>Latest improvement for the order of roles</h4><p>In the same way that we added a data source for clusters to easily order them in our future visualization, we will do the same for roles because we want to be able to order them in a <strong>logical order</strong>.</p><p>Let’s add a new data source for roles:</p><pre>{<br>  &quot;name&quot;: &quot;roles&quot;,<br>  &quot;values&quot;: [<br>    {&quot;id&quot;: 1, &quot;name&quot;: &quot;data_hot&quot;}, <br>    {&quot;id&quot;: 2, &quot;name&quot;: &quot;data_warm&quot;}, <br>    {&quot;id&quot;: 3, &quot;name&quot;: &quot;data_cold&quot;}, <br>    {&quot;id&quot;: 4, &quot;name&quot;: &quot;data_frozen&quot;}<br>  ]<br>}</pre><p>We then use the same kind of <strong>lookup</strong> transformation to add a new role_id field, with an ordering value:</p><pre>{<br>  &quot;type&quot;: &quot;lookup&quot;,<br>  &quot;from&quot;: &quot;roles&quot;,<br>  &quot;key&quot;: &quot;name&quot;,<br>  &quot;fields&quot;: [&quot;role&quot;],<br>  &quot;values&quot;: [&quot;id&quot;],<br>  &quot;as&quot;: [&quot;role_id&quot;]<br>}</pre><p>The final result is the following one:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NMybMQ1H75plKaC8Eb97fA.png" /></figure><p>A little simpler to exploit than our initial JSON, right?</p><h3>Conclusion about transformations in Kibana Vega</h3><p>When using Vega in a Kibana context, ie using Query DSL to retrieve Elasticsearch data, the resulting output is not always easy to manipulate. Therefore, we may need to query multiple indices or merge information in other static data sources to get all information.</p><p><strong><em>In these cases, transformations are a good way to adapt the output to better exploit the data in visualizations.</em></strong></p><p>Take care that transformations are applied by Kibana, so on client side !</p><p>In a further article, we will create a Vega visualization based on the previous transformed data. Stay tune !</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5118615f3415" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/using-transformations-in-kibana-vega-to-adapt-data-from-query-dsl-5118615f3415">Using transformations in Kibana Vega to adapt data from query DSL</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[L’auto-configuration Spring Boot expliquée : La Magie Derrière @SpringBootApplication]]></title>
            <link>https://medium.zenika.com/lauto-configuration-spring-boot-expliqu%C3%A9e-la-magie-derri%C3%A8re-springbootapplication-f38b78180584?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/f38b78180584</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[spring-boot]]></category>
            <category><![CDATA[spring-framework]]></category>
            <category><![CDATA[backend-development]]></category>
            <dc:creator><![CDATA[Ridge MOULENGUI ]]></dc:creator>
            <pubDate>Wed, 25 Mar 2026 14:37:33 GMT</pubDate>
            <atom:updated>2026-03-26T15:16:55.701Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/310/1*gxd5_QFMG1tYsr4sYibCyA.png" /><figcaption>spring boot</figcaption></figure><p>Tu ajoutes @SpringBootApplication, tu lances ton projet… et tout fonctionne.</p><p>Connexion à la base de données ✔<br>Serveur web ✔<br>Injection de dépendances ✔</p><p>Mais c’est quoi cette magie 😲?</p><p>Dans un premier temps, nous allons voir comment se faisait la configuration avant Spring Boot et dans un second temps nous allons <strong>décortiquer l’auto-configuration de Spring Boot</strong>. C’est ok ? Let’s go !</p><h4>1. C’était comment la vie avec Spring Framework sans Spring Boot ?</h4><p>Lorsqu’on développe une application web on a différents besoins. Souvent ils concernent : communiquer avec une base de données et gérer des requêtes serveur. Pour cela, on va configurer ces moyens de communication soit via des fichiers xml soit via des beans (objets java gérés par spring).</p><p>Par exemple pour configurer un accès à la base de données via des beans on pourrait avoir (cas simple) :</p><p>a) le DataSource</p><p>C’est un objet qui contient l’URL, les identifiants de connexion à la base de données , et le pool de connexions.</p><pre>@Bean<br>    public DataSource dataSource() {<br>        DriverManagerDataSource ds = new DriverManagerDataSource();<br>        ds.setDriverClassName(&quot;com.mysql.cj.jdbc.Driver&quot;);<br>        ds.setUrl(&quot;jdbc:mysql://localhost:3306/testdb&quot;);<br>        ds.setUsername(&quot;root&quot;);<br>        ds.setPassword(&quot;password&quot;);<br>        return ds;<br>    }</pre><p>b) le EntityManagerFactory</p><p>Cet objet sert à instancier un EntityManager qui fait la liaison entre les objets Java (entités) et les tables de la base de données. Il prend DataSource en paramètre.</p><pre>@Bean<br>    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {<br>        LocalContainerEntityManagerFactoryBean emf =<br>                new LocalContainerEntityManagerFactoryBean();<br>        emf.setDataSource(dataSource());<br>        emf.setPackagesToScan(&quot;com.example.entity&quot;);<br>        HibernateJpaVendorAdapter vendorAdapter =<br>                new HibernateJpaVendorAdapter();<br>        emf.setJpaVendorAdapter(vendorAdapter);<br>        return emf;<br>    }</pre><p>c) un Transaction Manager</p><p>Il sert à effectuer les opérations sur la base de données dans le cadre de transactions. Il prend EntityManagerFactory en paramètre.</p><pre>@Bean<br>public PlatformTransactionManager transactionManager(<br>            EntityManagerFactory emf) {<br>        JpaTransactionManager transactionManager =<br>                new JpaTransactionManager();<br>        transactionManager.setEntityManagerFactory(emf);<br>        return transactionManager;<br>    }</pre><p>La configuration complète pour communiquer avec la base de données pouvait donc ressembler à ça :</p><pre>@Configuration<br>@EnableTransactionManagement<br>@EnableJpaRepositories(basePackages = &quot;com.example.repository&quot;)<br>public class PersistenceConfig {<br><br>    @Bean<br>    public DataSource dataSource() {<br>        DriverManagerDataSource ds = new DriverManagerDataSource();<br>        ds.setDriverClassName(&quot;com.mysql.cj.jdbc.Driver&quot;);<br>        ds.setUrl(&quot;jdbc:mysql://localhost:3306/testdb&quot;);<br>        ds.setUsername(&quot;root&quot;);<br>        ds.setPassword(&quot;password&quot;);<br>        return ds;<br>    }<br><br>    @Bean<br>    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {<br>        LocalContainerEntityManagerFactoryBean emf =<br>                new LocalContainerEntityManagerFactoryBean();<br>        emf.setDataSource(dataSource());<br>        emf.setPackagesToScan(&quot;com.example.entity&quot;);<br>        HibernateJpaVendorAdapter vendorAdapter =<br>                new HibernateJpaVendorAdapter();<br>        emf.setJpaVendorAdapter(vendorAdapter);<br>        return emf;<br>    }<br><br>    @Bean<br>    public PlatformTransactionManager transactionManager(<br>            EntityManagerFactory emf) {<br>        JpaTransactionManager transactionManager =<br>                new JpaTransactionManager();<br>        transactionManager.setEntityManagerFactory(emf);<br>        return transactionManager;<br>    }<br>}</pre><p>Il fallait aussi configurer soi-même la servlet principale qui gère les requêtes : la DispatcherServlet. Cette servlet est chargée de router les requêtes du serveur vers le contrôleur adéquat.</p><p>Un exemple de configuration de la DispatcherServlet.</p><pre>public class WebAppInitializer implements WebApplicationInitializer {<br><br>    @Override<br>    public void onStartup(ServletContext container) throws ServletException {<br><br>        AnnotationConfigWebApplicationContext context =<br>                new AnnotationConfigWebApplicationContext();<br>        context.register(WebConfig.class, PersistenceConfig.class);<br><br>        ServletRegistration.Dynamic dispatcher =<br>                container.addServlet(&quot;dispatcher&quot;, new DispatcherServlet(context));<br>        dispatcher.setLoadOnStartup(1);<br>        dispatcher.addMapping(&quot;/&quot;);<br>    }</pre><p>On devait donc écrire tout ce code même dans les cas les plus simples. C’était lourd, fastidieux et complexe ❌.</p><h3>2. Spring Boot fait le travail tout seul</h3><p>Il est important de comprendre que l’auto-configuration de spring boot ne vient pas annuler ou remplacer la configuration vue précédemment. Elle reste nécessaire. Cependant, l’auto-configuration vient déclarer ces beans automatiquement en suivant certaines règles.</p><p>Voyons ça étape par étape 🔎</p><p>1️⃣ Etape I : <strong>@SpringBootApplication : le point d’entrée</strong></p><p>C’est l’annotation qui définit un projet spring boot. Elle est présente dans la classe principale là ou se trouve la méthode main. Par exemple :</p><pre>@SpringBootApplication<br>public class Application {<br><br>    public static void main(String[] args) {<br>        SpringApplication.run(Application.class, args);<br>    }<br><br>}</pre><p>Cette annotation est un alias pour 3 autres annotations. C’est à dire qu’en écrivant @SpringBootApplication en réalité on déclare les 3 annotations suivantes :</p><p>🔸@SpringBootConfiguration : elle indique que la classe est une classe de configuration qui peut contenir des beans.</p><p>🔸@ComponentScan : elle détermine les packages qui vont être scannés au démarrage de spring. Le but étant d’enregistrer les <strong>BeanDefinition des classes annotées </strong>@component, @service, @repository, @configuration <strong>dans la BeanFactory</strong>. Un BeanDefinition est un “plan” qui sert à construire un Bean. Un peu comme une classe avec un objet.</p><p>🔸@EnableAutoConfiguration : C’est ELLE qui nous intéresse. Au démarrage cette annotation réalise l’import de la classe <strong>AutoConfigurationImportSelector</strong>.</p><pre>@Target({ElementType.TYPE})<br>@Retention(RetentionPolicy.RUNTIME)<br>@Documented<br>@Inherited<br>@AutoConfigurationPackage<br>@Import({AutoConfigurationImportSelector.class})// &lt;=== 👈 Importation ICI 👈<br>public @interface EnableAutoConfiguration {<br>    String ENABLED_OVERRIDE_PROPERTY = &quot;spring.boot.enableautoconfiguration&quot;;<br><br>    Class&lt;?&gt;[] exclude() default {};<br><br>    String[] excludeName() default {};<br>}</pre><p>2️⃣ Etape II :<strong>AutoConfigurationImportSelector va lire un fichier qui contient la liste des classes d’auto-configuration</strong></p><p>A une certaine étape dans le processus de démarrage, AutoConfigurationImportSelector va lire un fichier qui contient la liste des classes d’auto-configuration.</p><p>Hein ? Qui? quoi? quel fichier listant quelles classes d’auto-configuration?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/1*QeGVUo_u8nzors-fFUnCiA.gif" /><figcaption>quels fichiers?</figcaption></figure><p>Je t’explique 👇</p><p>chaque dépendance dans ton pom.xml (ou gradle.build) est ajoutée au classpath de l’application. Spring boot vient avec une dépendance un peu spéciale qui s’appelle spring-boot-autoconfigure.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/945/1*XRwZZ4bhx7U1M79PxqgAzQ.png" /><figcaption>spring-boot-autoconfigure.jar</figcaption></figure><p>Cette dépendance contient un fichier AutoConfiguration.imports dans son dossier META-INF. Le chemin complet est le suivant : <em>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/862/1*wmjgw1YHop1webWYoS4fhg.png" /><figcaption><em>AutoConfiguration.imports</em></figcaption></figure><p>Ce fichier <em>AutoConfiguration.imports </em>contient une liste de <strong>classes d’autoconfiguration</strong>. Ces classes sont déjà déclarées et configurées avec des propriétés par défaut.</p><pre>org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration<br>org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration<br>org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration<br>org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration<br>org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration<br>....<br>....</pre><p>AutoConfigurationImportSelector va donc lire ce fichier et enregistrer les classes d’autoconfiguration. Il ne crée ni les BeanDefinition de ces classes, ni les bean eux mêmes. Il ne fait QUE enregistrer ces classes comme <em>“des classes potentielles à utiliser pour autoconfigurer l’application”.</em></p><p>📄AutoConfigurationImportSelector retourne une liste de classes<br>🔄<strong>ConfigurationClassParser</strong> les lit en profondeurs pour détecter les annotations à l’intérieur de ces classes.<br>🔄<strong>ConfigurationClassBeanDefinitionReader</strong> crée les BeanDefinition</p><p>🔄 <strong>ApplicationContext active ou non les classes de configuration</strong></p><p>Les BeanDefinition des classes sont créées et enregistrées dans BeanFactory. Mais ce n’est pas pour autant qu’elles seront activées.</p><p>En effet, chaque classe d’auto-configuration contient des conditions d’activation. Si les conditions sont remplies, le BeanDefinition de la classe est utilisé pour effectivement créer le bean. Sinon, le bean n’est pas crée et l’autoconfiguration portée par cette classe n’est pas prise en compte dans l’application.</p><p>4️⃣ <strong>Un exemple concret : WebMvcAutoConfiguration</strong></p><p>Une des classes qu’on retrouve dans AutoConfigure.imports est WebMvcAutoConfiguration. Elle configure automatiquement <strong>Spring MVC</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a879ilomSp6y59Gmo30lMw.png" /></figure><p>En lisant le fichier AutoConfigurationImportSelector va enregistrer cette classe (et toutes les autres) comme une <em>autoconfiguration possible</em>.</p><p>Une fois que toutes les classes sont enregistrées par AutoConfigurationImportSelector et que ApplicationContext a crée les BeanDefinition qui correspondent, vient alors le moment d’activer (créer le bean) ou de ne pas activer (ne pas créer le bean) de chaque BeanDefinition.</p><p>L’activation dépend des conditions décrites dans la classe elle-même. Ci-après le code de classe WebMvcAutoConfiguration.</p><pre>@Configuration(proxyBeanMethods = false)<br>@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })<br>@ConditionalOnWebApplication(type = Type.SERVLET)<br>public class WebMvcAutoConfiguration {<br><br>    @Bean<br>    @ConditionalOnMissingBean<br>    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {<br>        return new RequestMappingHandlerAdapter();<br>    }<br><br>}</pre><p>Le bean est crée si les conditions suivantes sont remplies:</p><ul><li>✅ @ConditionalOnClass 👉 les classes Servlet, DispatcherServlet et WebMvcConfigurer sont présentes dans le classpath</li><li>✅ @ConditionalOnWebApplication👉 l’application est de type SERVLET (pour info le type d’application est déduite automatiquement au démarrage)</li><li>✅ @ConditionalOnMissingBean 👉 il n’existe pas déjà un bean RequestMappingHandlerAdapter.</li></ul><p>Si les conditions sont réunies un bean RequestMappingHandlerAdapter est automatiquement crée et utilisé par spring boot sans que tu n’aies à faire quoi que ce soit. Magique 🌟</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/251/1*9z_m9vKFmTPkM2gZllZoeA.png" /><figcaption>diagramme</figcaption></figure><h3>3. En résumé</h3><p>1️⃣ @SpringBootApplication active @EnableAutoConfiguration<br>2️⃣ @EnableAutoConfiguration importe AutoConfigurationImportSelector <br>3️⃣ AutoConfigurationImportSelector lit AutoConfiguration.imports <br>4️⃣ Les classes d’auto-configuration sont chargées et les conditions (@ConditionalOnClass, @ConditionalOnMissingBean) décident quels beans créer</p><p>👉 Résultat : <strong>Spring Boot configure ton application automatiquement.</strong></p><p>Si cet article t’a plu, n’hésite pas à <strong>me suivre pour plus de contenu sur Java et Spring Boot </strong>👋.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f38b78180584" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/lauto-configuration-spring-boot-expliqu%C3%A9e-la-magie-derri%C3%A8re-springbootapplication-f38b78180584">L’auto-configuration Spring Boot expliquée : La Magie Derrière @SpringBootApplication</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google Antigravity : l’ère des IDE Agentique]]></title>
            <link>https://medium.zenika.com/google-antigravity-l%C3%A8re-des-ide-agentique-dd0927d7e61e?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/dd0927d7e61e</guid>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Benjamin Bourgeois]]></dc:creator>
            <pubDate>Fri, 19 Dec 2025 07:33:51 GMT</pubDate>
            <atom:updated>2025-12-19T13:33:54.137Z</atom:updated>
            <content:encoded><![CDATA[<h3>Google Antigravity : l’ère des IDE Agentiques</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ElYk_yryrc3KD4J-bQ0OXA.png" /></figure><p>Si la “Developer eXperience” (DX) est en perpétuelle amélioration, l’intelligence artificielle générative bouscule actuellement les paradigmes de développement. Des outils comme Firebase Studio (cf <a href="https://firebase.blog/posts/2025/04/introducing-firebase-studio/">annonce faite par Google</a>) ont déjà introduit la puissance de l’IA dans les <a href="https://docs.google.com/presentation/d/e/2PACX-1vQDLXqF7tlITWWYsYOj5nbV3YQR_drMSbfzT3z2M_FmVhCkf7pz56I_5mpP187iZPKoiXRjMuwCsv3G/pub?slide=id.g32959efb8b4_0_2472"><strong>Cloud Development Environment</strong></a> (CDE) pour assister les développeurs·euses dans la création d’interfaces, la génération de code et l’intégration de services.</p><p>Mais Google a déjà préparé l’étape suivante : l’arrivée des agents dans le monde du développement avec <strong>Google Antigravity</strong>. Lancée en novembre 2025, cette nouvelle plateforme vise à redéfinir la façon dont nous interagissons avec les agents.</p><h3>Premiers pas avec Antigravity : Installation et Configuration</h3><p>Google Antigravity est une nouvelle <strong>plateforme de développement « agentique ».</strong> La promesse : l’IA ne se contente plus de suggérer des lignes de code, mais elle prend le clavier, pilote l’éditeur, le terminal et le navigateur.</p><p>Antigravity s’appuie principalement sur les modèles Gemini. Toutefois, la plateforme est construite pour la flexibilité des modèles incluant le support pour Claude Sonnet 4.5 et Claude Opus 4.5 d’Anthropic ainsi queGPT-OSS d’OpenAI.</p><p>L’installation d’Antigravity s’effectue rapidement à partir d’un package téléchargeable sur votre machine (Windows, Mac ou Linux) : <a href="https://antigravity.google/download">https://antigravity.google/download</a>. Actuellement en preview, Antigravity est accessible publiquement avec une limite dans les quotas d’utilisation des modèles (cf <a href="https://antigravity.google/pricing">https://antigravity.google/pricing</a>).</p><p>Une fois installé, une courte phase de configuration permet de définir le comportement des agents avec quelques options. Antigravity vous propose 4 modes de fonctionnement prédéfinis :</p><ul><li>Développement piloté par agent (Agent-driven development)</li><li>Développement assisté par agent (Agent-assisted development)</li><li>Développement piloté par les avis (Review-driven development)</li><li>Configuration personnalisée (Custom configuration)</li></ul><p>Ces profils sont des préréglages des options présentes sur la partie droite de l’écran, que vous pouvez ajuster manuellement si elles ne vous conviennent pas. Vous pourrez également les modifier par la suite à tout moment dans les préférences d’Antigravity, avec la possibilité d’ajouter des commandes autorisées ou interdites par les agents.</p><p>Ces options consistent à configurer l’autonomie des agents dans l’exécution, avec ou sans votre validation humaine, de commandes dans le terminal, de commandes Javascript ou pour valider les revues.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jt7u7kgMW17KHixL098itA.png" /><figcaption>Interface de configuration du Google Antigravity Agent, montrant les options de modes de développement, y compris ‘Review-driven development’ en surbrillance.</figcaption></figure><h3>La Rupture : L’IDE Agentique vs. L’Assistance Classique</h3><p>Avec les IDEs classiques, l’IA restait limitée à des rôles d’assistance, comme la complétion de lignes, des suggestions de changement dans le code, ou les réponses dans un chat latéral. Les développeurs·euses devaient attendre que l’IA ait fini de générer du code avant de poser la question suivante. L’approche agentique change la donne. Désormais les agents intègrent leurs modifications dans nos fichiers avec ou sans notre approbation.</p><p>Avec Antigravity, la logique est celle de la délégation : la mission est confiée, l’IA effectue la majeure partie du travail. L’IA n’est plus seulement un outil d’écriture de code, mais un acteur autonome capable de planifier, d’exécuter, de valider et d’itérer sur des tâches complexes</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NJ6XcF57id1s1pkk5wPYuQ.png" /></figure><h3>Google Antigravity : IDE Agent-First</h3><p>Antigravity articule son expérience utilisateur autour de deux vues principales distinctes. En plus d’avoir sa <strong>vue de développement</strong> comme tout IDE, la nouveauté réside dans l’apparition d’un écran de supervision des interactions avec les agents, l’<strong>Agent Manager</strong>.</p><h3>Le Gestionnaire d’Agents (Agent Manager)</h3><p>Le Gestionnaire d’Agents (ou Agent Manager) est un tableau de bord où le·la développeur·euse agit en tant qu’architecte. Il peut :</p><ul><li>Déléguer, orchestrer et surveiller plusieurs agents travaillant de manière asynchrone sur différentes tâches (exemples : refactoriser le module d’authentification, mettre à jour l’arborescence des dépendances, générer une suite de tests pour une API).</li><li>Visualiser l’état de chaque agent, les artefacts produits et les demandes d’approbation humaine en attente.</li></ul><p>Cette architecture permet à un développeur de déléguer jusqu’à cinq agents différents pour travailler sur cinq bugs différents simultanément.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kRt-PlLpcA_eYYSitqYKzg.png" /><figcaption>Vue de l’interface du Gestionnaire d’Agents dans Google Antigravity, montrant la section ‘Inbox’ avec des projets en attente et des options pour démarrer des conversations.</figcaption></figure><h3>Les artefacts</h3><p>Déléguer des tâches complexes nécessite une certaine confiance envers l’agent ainsi que la nécessité de vérifier facilement le travail produit. Antigravity résout ce problème en exigeant des agents qu’ils génèrent des “<strong>artefacts</strong>“.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*39MnQXLEKQywIgIjvCVLqQ.png" /><figcaption>Vue d’un tableau de bord dans Google Antigravity montrant les artefacts, les fichiers modifiés et les options de révision des changements.</figcaption></figure><p>Un artefact peut être :</p><ul><li>Un plan d’implémentation détaillé.</li><li>Les “diffs” de code standardisés montrant les lignes exactes qui seront modifiées.</li><li>Des captures d’écran de l’UI (avant et après une modification).</li><li>Des enregistrements d’écran de navigateur pour vérifier que les exigences fonctionnelles sont respectées lors des interactions.</li><li>Des journaux structurés des résultats de tests (réussis/échoués).</li></ul><p>Ces artefacts sont interactifs : si un élément semble incorrect, il est possible de laisser un commentaire directement sur l’artefact et l’agent intégrera ce retour pour itérer sans interrompre son flux d’exécution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tRRpS2HLttKs28_livKWGg.png" /><figcaption>Un aperçu de l’interface utilisateur d’un IDE, montrant une boîte de dialogue de commentaire sur la modification d’une icône de bouton, avec une liste d’artefacts et des fichiers modifiés sur le côté.</figcaption></figure><h3>Un navigateur embarqué pour les tests automatisés</h3><p>Un élément différenciateur est la capacité des agents à lancer un navigateur embarqué, Google Chrome, pour interagir avec des pages Web. Ces agents ont accès à une variété d’outils leur permettant de cliquer, faire défiler, taper, lire les logs de la console et même prendre des vidéos de leurs actions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a00RiBDMzmez1IAS1o5aLA.png" /><figcaption>Interface de contrôle du navigateur Antigravity, affichant des instructions sur les fonctionnalités d’automatisation, des exemples de cas d’utilisation tels que la conception de sites Web et les tests d’assurance qualité, ainsi qu’un message d’accueil en couleur.</figcaption></figure><p>Cette capacité permet aux agents de démarrer l’application localement, d’ouvrir un serveur et d’exécuter un scénario utilisateur complet (comme tester une nouvelle fonctionnalité ou reproduire un bug). L’utilisateur·trice est notifié·e lorsque l’agent prend le contrôle, souvent par une bordure bleue visible autour de la fenêtre du navigateur. L’enregistrement de toutes les actions est disponible dans les artefacts, permettant de vérifier la logique fonctionnelle d’un simple coup d’œil.</p><p>Lors de la première configuration d’Antigravity et de son browser, une fenêtre Google Chrome s’ouvre vous demandant d’installer l’extension “Antigravity Browser Extension” disponible ici <a href="https://chromewebstore.google.com/detail/antigravity-browser-exten/eeijfnjmjelapkebgockoeaadonbchdd">https://chromewebstore.google.com/detail/antigravity-browser-exten/eeijfnjmjelapkebgockoeaadonbchdd</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dSjoGL1YOZjz2bOJMKQxGQ.png" /><figcaption>Bannière de l’extension Antigravity pour navigateur, avec le texte ‘Antigravity Browser Extension’ et un bouton ‘Add to Chrome’.</figcaption></figure><h3>Un changement d’état d’esprit</h3><p>Au-delà de la nouveauté technique, Antigravity amène un changement de paradigme dans les équipes de développement.</p><p>Habituellement concentré sur le développement d’une fonctionnalité ou de la résolution d’un incident, l’aspect agentique permet de déléguer aux agents plusieurs tâches en parallèle.</p><p>La partie <strong>« Inbox »</strong> centralise le suivi des agents et de leurs discussions. Les développeurs•euses doivent s’habituer à regarder cette « nouvelle boîte de réception » pour observer les notifications informant de la fin de traitement d’un agent et contrôler le résultat des traitements des autres agents. Cela amène un important « context switching » qui peut être nouveau et déstabilisant. Une gymnastique devra être à appréhender pour orchestrer ces tâches exécutées en arrière-plan tout en étant concentré sur l’architecture et les éléments de développement sur lesquels nous voulons garder la main.</p><h3>Rules, workflow et customisation</h3><p>Antigravity est personnalisable grâce aux “<strong>Rules</strong>” et “<strong>Workflows</strong>” qui permettent d’adapter le comportement des agents à vos habitudes de travail. Les “<strong>Rules</strong>” guident le comportement des agents avec des consignes que vous pouvez leur donner. Ces règles peuvent être enregistrées dans le répertoire .agent/rules/ de votre projet ou dans le fichier ~/.gemini/GEMINI.md et précisent vos attentes en termes de code, de tests ou l’utilisation de librairies sans avoir à les répéter dans chaque conversation. Par exemple, vous pouvez définir une règle spécifiant que tous les composants React doivent être fonctionnels ou bien que le handler de l’API HTTP ne doit jamais appeler la couche ORM directement.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/598/1*qZJbAQtVaTZitbV_0BRBoQ.png" /><figcaption>Capture d’écran de l’interface de personnalisation du système Antigravity, montrant les onglets ‘Rules’ et ‘Workflows’, et un aperçu des options de personnalisation pour guider le comportement de l’agent.</figcaption></figure><p>Les “<strong>workflows</strong>” sont quant à eux des commandes personnalisées que vous utilisez fréquemment et qui pourront être exécutés rapidement. Ces commandes peuvent être enregistrées dans le répertoire .agent/workflows/ de votre projet ou bien à la racine de votre compte utilisateur dans le fichier ~/.gemini/antigravity/global_workflows/global-workflow.md. Un exemple de workflow pourrait être de demander de générer des tests unitaires sur le code ajouté sur cette branche de développement.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*s4zHuAkUhRjVljXwYdzPIg.png" /><figcaption>Interface affichant les options de personnalisation pour l’Agent dans Google Antigravity, incluant les sections ‘Rules’ et ‘Workflows’ avec des exemples de workflows sauvegardés.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uowaMz487oblZvnwh612tw.png" /><figcaption>Capture d’écran d’un fichier markdown nommé ‘generate-tests.md’ affichant une description pour générer des tests unitaires et une liste de frameworks à utiliser tels que JUnit, Mockito et AssertJ.</figcaption></figure><p>Les Model Context Protocol (MCP), utilisés dans les assistants IA pour faciliter les liens avec des services tiers, sont intégrables dans Antigravity. Une liste de MCP pré-configurée vous permet de rapidement en ajouter à votre projet. Les MCP absents de cette liste peuvent également être ajouté en éditant (ou créant) le fichier mcp.json.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/1*h8HMzCRP4LSSRN49UyC3RQ.png" /><figcaption>Capture d’écran de la boutique MCP dans Google Antigravity, affichant des options pour gérer des serveurs MCP, y compris Cloud Run, Dart, Firebase, et BigQuery.</figcaption></figure><p>Une fois configuré, vous avez la main sur l’activation ou désactivation des services des MCP configurés.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W3J7YVqE_QWpVomwkxAwiQ.png" /><figcaption>Capture d’écran de la configuration des serveurs MCP dans un outil de gestion, montrant une liste de fonctionnalités disponibles et des options d’activation.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/958/1*aV3L5JIESceG-fqdBJctzA.png" /><figcaption>Capture d’écran d’un fichier de configuration JSON pour les serveurs MCP dans Antigravity, incluant des entrées pour ‘cloudrun’ et ‘GitLab’.</figcaption></figure><h3>Complément ou futur de Firebase Studio ?</h3><p>Antigravity n’est pas le seul à proposer une plateforme agentique pour développer des applications. <a href="https://cursor.com/">Cursor</a> est une alternative qui propose un contexte équivalent et qui est assez connue et répandue. <a href="https://about.gitlab.com/gitlab-duo/agent-platform/">GitLab Duo</a> propose également une solution de développement agentique qui va cependant plus loin en intégrant des agents dans toute sa plateforme DevOps.</p><p>Dans de précédentes conférences, nous soulignions les fonctionnalités d’IA de Firebase Studio, notamment dans le prototypage et l’intégration cloud. Avec l’arrivée de la plateforme Antigravity, qui introduit un changement de paradigme vers le développement « agentique », on peut légitimement se demander si l’approche d’assistance de Firebase Studio est remise en cause.</p><p>L’atout principal de <strong>Firebase Studio</strong> réside dans la rapidité de réalisation de prototypages transformant une simple intention en un plan d’action avec des guidelines graphiques, un déploiement simple et rapide sur les services Google Cloud et le tout depuis votre navigateur. L’exécution n’a pas lieu sur votre ordinateur mais sur la plateforme Cloud de Google (GCP).</p><p><strong>Google Antigravity</strong>, quant-à lui, exécute votre projet en local et l’IA n’est plus un assistant, mais un acteur autonome capable de piloter l’éditeur, le terminal et un navigateur embarqué. Sa force réside dans la délégation de tâches complexes de bout en bout, comme le refactoring d’un module ou la génération d’une suite de tests complète. Avec son navigateur, Antigravity peut tester lui-même son code et générer un compte rendu de ses actions. Son gestionnaire d’agents permet l’orchestration asynchrone de plusieurs agents travaillant en parallèle.</p><p><strong>Firebase Studio</strong> est l’outil idéal pour l’entrée en matière et le déploiement rapide d’un PoC dans le cloud, tandis qu’<strong>Antigravity</strong> prend le relais pour du travail complexe en arrière-plan.</p><p>👉 Article écrit avec <a href="https://www.linkedin.com/in/jean-philippe-baconnais-931544116/">Jean-Philippe Baconnais</a> 🙌</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd0927d7e61e" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/google-antigravity-l%C3%A8re-des-ide-agentique-dd0927d7e61e">Google Antigravity : l’ère des IDE Agentique</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Web3 : Le bilan de Google Cloud sur la blockchain en 2025]]></title>
            <link>https://medium.zenika.com/web3-le-bilan-de-google-cloud-sur-la-blockchain-en-2025-7083d6b951fe?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/7083d6b951fe</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Benjamin Bourgeois]]></dc:creator>
            <pubDate>Wed, 17 Dec 2025 19:39:07 GMT</pubDate>
            <atom:updated>2025-12-17T19:40:07.002Z</atom:updated>
            <content:encoded><![CDATA[<h3>Web3 : Le bilan de Google Cloud sur la blockchain en 2025</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VoeiE-3WU3s22YfSfjFI6w.png" /></figure><p>Comme chaque année (<a href="https://medium.com/zenika/web3-le-bilan-de-google-cloud-sur-blockchain-80da566e628d">2023</a> et <a href="https://dev.to/zenika/web3-le-bilan-de-google-cloud-sur-la-blockchain-en-2024-2i4">2024</a>), je fais le point sur les avancées de <strong>Google Cloud sur le Web3</strong>. En 2025, ce domaine est également concerné par l’arrivée de l’Intelligence Artificielle (IA). Le géant du cloud mise désormais sur la <strong>convergence entre la blockchain et l’IA</strong>. De l’infrastructure aux agents autonomes, en passant par les paiements programmables, Google étend son empreinte bien au-delà des simples services de nœuds.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*x0MJQHHrs3kjrcPy.png" /></figure><h3>🤖 Des agents IA connectés à la blockchain</h3><p>L’un des temps forts de l’année est la publication par Google d’un <strong>guide complet pour créer des « Web3 AI agents »</strong>, des agents autonomes capables d’interagir directement avec des smart-contracts et des données « on-chain ». S’appuyant sur <strong>Vertex AI Agent Engine</strong> et <strong>Agent Development Kit (ADK)</strong>, ces agents peuvent lire des transactions, exécuter des contrats et gérer des flux en toute autonomie.</p><p>👉 <a href="https://cloud.google.com/blog/products/ai-machine-learning/build-web3-ai-agents-with-google-cloud?hl=en">Lire l’article officiel sur le blog Google Cloud</a></p><p>Google ne se contente plus de fournir des outils d’accès à la blockchain, il devient un acteur du Web3 intelligent, où les IA ne sont plus seulement “off-chain” mais véritablement connectées à l’écosystème décentralisé. Les agents deviennent des entités économiques à part entière, capables d’échanger, d’apprendre et d’agir dans un écosystème numérique interconnecté et sécurisé.</p><h3>🏦 Stablecoins et “Universal Ledger” : Google veut sa propre infrastructure de paiement</h3><p>L’annonce la plus stratégique de 2025 reste toutefois la mise en avant d’un <strong>protocole de paiement pour agents IA</strong>, appuyé sur les stablecoins ainsi que sa <strong>propre blockchain maison</strong> baptisée <a href="https://cloud.google.com/application/web3/universal-ledger">Google Cloud Universal Ledger</a>. GCUL ne reposerait pas sur l’Ethereum Virtual Machine (EVM) mais plutôt sur une infrastructure indépendante avec des smart contracts écrits en Python. <a href="https://www.theblock.co/post/368399/google-cloud-blockchain-gcul">Selon</a> <em>Rich Widmann</em>, responsable Web3 chez Google Cloud, GCUL est conçue pour être une plateforme stable, flexible, conforme aux réglementations et « crédiblement neutre », dédiée aux paiements institutionnels et les cas d’usage IA-to-IA.</p><p>Cette initiative rapproche Google des acteurs comme <strong>Stripe</strong> et <strong>Circle</strong>, tout en renforçant son positionnement face à des besoins émergents : permettre à des <strong>agents autonomes d’effectuer des transactions stables, traçables et programmables</strong>.</p><p>👉 <a href="https://journalducoin.com/actualites/economie-google-lance-protocole-paiement-pour-ia-booste-stablecoins/?utm_source=chatgpt.com">Article du Journal du Coin sur le protocole de paiement IA</a></p><p>👉 <a href="https://journalducoin.com/economie/google-cloud-universal-ledger-nouvelle-solution-paiement-stablecoin/">Article du Journal du Coin sur GCUL</a></p><p>👉 <a href="https://cryptoast.fr/google-construit-propre-blockchain-voici-dernieres-infos-officielles/?utm_source=chatgpt.com">Cryptoast — Google construirait sa propre blockchain</a></p><p>👉 <a href="https://cryptodnes.bg/fr/google-cloud-blockchain-stripe-circle/">CryptoDNES — Google Cloud lance sa blockchain pour concurrencer Stripe et Circle</a></p><h3>🌐 Un écosystème Web3 en expansion</h3><p>En parallèle, Google Cloud a multiplié les <strong>partenariats dans l’écosystème blockchain</strong>, confirmant sa volonté de ne pas rester seul fournisseur mais de jouer un rôle de catalyseur :</p><ul><li>Collaboration avec <strong>Lava Network</strong> autour de la “<strong>future économie autonome</strong>”, mêlant IA et blockchain. 👉 <a href="https://www.cryptopolitan.com/fr/google-cloud-and-lava-network-lead-discussion-on-the-future-of-the-autonomous-economy/">Article sur Cryptopolitan</a></li><li>Partenariat avec <strong>Etherlink</strong> pour renforcer les outils de développement Web3 et améliorer les performances des infrastructures décentralisées. 👉 <a href="https://phemex.com/news/article/google-cloud-and-etherlink-collaborate-to-enhance-web3-development-28751">Source Phemex News</a></li><li>Coopérations avec des projets blockchain pour stimuler l’innovation Web3 à l’échelle mondiale. 👉 <a href="https://cryptodnes.bg/en/blockchain-project-partners-with-google-cloud-to-strengthen-web3-innovation/">Article de CryptoDnes</a></li></ul><p>Ces alliances traduisent une stratégie pragmatique : <strong>favoriser un écosystème performant plutôt qu’un modèle fermé</strong>, tout en s’assurant que les briques critiques, données, IA, paiements, passent par Google Cloud.</p><h3>Ce qu’il faut retenir</h3><p>En résumé, voici les quelques pistes à explorer en priorité :</p><ul><li><strong>Expérimenter les architectures d’agents IA connectés à la blockchain</strong> : les tutoriels et SDK proposés par Google facilitent les prototypes. Il y a d’ailleurs un codelab <a href="https://www.skills.google/focuses/61475?parent=catalog">ici</a> ou encore un exemple <a href="https://cloud.google.com/blog/products/ai-machine-learning/build-web3-ai-agents-with-google-cloud">là</a>.</li><li><strong>Surveiller de près Google Cloud Universal Ledger et les initiatives de paiement stablecoin</strong> : elles pourraient transformer la manière dont les agents IA échangent de la valeur.</li><li><strong>Garder un œil sur la gouvernance et la neutralité</strong> : plus Google s’implique dans l’infrastructure financière on-chain, plus la question de la “neutralité crédible” deviendra importante.</li></ul><h3>Conclusion</h3><p>En 2025, Google Cloud franchit une nouvelle étape : du simple accès à la blockchain à la création d’une infrastructure complète pour les agents intelligents et les paiements programmables. Avec ses nouveaux outils, ses partenariats stratégiques et ses ambitions dans les paiements, le cloud de Google devient un acteur structurant de la convergence <strong>Web3 × IA</strong>.</p><p>Les clouds de demain seront-ils « <em>on-chain</em> et <em>intelligents »</em>.</p><p>Rendez-vous en 2026 !</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7083d6b951fe" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/web3-le-bilan-de-google-cloud-sur-la-blockchain-en-2025-7083d6b951fe">Web3 : Le bilan de Google Cloud sur la blockchain en 2025</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Web3 : Le bilan de Google Cloud sur la blockchain en 2024]]></title>
            <link>https://medium.zenika.com/web3-le-bilan-de-google-cloud-sur-la-blockchain-en-2024-6ff6daa636c4?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/6ff6daa636c4</guid>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[google-cloud]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Benjamin Bourgeois]]></dc:creator>
            <pubDate>Wed, 17 Dec 2025 15:14:45 GMT</pubDate>
            <atom:updated>2025-12-17T15:14:45.051Z</atom:updated>
            <content:encoded><![CDATA[<h3>Web3 : Le bilan de Google Cloud sur la blockchain en 2024</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jP6pgqtQtz2XkXhYa1ovKw.png" /></figure><p>Google Cloud continue de renforcer sa présence dans l’écosystème blockchain, avec des innovations technologiques, des partenariats stratégiques, et une volonté affichée de démocratiser le Web3.</p><p>Tour d’horizon des initiatives marquantes pour cette année 2024</p><h3>Un nouveau portail Web3, enrichi et consolidé</h3><p>En Avril 2024, Google Cloud a lancé <a href="https://cloud.google.com/application/web3/"><strong>un portail dédié au Web3</strong></a>, centralisant outils et ressources pour les développeurs, entreprises et startups.</p><figure><img alt="Une capture d’écran du Google Cloud Web3 Portal" src="https://cdn-images-1.medium.com/max/1024/1*iQVNfL_zqapRc7DEBpvQgw.png" /><figcaption>Google Cloud Web3 Portal</figcaption></figure><p>Ce portail propose une gamme complète d’outils et de services, structurée autour de plusieurs axes majeurs :</p><ul><li><strong>L’onglet </strong>« <strong>Discover </strong>» : Tous les produits que Google Cloud et la communauté ont conçus pour les développeurs avec des outils dédiés à l’infrastructure, du data warehousing, de l’analytics pour l’analyse des données blockchain, etc. De nombreux réseaux blockchain sont supportés : Ethereum Mainnet et Goerli, Arbitrum, Avalanche, Cronos, Fantom, etc.</li><li><strong>L’onglet </strong>« <strong>Faucet </strong>»: Un espace permettant le déploiement et les tests sur les réseaux Ethereum (Sepolia et Holesky)</li><li><strong>L’onglet </strong>« <strong>Events </strong>»: Un espace regroupant tous les événements passés ou futurs autour du Web3 et de ses partenaires</li><li><strong>L’onglet </strong>« <strong>Learn </strong>»: Toutes les ressources pour vous former dans ce domaine. Vous pouvez retrouver des tutoriels vidéos tels que “Develop an NFT on Ethereum”, “Using Firebase with Web3Auth” ou encore “Secure Digital Assets with MPC”.</li><li><strong>L’onglet </strong>« <strong>Community </strong>»: Des liens vers des communautés et les réseaux supportés par Google Cloud</li><li><strong>L’onglet </strong>« <strong>Startup Program </strong>»: Un <a href="https://cloud.google.com/startup/web3">programme</a> dédié aux startups Web3, proposant deux parcours distincts selon le stade de développement</li></ul><p>Cette approche témoigne de la volonté de Google Cloud de démocratiser l’accès aux technologies Web3, même si certains outils restent encore très spécialisés pour le grand public.</p><h3>SUI : Une collaboration centrée sur l’IA</h3><p>L’une des collaborations majeures de l’année est celle avec <a href="https://sui.io/"><strong>SUI, une blockchain Layer 1</strong></a> issue des travaux de l’équipe derrière les projets <a href="https://fr.wikipedia.org/wiki/Diem_(cryptomonnaie)">Libra et Diem de Facebook</a>. En partenariat avec <a href="https://www.mystenlabs.com/">Mysten Labs</a>, Google Cloud a travaillé sur plusieurs axes stratégiques :</p><ul><li><strong>Analyse des données</strong> : l’intégration des données de la blockchain SUI dans BigQuery permettant aux développeurs d’accéder à des outils analytiques avancés pour la création de dApps.</li><li><strong>IA et sécurité</strong> : grâce à Vertex AI, entrainé sur le <a href="https://sui.io/move">langage de programmation de smart-contract MOVE</a>, SUI a développé des outils d’audit et de génération de code basés sur l’intelligence artificielle pour améliorer la sécurité et optimiser le développement.</li><li><strong>Amélioration de l’expérience utilisateur</strong> : la technologie <a href="https://sui.io/zklogin">zkLogin</a> permet de combler certaines lacunes entre les applications traditionnelles (Web2) et décentralisées (Web3). Elle utilise des identifiants OAuth de Google et d’autres plateformes Web2 de confiance pour simplifier l’authentification sur les applications Web3 et les portefeuilles numériques.</li><li><strong>Infrastructure</strong> : la scalabilité de l’infrastructure Google Cloud garantit la performance du réseau SUI.</li></ul><p><em>Amit Zavery</em>, Vice-Président, General Manager et Responsable des plateformes chez Google Cloud, <a href="https://www.googlecloudpresscorner.com/2024-04-30-Sui-Teams-Up-with-Google-Cloud-to-Drive-Web3-Innovation-with-Enhanced-Security,-Scalability-and-AI-Capabilities">souligne</a> :</p><blockquote>« Nous nous engageons à soutenir l’innovation Web3 grâce à notre infrastructure cloud sécurisée et nos capacités en intelligence artificielle. »</blockquote><p>Comme le <a href="https://www.googlecloudpresscorner.com/2024-04-30-Sui-Teams-Up-with-Google-Cloud-to-Drive-Web3-Innovation-with-Enhanced-Security,-Scalability-and-AI-Capabilities">rappelle</a> également <em>Evan Cheng</em>, CEO et co-fondateur de Mysten Labs :</p><blockquote>« La collaboration avec Google Cloud nous aide à propulser le développement d’expériences Web3 sécurisées, évolutives et centrées sur l’utilisateur. »</blockquote><p>Ce partenariat illustre parfaitement la synergie entre l’expertise technologique de Google Cloud et l’innovation de SUI.</p><h3>Une infrastructure RPC renforcée</h3><p>Google Cloud a étendu ses capacités avec le lancement du service <a href="https://cloud.google.com/products/blockchain-rpc?hl=fr"><strong>Blockchain Remote Procedure Call (RPC)</strong></a><strong>.</strong> Ce service offre des fonctionnalités clés :</p><ul><li><strong>Compatibilité</strong>: Un support pour Ethereum mainnet et testnet</li><li><strong>Performance et accessibilité</strong> : jusqu’à 100 appels par seconde dans son niveau gratuit.</li><li><strong>Interopérabilité</strong> : compatible avec le protocole Ethereum JSON-RPC, facilitant son intégration dans des systèmes existants.</li><li><strong>Extension future</strong> : Google prévoit d’ajouter la prise en charge de nouveaux réseaux blockchain en 2025.</li></ul><p>Un service RPC est essentiel pour interagir avec une blockchain. Il permet aux développeurs et aux applications de communiquer avec les nœuds du réseau blockchain en envoyant des requêtes et en recevant des réponses. Grâce à cette couche d’abstraction, les développeurs et les utilisateurs peuvent interagir facilement avec la blockchain sans devoir gérer la complexité technique sous-jacente, comme la synchronisation des nœuds ou le traitement des données brutes.</p><p>L’engagement de Google Cloud pour améliorer l’interaction avec les données blockchain <a href="https://cloud.google.com/blog/topics/financial-services/introducing-blockchain-rpc-service-for-web3-builders?hl=en">a été salué</a>, notamment par <em>Kyle Quintal</em> de <a href="https://www.0xarc.io/">0xArc</a> :</p><blockquote>« Les offres RPC de Google Cloud offrent des temps de réponse rapides — exactement ce que vous attendez. »</blockquote><h3>Blockchain et gaming : GameStack et l’essor du Web3 dans les jeux</h3><p>L’année 2024 a également vu un rapprochement entre Google Cloud et l’industrie du jeu vidéo via des partenariats comme celui avec <a href="https://sequence.xyz/"><strong>Sequence</strong></a>. Cette <strong>plateforme tout-en-un pour le développement de jeux Web3</strong> est désormais disponible sur Google Cloud Marketplace, facilitant l’intégration de technologies blockchain dans les jeux vidéo.</p><p>Les outils fournis incluent des Unity APIs et des fonctionnalités pour gérer portefeuilles, NFT et transactions. Sequence prend en charge toutes les blockchains EVM, y compris les Layers 1 et 2, ainsi que les Layers 3/App Chains.</p><p><em>Dai Vu</em>, directeur général des programmes Marketplace et ISV GTM chez Google Cloud, a déclaré :</p><blockquote>« Amener Sequence sur Google Cloud Marketplace aidera les clients à déployer, gérer et développer rapidement la plateforme de développement de jeux Web3 sur l’infrastructure de Google Cloud. Sequence peut désormais évoluer en toute sécurité et accompagner ses clients dans leur transformation numérique. »</blockquote><p>Comme l’a <a href="https://x.com/_michaelsanders/status/1849452302203064499">expliqué</a> <em>Michael Sanders</em>, cofondateur de Sequence :</p><blockquote>« Nous nous sommes lancés sur Google Cloud Marketplace en tant que fournisseur d’infrastructure pour les jeux Web3, afin d’aider les développeurs à attirer, fidéliser et monétiser les joueurs tout en offrant des expériences de jeu disruptives. »</blockquote><h3>Un message fort contre la fraude</h3><p>Google Cloud démontre également son engagement dans la <strong>sécurisation de l’écosystème Web3</strong> en adoptant des mesures juridiques inédites. L’entreprise a engagé une action en justice contre un groupe ayant proposé des applications frauduleuses sur la plateforme Google Play pendant plusieurs années. Ces applications, qui promettaient des gains exceptionnels à ceux investissant dans les cryptomonnaies, ont en réalité permis de détourner des sommes considérables.</p><p>Pour la première fois, <strong>Google</strong> a choisi de poursuivre <strong>en justice</strong> les deux principaux instigateurs de cette fraude, en s’appuyant sur la <a href="https://fr.wikipedia.org/wiki/Racketeer_Influenced_and_Corrupt_Organizations_Act#:~:text=Le%20Racketeer%20Influenced%20and%20Corrupt,des%20activit%C3%A9s%20d&#39;une%20organisation">loi <strong>RICO</strong></a> (<em>Racketeer Influenced and Corrupt Organizations</em>), habituellement utilisée dans des affaires de crime organisé. Cette initiative positionne Google comme pionnier parmi les entreprises technologiques dans l’utilisation de ce cadre juridique pour lutter contre les escroqueries.</p><p>Comme <a href="https://www.linkedin.com/posts/halimah-delaine-prado-2002895_google-sues-crypto-scammers-for-allegedly-activity-7181685413785284608-4Yco/">le souligne</a> <em>Halimah DeLaine Prado</em>, avocat pour Google :</p><blockquote>« Rien qu’en 2023, nous avons vu plus d’un milliard de dollars de fraudes et d’escroqueries aux cryptomonnaies aux États-Unis et ce dossier nous permet non seulement d’utiliser nos ressources pour protéger les utilisateurs, mais également de servir en quelque sorte de précédent aux futurs mauvais acteurs dont nous ne pouvons tolérer le comportement. »</blockquote><h3>La suite en 2025</h3><p>En 2024, Google Cloud confirme son ambition de devenir un acteur majeur du Web3 en proposant une infrastructure complète et sécurisée. Entre innovations techniques, partenariats stratégiques et engagement contre la fraude, la plateforme pose les jalons d’un écosystème Web3 plus mature et accessible. Les développements à venir, notamment l’extension du support RPC à d’autres réseaux blockchain, laissent présager de nouvelles avancées significatives dans les mois à venir.</p><p>Rendez-vous l’année prochaine.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6ff6daa636c4" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/web3-le-bilan-de-google-cloud-sur-la-blockchain-en-2024-6ff6daa636c4">Web3 : Le bilan de Google Cloud sur la blockchain en 2024</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dataproc vs Dataproc Serverless]]></title>
            <link>https://medium.zenika.com/dataproc-vs-dataproc-serverless-e333d297e91e?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/e333d297e91e</guid>
            <category><![CDATA[data-architecture]]></category>
            <category><![CDATA[big-data]]></category>
            <category><![CDATA[dataproc]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[gcp]]></category>
            <dc:creator><![CDATA[Chaima Ennar]]></dc:creator>
            <pubDate>Mon, 16 Jun 2025 13:38:57 GMT</pubDate>
            <atom:updated>2025-06-16T13:38:57.014Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pNqdarU-MDJr_sDHHjvoUA.jpeg" /><figcaption><a href="https://fr.freepik.com/auteur/coolvector">https://fr.freepik.com/auteur/coolvector</a></figcaption></figure><p>Dataproc and Dataproc Serverless are managed services on Google Cloud that allow you to run Apache Spark jobs. This article will highlight both their features and differences.</p><h3>1- What is Dataproc?</h3><p>Dataproc is a Google Cloud managed service designed to run Apache Spark and Hadoop jobs on virtual machine clusters. Creating, shutting-down, sizing, configuring, and scaling these clusters are the user’s responsibilities.</p><h3>2- What is Dataproc Serverless</h3><p>Dataproc Serverless runs Spark jobs without requiring the user to <strong>manage clusters</strong>. It automatically provisions resources, scales, and shuts down when the job is done.</p><p>So, Dataproc Serverless reduces operational overhead. It means you don’t have to worry about scaling the infrastructure and managing clusters and resources. It’s automatically handled by Google which saves time, effort, and cost, as you only pay for the resources used during job execution. Additionally this efficient scaling not only optimizes costs but also reduces environmental impact by minimizing idle resource consumption.</p><h3>3- Difference between Dataproc and Dataproc Serverless</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/666/1*2ddNYlk0Gd-Vscb3zSIZmQ.png" /></figure><p>For more details about the tuning parameters, you can consult the Google official documentation.</p><p><a href="https://cloud.google.com/dataproc-serverless/docs/concepts/properties"><strong>https://cloud.google.com/dataproc-serverless/docs/concepts/properties</strong></a></p><h3>4-Cost Considerations</h3><p>As we mentioned before the pricing model is different for both services.</p><h4>Pricing model:</h4><ul><li><strong>Dataproc (Cluster-based)</strong>: the cost includes virtual machines (VMs) running in the cluster; master and worker nodes even when idle.</li><li><strong>Dataproc Serverless</strong>: You pay only for the resources consumed during job execution (vCPUs, memory, and storage), making it more cost-efficient for on-demand workloads.</li></ul><h4>Operational Costs</h4><ul><li><strong>Dataproc</strong>: cluster management fees(scaling, tuning, lifecycle management).</li><li><strong>Dataproc Serverless</strong>: No operational overhead, which can reduce engineering effort and hidden costs.</li></ul><h4>Scaling Costs</h4><ul><li><strong>Dataproc</strong>: Manual or autoscaling clusters can lead to over-provisioning.</li><li><strong>Dataproc Serverless</strong>: Dynamically allocates resources, ensuring you only pay for what you use.</li></ul><h4>Migration Costs</h4><p>For Dataproc Serverless, if your workloads run on Spark 2.x, you must upgrade them to Spark 3+, which entails:</p><ul><li><strong>Code changes </strong>and <strong>configuration update</strong> : which means allocating time and resources for refactoring, testing, and deployment, adding to the total cost.</li></ul><p>To sum it up, if your jobs are already using Spark 3+ and you have occasional workloads, Dataproc Serverless can really optimize the costs. However, if you’re still on older Spark versions, you need to consider the costs of migrating your jobs and that could outweigh the potential savings.</p><h3>5- Optimizing Dataproc Serverless: What to Watch Out For</h3><p>Working with Dataproc Serverless it’s not all sunshine and roses, so it’s important to be aware of its limitations. For example, if a job involves <strong>long-running tasks</strong>, suffers from <strong>data skew</strong>, or lacks <strong>sufficient parallelism</strong>, you might need to manually adjust resource allocations. If you don’t, your jobs can time out, leading to increased costs due to retries.</p><p>So what you should do in such situations:</p><ul><li>Analyze execution logs to identify any bottlenecks.</li><li>Analyze the diagrams on the GCP interface and the Spark UI( memory usage , cpu, workers). Don’t hesitate to use the help of “Gemini” the Google’s AI model to analyze the dashboards.</li><li>Set appropriate maximum worker limits to ensure adequate parallelism.</li><li>Optimize data partitioning to enhance task distribution and performance.</li></ul><h3>6- Conclusion</h3><p>In Conclusion, Dataproc Serverless appears to be “the choice” when looking for an optimized solution regarding costs, time and low-maintenance. I think Google has done a great job making Spark execution easier, which makes Serverless a strong option for many use cases.</p><p>That being said, Dataproc classic (cluster-based) can still be better option in some cases:</p><ul><li>If your jobs run for long periods and need consistent resources, a dedicated cluster might be more stable and predictable in terms of cost.</li><li>If you’re still on Spark 2.x, moving to Serverless means migrating your jobs, which comes with hidden costs in time, effort, and testing.</li><li>If you need full control and fine-tuning a traditional cluster could give you better performance .</li></ul><p>In the end, the right choice depends on: your workload, budget, available time, and how much control you need over your jobs.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e333d297e91e" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/dataproc-vs-dataproc-serverless-e333d297e91e">Dataproc vs Dataproc Serverless</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Rendre son podcast accessible avec l’IA au service de la transcription]]></title>
            <link>https://medium.zenika.com/rendre-son-podcast-accessible-avec-lia-au-service-de-la-transcription-fe5c03aa1c23?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/fe5c03aa1c23</guid>
            <category><![CDATA[podcast]]></category>
            <category><![CDATA[accessibilité]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[intelligence-artificielle]]></category>
            <category><![CDATA[google]]></category>
            <dc:creator><![CDATA[Benjamin Bourgeois]]></dc:creator>
            <pubDate>Mon, 16 Jun 2025 13:17:33 GMT</pubDate>
            <atom:updated>2025-06-16T13:17:33.683Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*33b2_9Ou4kFTvydIXUGJ8Q.png" /></figure><p>L’Intelligence Artificielle (IA) est partout, de plus en plus utilisée, transformant la manière dont nous abordons nos tâches. Elle se révèle comme un assistant précieux, permettant d’aider les personnes à accomplir plus rapidement leurs activités du quotidien. <br>Dans le domaine de la manipulation de son en texte, elle nous offre des retranscriptions rapides, mais une intervention humaine reste indispensable pour garantir la justesse et la pertinence du contenu généré.</p><p>Dans cet article, nous allons vous parler de notre expérience avec l’IA dans la production de notre podcast Zenikast et plus particulièrement celle de Google : Gemini</p><h3>🎙️ Zenikast, une nouvelle aventure</h3><p>Quand nous avons lancé <a href="https://youtu.be/4yBqGEsjy2E?si=nTpDGMSUTMx8fWyQ">Zenikast</a>, le nouveau podcast de Zenika, nous nous sommes interrogés sur la manière de rendre accessible nos futurs épisodes.</p><p>L’accessibilité , et surtout quand il s’agit de podcast, n’est malheureusement pas souvent une priorité. A Zenika, c’est un sujet qui nous tient à cœur. Nous avons la volonté d’amener l’accessibilité au sein de nos prestations, nos audits, nos formations et aussi lors de nos activités annexes comme le podcast !</p><p>Sur les plateformes de podcast comme Apple podcast ou bien Youtube, des transcriptions automatiques sont générées, laissant parfois, voire souvent, des erreurs et diverses hallucinations. Nous le savons, les outils basés sur l’IA s’améliorent jour après jour mais nous avions l’envie et la volonté de mettre à disposition une transcription quasi parfaite. Pour mettre à disposition cette transcription, nous avons opté pour une solution simple et efficace : un Google Doc. Nous avons un outil interne qui permet de créer des liens vers des pages web ou documents et éviter de mentionner le lien du document tel quel. Nous pouvons donc avoir rapidement et simplement un lien de type <a href="https://links.zenika.com/link/zenikast/episode-1">https://links.zenika.com/link/zenikast/episode-1</a>.</p><p>Merci à <a href="https://www.linkedin.com/in/emmanuelle-aboaf">Emmanuelle Aboaf</a> pour avoir pris le temps de répondre à nos questions et pour tes conseils 🙏.</p><h3>🧪 Nos premiers essais: Whisper Transcribe</h3><p>Pour la saison 1, nous étions plusieurs personnes au profil technique à s’occuper du podcast. Nous avons donc testé différents outils, basés sur des projets Node.js, Java, ou bien sur des outils directement à installer. Mais Zenikast a pour vocation d’être à la disposition de toutes les personnes de Zenika, qu’elles soient tech ou non. L’outil et la manière de créer nos transcriptions doivent donc être accessibles à tous les profils des collaborateurs et collaboratrices de Zenika.</p><p>Nous avons sélectionné <a href="https://www.whispertranscribe.com/">Whisper Transcribe</a>, et avons pu tester nos premières transcriptions avec la version gratuite . Merci aux personnes qui ont travaillé sur ce magnifique projet 💪.</p><p>Petit plus de Whisper : la diarisation, ou détection automatique des différents intervenants·es dans le podcast, une fonctionnalité très utile pour nos épisodes pouvant avoir jusqu’à 6 voix.</p><figure><img alt="Exemple de transcript réalisé par Whisper transcribe" src="https://cdn-images-1.medium.com/max/1024/0*zXVGtG10PYjW7PtN" /></figure><figure><img alt="Paramétrage de Whisper transcribe" src="https://cdn-images-1.medium.com/max/1024/0*IptI6EChkh7qnjOX" /></figure><figure><img alt="Ajout de mots clés via Whisper transcribe" src="https://cdn-images-1.medium.com/max/1024/0*K22605TGxF5jVFuU" /></figure><p>Des mots spécifiques, abréviations ou termes techniques peuvent être ajoutés à la liste des mots “connus” de Whisper.</p><figure><img alt="Whisper transcribe" src="https://cdn-images-1.medium.com/max/1024/0*F23ecf0Nq40ht0wo" /></figure><p>Malgré sa qualité, chaque transcription demandait tout de même plusieurs heures de relecture pour arriver à un texte sans erreur et structuré de façon à être agréable à lire. De plus, Whisper Transcribe est payant pour une utilisation plus intense.</p><h3>💡 Vers l’IA générative avec Vertex AI</h3><p>Lors du <a href="https://www.devoxx.fr/">Devoxx France</a> mi-Avril, une discussion avec <a href="https://www.linkedin.com/in/deleplacevalentin?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAC6MU8BEMDKEp_ITXuYBakCnC1wl8i8BDY&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_search_srp_all%3BBBfW2gOtRmempl2qN6WRdg%3D%3D">Valentin Deleplace</a> nous a orienté et surtout convaincu de pousser nos expérimentations avec <a href="https://gemini.google.com/app">Gemini</a> et <a href="https://cloud.google.com/vertex-ai">Vertex AI Studio</a> de Google Cloud. Il est possible d’y importer un fichier audio (.mp3 ou .wav) et de demander à Gemini de nous donner la transcription de l’épisode, sans écrire une seule ligne de code.</p><p>Le rendu est largement satisfaisant et a poussé notre curiosité à tester d’avantage la transcription de notre épisode de podcast que nous tournions d’ailleurs pendant le Devoxx (cf <a href="https://www.youtube.com/watch?v=6jsWD7kCfQw">la vidéo</a> de l’épisode) avec les solutions Google.</p><h3>🧪 Retour d’expérience : Gemini 2.5 Pro à l’épreuve</h3><p>Nous sommes donc allés tester directement avec le dernier modèle : Gemini 2.5 Pro.</p><p>Disponible en preview via Vertex AI, Gemini 2.5 Pro a la capacité de traiter des prompts multimodaux : texte, image, audio, voire même vidéo. Contrairement aux générations précédentes, il intègre des capacités de raisonnement bien plus poussées.</p><p>La prise en main est rapide : en important un fichier .mp3 ou .wav, nous avons interagi avec le modèle directement dans l’interface de Vertex AI Studio et en quelques secondes Gemini génère un texte très fluide et assez fidèle à l’audio. Là où Whisper Transcribe nous demandait une bonne relecture, Gemini a nettement réduit ce temps. Mais surtout, il est aussi capable de faire de la diarisation, c’est-à-dire de détecter et séparer les différentes voix intervenant dans le podcast.</p><h3>🪜 Étape 1 : Transcription avec détection des voix</h3><p>Nous avons importé un fichier .wav dans Vertex AI Studio et formulé une simple instruction.</p><blockquote>Peux-tu me générer la transcription de ce fichier audio ?<br>Contexte : pour le podcast Zenika (Zenikast), nous enregistrons un épisode au Devoxx France 2025. La première personne qui parle est Jean-Philippe et la deuxième personne Benjamin.<br>Peux-tu donner la transcription sous format texte ?</blockquote><p>En quelques secondes, Gemini a produit une transcription structurée, segmentée par “Intervenant 1”, “Intervenant 2”, etc. <br>Le résultat brut est vraiment satisfaisant. Pas d’hallucinations, très peu d’erreurs de transcription, et surtout une bonne compréhension des enchaînements entre les intervenant·es. Cette étape nous a convaincus du potentiel. Mais on voulait aller plus loin : améliorer la lisibilité du texte pour en faire un support plus agréable à lire, voire publiable tel quel.</p><figure><img alt="1ère transcription avec Gemini" src="https://cdn-images-1.medium.com/max/1024/0*DVoG7YeBJYeFQIv1" /></figure><h3>🪜 Étape 2 : Nettoyage automatique des tics de langage</h3><p>Lors d’un second prompt, nous avons demandé exactement la même transcription mais en enlevant les tics de langage : les “du coup”, “euh”, “voilà”, “en fait” et autres. Gemini a gardé l’esprit de l’échange, sans trahir le propos, mais en le rendant bien plus fluide à la lecture.<br>Un vrai gain pour les personnes qui liront la transcription sur le lien partagé.</p><p>Voici le prompt :</p><blockquote>Peux-tu me générer la transcription de ce fichier audio ?<br>Contexte : pour le podcast Zenika (Zenikast), nous enregistrons un épisode au Devoxx France 2025. La première personne qui parle est Jean-Philippe et la deuxième personne Benjamin.<br>Peux-tu donner la transcription sous format texte ? Peux-tu également nettoyer le texte de façon à supprimer les tics de langage comme les “euh”, les répétitions de mot, etc afin de le rendre lisible tout en restant fidèle au texte au maximum.</blockquote><h3>🪜 Étape 3 : Deux versions complémentaires</h3><p>Ce double rendu nous permet maintenant d’avoir à la fois une version fidèle à l’original et une version plus lisible.</p><figure><img alt="Transcription brute avec Gemini" src="https://cdn-images-1.medium.com/max/1024/0*ZH9X7ssPvTJ3kxLc" /></figure><figure><img alt="Transcription améliorée avec Gemini" src="https://cdn-images-1.medium.com/max/1024/0*8pD47h1pEkdm7vGA" /></figure><h3>🧭 Grounding : des réponses vérifiées via des sources fiables</h3><p>Sur les captures d’écran précédentes, vous remarquerez l’activation d’une option nommée “Grounding” sur le panneau de droite.<br>L’idée est de connecter Gemini à des sources de données vérifiables, comme la Recherche Google, Google Maps ou même vos propres données. Cela permet de réduire drastiquement les risques d’hallucinations.</p><p>Par exemple, si on demande à Gemini de résumer un article de presse récent, de générer un contenu à jour, ou même de répondre à une question pointue sur un sujet en constante évolution, le grounding avec la Recherche Google permet d’adosser sa réponse à des contenus web récents et pertinents. Mieux encore : les réponses peuvent être accompagnées de citations et de scores de confiance, ce qui renforce l’auditabilité et la transparence.</p><p>Du côté de vos données, il est possible de connecter Gemini à du RAG Engine , du Vertex AI Search ou de l’Elasticsearch.</p><figure><img alt="Gemini — Custom grounding" src="https://cdn-images-1.medium.com/max/916/0*aDxXhpr820fY_cS8" /></figure><figure><img alt="Gemini — Custom grounding source" src="https://cdn-images-1.medium.com/max/916/0*czcGWT2OSA2tXZWY" /></figure><h3>🚀 La suite, basée sur des agents IA?</h3><p>L’utilisation de l’Intelligence Artificielle, que ce soit Whisper Transcribe ou dernièrement Gemini, nous a permis de gagner plusieurs heures sur la transcription de nos épisodes. Lors des premiers tests, nous passions 3 à 4h pour relire et corriger un épisode. Pour le moment, même si cette cinématique est très archaïque et perfectible, nous n’y passons plus que 30 minutes.</p><p>Avec les annonces faites par Google courant Avril et Mai 2025, des améliorations vont rapidement pouvoir être testées et mises en place pour accélérer ce processus et permettre à tous les collaborateurs et collaboratrices de Zenika de réaliser des transcriptions en quelques clics (via la plateforme <a href="https://cloud.google.com/products/agentspace">AgentSpace</a>, le protocole <a href="https://github.com/google-a2a/A2A">Agent2Agent</a> (A2A) et le framework <a href="https://google.github.io/adk-docs/">Agent Development Kit</a>, ADK. Nous vous raconterons sûrement cela dans un nouvel article de blog.</p><p>👉 Article rédigé avec <a href="https://www.linkedin.com/in/jean-philippe-baconnais-931544116/">Jean-Philippe Baconnais</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fe5c03aa1c23" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/rendre-son-podcast-accessible-avec-lia-au-service-de-la-transcription-fe5c03aa1c23">Rendre son podcast accessible avec l’IA au service de la transcription</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A google cloud professional data engineer certification short story on what not to do]]></title>
            <link>https://medium.zenika.com/a-google-cloud-professional-data-engineer-certification-short-story-on-what-not-to-do-66268123ebb0?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/66268123ebb0</guid>
            <category><![CDATA[data]]></category>
            <category><![CDATA[certification]]></category>
            <category><![CDATA[google-cloud]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[careers]]></category>
            <dc:creator><![CDATA[Chaima Ennar]]></dc:creator>
            <pubDate>Wed, 21 Aug 2024 09:54:55 GMT</pubDate>
            <atom:updated>2024-08-21T09:54:55.822Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/634/1*vPTsemdCsyePJNAoIF47Hw.png" /></figure><p>Numerous articles may guide you on what to do, but in this one, you will uncover what not to do and like William Blake once said :</p><blockquote>The errors of a wise man make your rule, Rather than the perfections of a fool.</blockquote><p>So, regarding things not to do, we can divide them into two categories:</p><h3>Preparation phase:</h3><ul><li><strong>Neglecting to review the official Google Cloud exam guide:</strong> The official exam guide is a crucial resource that outlines the exam key areas of focus. It provides a detailed breakdown of the topics covered, the weight of each section. By skipping this guide, candidates miss out on essential information that helps them understand what to expect on the exam.</li><li><strong>Schedule the date without considering potential program updates : </strong>if you booked a date after the 11th of November 2023 you will notice that the exam underwent significant changes. The updated exam now focuses more on data preparation, analytics, and pipeline management, with fewer questions on machine learning issues.</li><li><strong>Ignoring the labs:</strong> you may very well<strong> </strong>understand the various Google Cloud Platform (GCP) services relevant to data engineering, but without hands-on practice with GCP services, you may struggle to answer practical and detailed exam questions effectively.</li><li><strong>Use only one source of documentation : </strong>Avoid relying on a single source of documentation. It’s essential to consult multiple references to gain a comprehensive understanding</li><li><strong>Not making a summary : </strong>Notes can be invaluable when preparing for exams or assessments. They provide a structured overview of the material, making it easier to study efficiently and effectively.</li></ul><h3>Day D</h3><ul><li><strong>Be hungry , thirsty , cold…: </strong>Ensure you are comfortable during the exam; sitting on a comfortable chair is essential. The exam lasts 2 hours, and discomfort can make it feel like an eternity.</li><li><strong>Panic when the exam stops unexpectedly:</strong> If the exam stops unexpectedly, which can happen frequently, especially during the middle of the test, remain calm and follow the instructions given. You will be able to resume and continue with your exam.</li><li><strong>Flag all the questions: </strong>Use flags to mark questions you’re unsure about and want to revisit later. However, remember that you may not have time to revisit all flagged questions if you flag all 50. Mark only the most critical ones to manage your time effectively.</li><li><strong>Panic when the “exam tool” struggles to launch:</strong> If you encounter issues launching the exam, remain calm. It’s normal for technical tools to have occasional issues and you may start a little late is okay. Follow the provided instructions carefully to resolve the problem and begin your exam smoothly.</li></ul><p>To wrap it up, avoiding these mistakes helps you prepare better for your exam and handle challenges successfully. If you don’t pass the first time, see it as a chance to learn from what went wrong and hey you will have your own list of what to not do !! and second time could really be a charm</p><p>so don’t stop learning you’ve got this!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=66268123ebb0" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/a-google-cloud-professional-data-engineer-certification-short-story-on-what-not-to-do-66268123ebb0">A google cloud professional data engineer certification short story on what not to do</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting Started with Synthetic Monitoring on GCP and Datadog]]></title>
            <link>https://medium.zenika.com/getting-started-with-synthetic-monitoring-on-gcp-and-datadog-2391b9f38025?source=rss----5d9d5fd3ea4d---4</link>
            <guid isPermaLink="false">https://medium.com/p/2391b9f38025</guid>
            <category><![CDATA[datadog]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[gcp]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <dc:creator><![CDATA[Tarek Touati]]></dc:creator>
            <pubDate>Mon, 01 Jul 2024 11:59:29 GMT</pubDate>
            <atom:updated>2024-07-01T11:59:29.471Z</atom:updated>
            <content:encoded><![CDATA[<p>When you are talking about Monitoring, we often think about getting information on cpu usage, memory usage and other classic ops metrics. A 2024 trend in the monitoring landscape is also to gather end to end metrics and that’s why we see more and more “Synthetic Monitoring” panels in modern observability tools.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*kV3iuw97X6KT7Pc4ly18fA.jpeg" /></figure><p>Like in the pyramid testing model, testing end to end metrics is a complementary approach to the metrics that we are used to check.</p><p>With new SEO constraints linked to the performance of web applications, many companies are now managing end to end metrics to get the full picture of what is working and how fast their websites are.</p><p><em>“Everything fails, all the time” is a famous quote from Amazon’s Chief Technology Officer Werner Vogels. This means that software and distributed systems may eventually fail because something can always go wrong.</em></p><h3>Definition &amp; Concepts</h3><p>In a few words : It’s a way to monitor your application, by simulating user actions and business critical scenarios. This aims to warn you of production related issues, so you can fix them before impacting most of your users.</p><p>If you are familiar with End-to-end testing, you are almost good to go. The idea, here, is to execute scripts that mimic your users and ”run” most business critical scenarios.</p><p>The key difference is that you are running this on your production environments, and focus will be given on performance of your application.</p><p>Once your scenario is executed, you’ll get plenty of metrics around your application, whether it’s related to web performance, or on one of your internal components.</p><p>Based on these metrics, you’ll be able to know where the effort needs to be made on your assets, to make your application more robust and fault-tolerant.</p><p>In general, there are different type of monitoring that refer to Synthetic monitoring :</p><p><strong>1/ Availability Monitoring :</strong></p><p>Will verify that your service is available at any time. It is a bit more sophisticated than a simple health check control, instead this monitor ensures that the service is running well and responding as it intends to be.</p><p><strong>2/ Transaction Monitoring :</strong></p><p>It is a step ahead of <strong>Availability Monitoring, </strong>now we are going to add scripts that will simulate users interactions to make sure business critical scenarios are working as expected.</p><p><strong>3/ Web performance monitoring :</strong></p><p>As its name suggests, it will focus on application performance throughout Core Web Vitals, this helps identify improvements/ degradation for your end-users.</p><h3>Use-case</h3><p>In this article, we will focus on Transaction &amp; Web performance monitoring :</p><p>Our critic scenario is :</p><ul><li>A user navigates to <a href="https://training.zenika.com">https://training.zenika.com</a></li><li>Type in search bar : “CKA”</li><li>Should be redirected to a result page containing results.</li><li>Choose the first training.</li><li>Should be redirected to the training detail page.</li></ul><h3>Synthetic monitoring setup on Google Cloud</h3><p><em>Demo: </em><a href="https://github.com/Tarektouati/GCP-synthetic-monitoring"><em>https://github.com/Tarektouati/GCP-synthetic-monitoring</em></a></p><p>A synthetic monitor is composed of 2 Google Cloud components :</p><ul><li>A cloud function</li><li>A monitor attached to the cloud function.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1Pki1JCHx_I50wA-5_coYg.png" /></figure><p>We’ll create a Node.JS cloud function with a puppeteer inside to which iterate on our user’s scenario.</p><p>As it’s puppeteer, you can write it by yourself, and rely on testing-library best parcticies and install <a href="https://github.com/testing-library/pptr-testing-library.">pptr-testing-library</a>.</p><p>if you are lazy, that’s why you can use <a href="https://developer.chrome.com/docs/devtools/recorder">Chrome recorder</a>, to generate your puppeteer user journey.</p><p>Once, your are good to go, deploy cloud function in the your desired region, by running :</p><pre>gcloud functions deploy &lt;YOUR_CLOUD_FUNC_NAME&gt; — gen2 — runtime=nodejs18 — region=&lt;REGION&gt; — source=. — entry-point=&lt;YOUR_CLOUD_FUNC_ENTRYPOINT&gt; — memory=2G — timeout=60 — trigger-http</pre><p>You should see you cloud function available on GCP console</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jbGfMutGShR4jR4e" /></figure><p>Next, attach a monitor to that cloud function :</p><pre>gcloud monitoring uptime create &lt;YOUR_MONITOR_NAME&gt; — synthetic-target=projects/&lt;PROJECT_ID&gt;/locations/&lt;REGION&gt;/functions/&lt;YOUR_CLOUD_FUNC_NAME&gt; — period=5</pre><p>You should also see the monitor available and configured on the GCP console</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6y3GdxtOfaN3OSIm" /></figure><p>Navigate to the monitor detail page, you can see whether it status is passing or not.</p><p>Go ahead and create an <strong>Alerting policy,</strong> this step is crucial as it will notify you when you monitoring goes wrong.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Fe3OKpImz_cMfqmr" /></figure><p>Define a duration before an incident is declared, select a channel (email, slack, pager-duty, …). And add instruction to help the duty-girl/boy understand the incident.</p><p>For now, we have seen Transaction Monitoring<strong> </strong>with GCP, but what about Web performance monitoring ?</p><p>This doesn’t come out of the box, but still possible on GCP by combining puppeteer with lighthouse (checkout puppeteer documentation for this <a href="https://github.com/GoogleChrome/lighthouse/blob/main/docs/puppeteer.md">https://github.com/GoogleChrome/lighthouse/blob/main/docs/puppeteer.md</a>).</p><h3>Set-up on synthetic monitoring on Datadog</h3><p>A synthetic monitor on Datadog is composed of different components :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lziGNzTeJALFcnbR" /></figure><p>Select <strong>UX Monitoring &gt; Synthetic tests &gt; New Test </strong>then<strong> </strong>create a “Browser test”</p><p>Configure your test by filling:</p><ul><li>Target URL</li><li>Name,</li><li>Browser targets (Chrome, Firefox, …)</li><li>Locations: Chose one or multiple locations based on your business requirements</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*B3fDBDitXN0-jiRZ" /></figure><p>Next, same as the GCP part, we need to define the test period and alerting conditions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZhM8pJDFjht9GHNu" /></figure><p>To create our test scenario it’s quite easy and fast, Datadog allow you to record a journey directly from your browser (This requires a browser extension to be installed)</p><p>Go ahead and create your own journey, and once you are satisfied, create your monitor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*m362NiBqGucAgHeY" /></figure><p>By default, a Browser performance dashboard is already available.</p><p>This one showcases the metrics like</p><ul><li>success rate per browser (chosen in the test configuration in the steps above)</li><li>Core web vitals</li><li>Long running tasks (which can be painful for your users)</li><li>3-party integration</li><li>…</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UTAhPyuboEakG7TV" /></figure><h3>Conclusion</h3><p>Leveraging Google Cloud for <strong>Availability and Transaction Monitoring</strong> is a robust and efficient choice, especially for those already integrated into the Google Cloud ecosystem.</p><p>The seamless integration and comprehensive tools available within Google Cloud ensure thorough and effective transaction monitoring.</p><p>However, when it comes to web performance monitoring, while it’s still possible on Google Cloud, exploring Datadog can provide additional benefits.</p><p>Datadog’s Real User Monitoring (RUM) is particularly noteworthy, offering advanced capabilities and insights that might better serve your web performance monitoring needs.</p><p>More information :</p><ul><li><a href="https://docs.datadoghq.com/synthetics/">Link to Datadog doc</a></li><li><a href="https://cloud.google.com/monitoring/uptime-checks/introduction">Link to Google Cloud doc</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2391b9f38025" width="1" height="1" alt=""><hr><p><a href="https://medium.zenika.com/getting-started-with-synthetic-monitoring-on-gcp-and-datadog-2391b9f38025">Getting Started with Synthetic Monitoring on GCP and Datadog</a> was originally published in <a href="https://medium.zenika.com">Zenika</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>