<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
    <title>La Forge - observabilité</title>
    <subtitle>Le blog de la Forge</subtitle>
    <link rel="self" type="application/atom+xml" href="https://staging.lafor.ge/tags/observabilite/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://staging.lafor.ge"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2022-08-11T00:00:00+00:00</updated>
    <id>https://staging.lafor.ge/tags/observabilite/atom.xml</id>
    <entry xml:lang="fr">
        <title>Gérer ses erreurs en Rust</title>
        <published>2022-08-11T00:00:00+00:00</published>
        <updated>2022-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://staging.lafor.ge/errors/"/>
        <id>https://staging.lafor.ge/errors/</id>
        
        <content type="html" xml:base="https://staging.lafor.ge/errors/">&lt;p&gt;Bonjour à toutes et tous 😀&lt;/p&gt;
&lt;p&gt;Les erreurs en Rust sont un vaste sujet.&lt;/p&gt;
&lt;p&gt;Au fur et à mesure que l’application se complexifie, la gestion des erreurs devient cruciale.&lt;/p&gt;
&lt;p&gt;Le problème est que chaque bibliothèque expose son propre système d’erreurs.&lt;/p&gt;
&lt;p&gt;Si votre projet utilise un certain nombre de bibiliothèques, vous pouvez vous trouver dans la situation où vous devez réaliser des adaptations de code
pour permettre aux erreurs d’être compatibles entre-elles.&lt;/p&gt;
&lt;p&gt;Avant de se plonger dans la crate &lt;code&gt;eyre&lt;/code&gt; que je souhaite vous présenter, nous allons faire un petit tour d’horizon de ce qui existe déjà.&lt;/p&gt;
&lt;h2 id=&quot;retrospective-de-la-gestion-d-erreurs&quot;&gt;Rétrospective de la gestion d’erreurs&lt;/h2&gt;
&lt;h3 id=&quot;la-situation-d-urgence-le-panic&quot;&gt;La situation d’urgence : le panic&lt;/h3&gt;
&lt;p&gt;Il existe en Rust une manière d’interrompre une exécution. Il s’agit du mécanisme de &lt;code&gt;panic&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; will_fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Ce programme meurt ici et maintenant&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    will_fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Ne sera jamais affiché&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L’idée est simple, si le code arrive dans une instruction de panic, l’exécution se stoppe immédiatement et le programme retourne la stack trace.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;thread &amp;#39;main&amp;#39; panicked at &amp;#39;Ce programme meurt ici et maintenant&amp;#39;, src\main.rs:2:5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   2: error_reporting::will_fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   3: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error: process didn&amp;#39;t exit successfully: `target\debug\error-reporting.exe` (exit code: 101)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce mécanisme permet de préserver un système d’un état qui ne peut pas être géré et qui doit provoquer son extinction pur et simple.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le fichier de configuration n’est pas trouvable et il n’y a pas de valeur par défaut.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le gros point faible de ce système, est qu’une fois qu’un programme a paniqué, il est difficile (mais pas impossible) de le récupérer.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous voulez effectuer une récupération d’un panic, il existe un méthode &lt;code&gt;catch_unwind&lt;/code&gt;, qui permet de faire poursuivre le programme en capturant la panique.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    catch_unwind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;will_fail&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Hello world&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Par contre, ce système n’est pas conçu pour vous permettre de faire un mécanisme de &lt;code&gt;try/catch&lt;/code&gt;. Il est uniquement là pour assurer la compatibilité avec des libs en C par exemple.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;utilisation-d-un-booleen-comme-status-de-retour&quot;&gt;Utilisation d’un booléen comme status de retour&lt;/h3&gt;
&lt;p&gt;La réponse naïve dans la gestion d’erreur consiste à renvoyer un booléen &lt;code&gt;true/false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il indique l’état d’un traitement.&lt;/p&gt;
&lt;p&gt;Généralement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;true : tout s’est bien passé&lt;/li&gt;
&lt;li&gt;false : une erreur est survenue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;    true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Échec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;utilisation-d-un-code-de-retour-numerique&quot;&gt;Utilisation d’un code de retour numérique&lt;/h3&gt;
&lt;p&gt;Ce système marche bien lorsqu’il n’y a que deux états possibles.&lt;/p&gt;
&lt;p&gt;Sinon l’on doit faire comme en &lt;code&gt;C&lt;/code&gt; où l’on utilise des codes de retour.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 : tout c’est bien passé&lt;/li&gt;
&lt;li&gt;1 : une erreur recouvrable est survenue&lt;/li&gt;
&lt;li&gt;autre chose : une erreur impossible à résoudre est survenue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;    2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;        0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;        1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Erreur&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce système rudimentaire, permet de pouvoir gérer plus finement le déroulé de notre programme. Mais ce n’est pas encore suffisant.&lt;/p&gt;
&lt;h3 id=&quot;la-gestion-idiomatique-des-erreurs-en-rust&quot;&gt;La gestion idiomatique des erreurs en Rust&lt;/h3&gt;
&lt;p&gt;Rust possède son propre système de gestion d’erreur basé sur une énumération &lt;code&gt;Result&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Celle-ci se compose ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; E&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les deux variantes de l’énumération étant génériques. Le type de la valeur de retour et le type de l’erreur ne sont pas contraints.&lt;/p&gt;
&lt;p&gt;Nous allons créer notre propre erreur au travers d’une enumération:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Failure&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous alors utiliser l’objet &lt;code&gt;Rusult&lt;/code&gt; comme retour de notre méthode &lt;code&gt;process&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; i8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis traiter l’erreur éventuelle, au travers d’un &lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;41&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Erreur le nombre est supérieur à 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Le nombre ne peut pas être négatif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Utiliser cette énumération nous ouvre certaines possibilitées comme la propagation des erreurs.&lt;/p&gt;
&lt;h3 id=&quot;propagation-d-erreur&quot;&gt;Propagation d’erreur&lt;/h3&gt;
&lt;p&gt;Imaginons qu’une erreur soit levée dans un appel profond de notre programme.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;After deep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si l’on exécute la fonction &lt;code&gt;process&lt;/code&gt;, nous allons voir s’afficher :&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;After deep`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or, nous ne voulons pas ça.&lt;/p&gt;
&lt;p&gt;Nous voulons que l’exécution de &lt;code&gt;process&lt;/code&gt; se stoppe si la méthode &lt;code&gt;deep&lt;/code&gt; est en erreur.&lt;/p&gt;
&lt;p&gt;Pour ce faire, nous devons propager l’erreur venant de la méthode &lt;code&gt;deep&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;After deep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après cette modification nous n’avons plus le &lt;code&gt;After deep&lt;/code&gt; dans la console. Nous avons réalisé un &lt;em&gt;early return&lt;/em&gt; de notre erreur.&lt;/p&gt;
&lt;h3 id=&quot;un-ou-deux-sucre-avec-votre-erreur&quot;&gt;Un ou deux sucre avec votre erreur ?&lt;/h3&gt;
&lt;p&gt;Le fait d’utiliser un &lt;code&gt;Result&lt;/code&gt; de la stdlib nous ouvre aussi la porte à l’utilisation d’une syntaxe particulière qui permet de propager une erreur.&lt;/p&gt;
&lt;p&gt;Celle-ci consiste à rajouter un &lt;code&gt;?&lt;/code&gt; à la fin de l’appel d’une fonction retournant un &lt;code&gt;Result&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ceci provoquera le retour immédiat de l’erreur si celle-ci survient.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;After deep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bien sûr, ce processus peut se réaliser à n’importe quelle profondeur d’exécution.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;After deep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui permet de se concentrer sur l’essentiel c’est à dire le déroulé du code lorsqu’il y a pas d’échec.&lt;/p&gt;
&lt;h2 id=&quot;contexte-d-erreur&quot;&gt;Contexte d’erreur&lt;/h2&gt;
&lt;p&gt;Savoir que le code est en erreur est une chose, savoir pourquoi il l’est, c’est encore mieux.&lt;/p&gt;
&lt;p&gt;Pour cela, nous allons aggrémenter notre erreur d’un contexte qui nous permettra de mieux cerner le souci.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Failure&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Au lieu de renvoyer une simple erreur, nous allons également rajouter du contexte sous la forme d’une chaîne de caractères.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into below_deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis, nous pouvons alors afficher cette Erreur avec plus de détails.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; val&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;old_val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Erreur: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela nous donne dans la console:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Erreur: occurs into below_deep function&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous sommes désormais, dans la capacité de déterminer qu’une erreur s’est produite, et pourquoi elle s’est produite.&lt;/p&gt;
&lt;p&gt;Mais, nous ne savons pas où elle s’est produite.&lt;/p&gt;
&lt;p&gt;Pour cela nous allons devoir agrémenter un peu notre code.&lt;/p&gt;
&lt;h3 id=&quot;capturer-la-backtrace-dans-le-contexte&quot;&gt;Capturer la backtrace dans le contexte&lt;/h3&gt;
&lt;p&gt;Il existe une crate qui se nomme &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/rust-lang/backtrace-rs&quot;&gt;&lt;code&gt;backtrace-rs&lt;/code&gt;&lt;/a&gt; qui est capable d’effectuer ce travail pour nous.&lt;/p&gt;
&lt;p&gt;D’abord, nous installons la crate.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cargo add backtrace&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis, nous allons ensuite modifier notre structure d’erreur.&lt;/p&gt;
&lt;p&gt;Ensuite, nous transformons la variante &lt;code&gt;Error&lt;/code&gt; en une structure possédant deux champs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;details qui contient les détails de l’erreur&lt;/li&gt;
&lt;li&gt;backtrace la callstack amenant à l’erreur&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Failure&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour nous faciliter la vie nous créons un contructeur&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Que nous utilisons dans la suite du code&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into below deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On modifie également la façon d’afficher les erreurs, pour rajouter la notion de backtrace.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; val&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;old_val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Erreur: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;backtrace:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne à l’exécution l’erreur suivante:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Erreur: occurs into below deep function &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   5: enum$&amp;lt;error_reporting::MyError, 1, 18446744073709551615, Error&amp;gt;::new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   6: error_reporting::below_deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   7: error_reporting::deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:36&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   8: error_reporting::process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:41&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   9: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:49&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si on décrit cette stacktrace sous la forme d’un graph cela nous donne:&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
  

flowchart LR
    main --&gt; process --&gt; deep --&gt; below_deep -.-&gt; MyError::new


&lt;/pre&gt;
&lt;p&gt;Sauf que le &lt;code&gt;MyError::new&lt;/code&gt; est de trop dans l’histoire, il vient polluer la stacktrace avec une étape inutile.&lt;/p&gt;
&lt;p&gt;Pour éviter cet appel à &lt;code&gt;new&lt;/code&gt;, nous allons utiliser une macro qui va effectuer le tavail à notre place.&lt;/p&gt;
&lt;p&gt;Si vous avez un trou de mémoire ou que ne connaissez pas le principe des macros, j’ai rédiger &lt;a href=&quot;/macro-rust&quot;&gt;un article&lt;/a&gt; dessus. 😀&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;macro_rules!&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Que l’on utilise ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into below deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette fois-ci la stacktrace devient:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Erreur: occurs into below deep function &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   5: error_reporting::below_deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   6: error_reporting::deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:25&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   7: error_reporting::process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   8: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:38&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Où&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
  

flowchart LR
    main --&gt; process --&gt; deep --&gt; below_deep


&lt;/pre&gt;
&lt;p&gt;Ce qui est mieux. 😊&lt;/p&gt;
&lt;h2 id=&quot;qualifier-sa-chaine-d-erreurs&quot;&gt;Qualifier sa chaîne d’erreurs&lt;/h2&gt;
&lt;p&gt;Il serait également intéressant de pouvoir qualifier les erreurs tout au long du parcours d’exécution.&lt;/p&gt;
&lt;p&gt;Pour cela nous allons rajouter une notion de chaîne d’erreurs.&lt;/p&gt;
&lt;p&gt;Celle-ci nous permettra au besoin de pouvoir parcourir les différentes erreurs ayant conduits à l’arrêt de l’exécution du programme.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Failure&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notre chaîne d’erreurs sera contenu dans le champ &lt;code&gt;source&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Expliquons son type.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Option&amp;lt;MyError&amp;gt;&lt;/code&gt; : signifie la possibilité d’avoir un maillon inférieur dans notre chaîne d’erreurs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Box&amp;lt;Option&amp;lt;MyError&amp;gt;&amp;gt;&lt;/code&gt; : permet de rendre le champ représentable en mémoire, sans cela &lt;code&gt;source&lt;/code&gt; aurait une taille infinie.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous rajoutons alors à notre macro &lt;code&gt;raise&lt;/code&gt;, une autre possibilitée d’être invoquée.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;macro_rules!&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Celle-ci prendra en deuxième paramètre une instance de &lt;code&gt;MyError&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Que l’on peut utiliser ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into below deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; middle_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;was in middle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    middle_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans la méthode &lt;code&gt;middle_deep&lt;/code&gt;, au lieu de propager l’erreur directement, nous allons l’aggrémenter d’informations supplémentaires.&lt;/p&gt;
&lt;p&gt;Avant de retourner une nouvelle erreur possédant comme &lt;code&gt;source&lt;/code&gt;, l’erreur déclenchée par la méthode &lt;code&gt;below_deep&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;was in middle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons également devoir revoir la manière dont nous affichons nos erreurs.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Vec&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; vec!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                source&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;clone&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;deref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                    let&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;deep_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result_backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                    backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result_backtrace&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                    outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;extend&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;deep_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;into_iter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                backtrace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; unreachable!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;outer_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L’algorithme est simple: on accumule les détails en traversant les différents maillons de la chaîne d’erreurs et l’on récupère la stacktrace la plus longue et donc celle du maillon le plus profond.&lt;/p&gt;
&lt;p&gt;Ce qui nous permet ensuite d’implémenter le trait &lt;code&gt;Debug&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Debug&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;raw_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; raw_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Error: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        write!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;f&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Error: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;backtrace:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis de l’afficher dans notre &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; val&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;old_val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; @&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ..&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;error:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela nous donne:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Error: was in middle&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	Error: occurs into below deep function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   5: error_reporting::below_deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:66&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   6: error_reporting::middle_deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:70&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   7: error_reporting::deep&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:78&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   8: error_reporting::process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:83&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   9: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at src\main.rs:91&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vu que cette partie est un peu longue, je vous donne le code complet:&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Backtrace&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;ops&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Deref&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Failure&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Vec&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; vec!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                backtrace&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                source&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;clone&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;deref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                    let&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;deep_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result_backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                    backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result_backtrace&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                    outer_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;extend&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;deep_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;into_iter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                backtrace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; unreachable!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;outer_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; outer_backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Debug&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;raw_details&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; backtrace&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; raw_details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Error: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        write!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;f&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Error: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;backtrace:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;macro_rules!&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;expr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Backtrace&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            source&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Box&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into below deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; middle_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; below_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;was in middle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    middle_deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    deep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;After deep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; val&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;old_val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;val&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Succès&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; @&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ..&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;error:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;            old_val&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MyError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Failure&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;À partir de ce moment on peut commencer à nous amuser avec le système.&lt;/p&gt;
&lt;p&gt;Par exemple effectuer le code&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; open_registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;registry_name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open registry &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;registry_name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; open_registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;registry_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open registry for user &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;42&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    raise!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;occurs into deep function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; MyError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne comme chaîne d’erreur ceci:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Error: Unable to open registry for user 42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	Error: Unable to open registry &amp;quot;registry_42&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ces contextes nous permettent de mieux comprendre les erreurs, et ainsi les debugger plus facilement.&lt;/p&gt;
&lt;h2 id=&quot;eyre-est-la-pour-nous-faciliter-la-vie&quot;&gt;Eyre est là pour nous faciliter la vie&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.rs/eyre/latest/eyre/index.html&quot;&gt;Eyre&lt;/a&gt; est une crate qui est conçu pour réaliser la totalité des actions que nous avons implémentées plus haut.&lt;/p&gt;
&lt;p&gt;La crate présente plusieurs éléments qui permettent de simplifier la vie au développeur.&lt;/p&gt;
&lt;h3 id=&quot;l-objet-result-de-eyre&quot;&gt;L’objet Result de eyre&lt;/h3&gt;
&lt;p&gt;Le premier élément de la lib &lt;code&gt;eyre&lt;/code&gt; est un objet &lt;code&gt;eyre::Result&amp;lt;T, eyre::Report&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour bénéficier de l’error reporting de eyre, vous devez remplacer vos &lt;code&gt;Result&lt;/code&gt; par des &lt;code&gt;eyre::Result&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple, si vous aviez une fonction qui retournait une &lt;code&gt;std::result::Result&amp;lt;(), CustomError&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;...&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous allez devoir la remplacer par&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; eyre&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;...&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;le-report-de-eyre&quot;&gt;Le Report de eyre&lt;/h3&gt;
&lt;p&gt;Le &lt;code&gt;eyre::Report&lt;/code&gt; est l’alternative d’erreur de &lt;code&gt;eyre::Result&lt;/code&gt;. Son rôle est d’accumuler la chaîne d’erreur et de fournir le backtrace de la &lt;em&gt;root_cause&lt;/em&gt; de l’erreur.&lt;/p&gt;
&lt;h3 id=&quot;generer-un-report&quot;&gt;Générer un Report&lt;/h3&gt;
&lt;p&gt;Afin de faciliter la création d’un &lt;code&gt;Report&lt;/code&gt;, la crate &lt;code&gt;eyre&lt;/code&gt; fournit une macro &lt;code&gt;eyre!&lt;/code&gt; permettant entre autre de générer un &lt;code&gt;Report&lt;/code&gt; qui constituera le premier maillon de notre chaîne d’erreurs.&lt;/p&gt;
&lt;p&gt;Cette macro est assez souple, elle peut prendre en entré:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soit une chaine de caractères&lt;/li&gt;
&lt;li&gt;soit une structure ou une énumération qui implémente les traits &lt;code&gt;Debug&lt;/code&gt; et &lt;code&gt;Display&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour une chaine de caractères cela donnerait:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; eyre&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;eyre!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Cette fonction va échouer&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;De même avec la structure ou l’énumération implémentant &lt;code&gt;Debug&lt;/code&gt; et &lt;code&gt;Display&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    One&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Display&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        write!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;f&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; self&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;eyre!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;One&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;wrapper-une-erreur-dans-un-report&quot;&gt;Wrapper une Erreur dans un Report&lt;/h3&gt;
&lt;p&gt;Une autre composante très importante de &lt;code&gt;eyre&lt;/code&gt; est sa capacité à venir se greffer à n’importe quelle erreur existante (il peut y avoir des exceptions cependant).&lt;/p&gt;
&lt;p&gt;Et venir qualifier des erreurs.&lt;/p&gt;
&lt;p&gt;Ceci est réalisé au moyen d’une méthode &lt;code&gt;wrap_err&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open file &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On remarque le &lt;code&gt;Report&lt;/code&gt; peut être manipulé comme n’importe quel &lt;code&gt;Result&lt;/code&gt; et donc à la capactité d’être propagé au besoin.&lt;/p&gt;
&lt;p&gt;Si l’on tente d’afficher le &lt;code&gt;Report&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; my_function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open file &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;voici ce que l’on obtient:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Unable to open file /tmp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Le fichier spécifié est introuvable. (os error 2)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Location:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    src\main.rs:18:10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous avons bien l’erreur primordiale venant de l’OS, et au-dessus le contexte que l’on a utilisé pour wrapper l’erreur système.&lt;/p&gt;
&lt;h3 id=&quot;exemple-complet&quot;&gt;Exemple complet&lt;/h3&gt;
&lt;p&gt;Si l’on prend un exemple complet cela nous donne quelque chose comme ceci.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; eyre&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;eyre&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; WrapErr&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; open_ledger_internal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    File&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open file &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; open_ledger&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ledger_id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    open_ledger_internal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/tmp/registry_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ledger_id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;eyre!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open ledger #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ledger_id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; open_registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;registry_name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    open_ledger&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;42666&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;eyre!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open registry : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;registry_name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    open_registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;registry_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;eyre!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to open registry for user &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Trying to authenticate user #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user_id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Running with user #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; process&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;42&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Qui se matérialise dans la console, lorsque l’on affiche le &lt;code&gt;Report&lt;/code&gt; final en ceci:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running with user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   0: Trying to authenticate user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   1: Unable to open registry for user 42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   2: Unable to open registry : registry_42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   3: Unable to open ledger #42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   4: Unable to open file /tmp/registry_42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   5: Le chemin d’accès spécifié est introuvable. (os error 3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Location:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    src\main.rs:5:22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  10: error_reporting::open_ledger_internal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  11: error_reporting::open_ledger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  12: error_reporting::open_registry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:17&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  13: error_reporting::auth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  14: error_reporting::run&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:28&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  15: error_reporting::process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:33&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  16: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:38&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette stacktrace ainsi que les détails nous permettent d’avoir une vue complète de l’exécution de notre programme.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien sûr, ici nous avons wrappé d’un contexte tous les &lt;code&gt;Result&lt;/code&gt; des différents retours, mais nous aurions très bien pu juste propager l’erreur.&lt;/p&gt;
&lt;p&gt;Si l’on modifie dans le code ci-dessus la méthode &lt;code&gt;auth&lt;/code&gt; pour retirer le contexte.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    open_registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;registry_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La chaîne de contextes d’erreurs devient:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running with user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   0: Trying to authenticate user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   1: Unable to open registry : registry_42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   2: Unable to open ledger #42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   3: Unable to open file /tmp/registry_42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   4: Le chemin d’accès spécifié est introuvable. (os error 3)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ainsi nul besoin, de vouloir absolument wrapper tous ses &lt;code&gt;Report&lt;/code&gt;. La crate est suffisamment souple pour nous permettre de
rajouter du contexte uniquement là où cela est nécessaire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;gestion-de-l-affichage-des-reports&quot;&gt;Gestion de l’affichage des Reports&lt;/h3&gt;
&lt;p&gt;un &lt;code&gt;Report&lt;/code&gt; possède plusieurs façon de s’afficher:&lt;/p&gt;
&lt;h4 id=&quot;debug&quot;&gt;Debug&lt;/h4&gt;
&lt;p&gt;S’affiche avec&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Donne la dernière erreur connue, les details de chaque erreur de la chaîne ainsi que la stacktrace conduisant à l’erreur.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running with user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   0: Trying to authenticate user #42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   1: Unable to open registry for user 42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   2: Unable to open registry : registry_42&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   3: Unable to open ledger #42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   4: Unable to open file /tmp/registry_42666&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   5: Le chemin d’accès spécifié est introuvable. (os error 3)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Location:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    src\main.rs:5:22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;display&quot;&gt;Display&lt;/h4&gt;
&lt;p&gt;S’affiche avec:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Donne seulement la dernière erreur connu et cache la raison primordiale.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running with user #42&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;display-alternatif&quot;&gt;Display alternatif&lt;/h4&gt;
&lt;p&gt;S’affiche avec:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report:#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Donne toutes les raisons de la chaîne d’erreurs sur une seule ligne, cache la stacktrace.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running with user #42: Trying to authenticate user #42: Unable to open registry : registry_42: Unable to open ledger #42666: Unable to open file /tmp/registry_42666: Le &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;chemin d’accès spécifié est introuvable. (os error 3)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;utiliser-eyre-dans-un-exemple-concret&quot;&gt;Utiliser eyre dans un exemple concret&lt;/h2&gt;
&lt;p&gt;Dans &lt;a href=&quot;/telemetry-rust/#un-petit-exemple-concret&quot;&gt;un précédent article&lt;/a&gt; nous avions uilisé un certain nombre de lib pour à la fois effectuer des requêtes sur le web et désérialiser des données.&lt;/p&gt;
&lt;p&gt;Ces bibliothèques possèdent des erreurs spécifiques qui sont incompatibles entre-elles.&lt;/p&gt;
&lt;p&gt;Ce qui rend compliquée la gestion immédiate des erreurs qui doivent être mappé vers une Erreur commune.&lt;/p&gt;
&lt;p&gt;À l’époque nous avions utilisé la crate &lt;code&gt;thiserror&lt;/code&gt; pour réaliser cette conversion.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; thiserror&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;sqlite errors &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;reqwest errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;json errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons réécrire la même gestion d’erreurs mais en gérant cette fois-ci nos erreur dans un &lt;code&gt;eyre::Report&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
	&lt;p&gt;Pour plus de clarté je ne n’implémenterai pas la partie sqlite&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La fonction qui nous intéresse est celle ci:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://jsonplaceholder.typicode.com/users/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Elle possède à la fois des erreurs de type &lt;code&gt;reqwest&lt;/code&gt; et &lt;code&gt;serde_json&lt;/code&gt;, grâce à la bibliothèque &lt;code&gt;thiserror&lt;/code&gt; et les &lt;code&gt;impl From&amp;lt;Error&amp;gt;&lt;/code&gt; cela est plus ou moins transparent.&lt;/p&gt;
&lt;p&gt;Mais, cela représente tout de même un certain volume de code de boilerplate.&lt;/p&gt;
&lt;p&gt;Voyons comment réécrire cela grâce à &lt;code&gt;eyre&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; eyre&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;eyre&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; WrapErr&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    email&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    phone&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    website&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://jsonplaceholder.typicode.com/users/1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;report:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je vous fournis également le Cargo.toml&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;eyre&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.6.8&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.11.11&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.140&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;derive&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_json&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.82&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;thiserror&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.31&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tokio&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.20.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;rt-multi-thread&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;macros&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C’est plus simple non ? 🤩&lt;/p&gt;
&lt;h3 id=&quot;on-essaie-la-gestion-d-erreur&quot;&gt;On essaie la gestion d’erreur&lt;/h3&gt;
&lt;h4 id=&quot;pas-d-erreur&quot;&gt;Pas d’erreur&lt;/h4&gt;
&lt;p&gt;Pour une &lt;code&gt;url=https://jsonplaceholder.typicode.com/users/1&lt;/code&gt;: pas de soucis.&lt;/p&gt;
&lt;h4 id=&quot;reqwest&quot;&gt;Reqwest&lt;/h4&gt;
&lt;p&gt;Pour une &lt;code&gt;url=https://jsonplaceholder.typicode.com2/users/1&lt;/code&gt;, le report renvoit:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error sending request for url (https://jsonplaceholder.typicode.com2/users/1): error trying to connect: dns error: Hôte inconnu. (os error 11001)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   0: error trying to connect: dns error: Hôte inconnu. (os error 11001)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   1: dns error: Hôte inconnu. (os error 11001)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   2: Hôte inconnu. (os error 11001)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Location:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    src\main.rs:14:20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  10: error_reporting::fetch_user::async_fn$0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:14&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  12: error_reporting::main::async_block$0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  24: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:23&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le sytème tente de réaliser un call HTTP sur le domaine ”jsonplaceholder.typicode.com2”, mais celui-ci n’existe pas.&lt;/p&gt;
&lt;h4 id=&quot;json&quot;&gt;Json&lt;/h4&gt;
&lt;p&gt;Pour une &lt;code&gt;url=https://jsonplaceholder.typicode.com/users/22&lt;/code&gt;, le report renvoit:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;missing field `id` at line 1 column 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Location:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    src\main.rs:15:16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Stack backtrace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  10: error_reporting::fetch_user::async_fn$0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:15&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  12: error_reporting::main::async_block$0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  24: error_reporting::main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             at .\src\main.rs:23&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Au-delà de &lt;code&gt;10&lt;/code&gt;, l’API renvoit un json vide. La phase de désérialisation échoue car elle n’arrive pas à trouver le champ id.&lt;/p&gt;
&lt;h3 id=&quot;enrichir-les-erreurs&quot;&gt;Enrichir les erreurs&lt;/h3&gt;
&lt;p&gt;Cette erreur de désérialisation n’est pas claire, essayons de rajouter un peu plus de contexte.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Error while trying to deserialize user from &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Error while trying to deserialize user from https://jsonplaceholder.typicode.com/users/22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    missing field `id` at line 1 column 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et bien, voilà! C’est beaucoup mieux! 😁&lt;/p&gt;
&lt;p&gt;Le debugging sera bien plus simple ainsi.&lt;/p&gt;
&lt;p&gt;Et nous nous sommes débarassé de beaucoup de code qui venait parasiter notre compréhension des choses.&lt;/p&gt;
&lt;p&gt;Nous nous sommes également épargné un crate supplémentaire.&lt;/p&gt;
&lt;h2 id=&quot;utiliser-eyre-dans-le-contexte-d-une-lib&quot;&gt;Utiliser eyre dans le contexte d’une lib&lt;/h2&gt;
&lt;p&gt;La documentation officielle prévient qu’il n’est pas recommendé d’exposer directement un &lt;code&gt;eyre::Result&lt;/code&gt; comme sortie d’erreur publique de votre lib.&lt;/p&gt;
&lt;p&gt;La créatrice de eyre en a fait une réponse dans un thread &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://github.com/yaahc/eyre/issues/30#issuecomment-647650361&quot;&gt;d’issue github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour simuler cette exposition d’erreurs par une lib externe, je vous propose d’utiliser &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/blog_example1/error_management&quot;&gt;ce projet&lt;/a&gt; que nous allons détailler ensemble.&lt;/p&gt;
&lt;p&gt;Le projet est composé d’un workspace contenant un sous projet &lt;code&gt;user&lt;/code&gt;, ce sous-projet sera notre lib externe exposant une API d’erreur spécifique.&lt;/p&gt;
&lt;p&gt;Le &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/blog_example1/error_management/-/blob/master/src/main.rs&quot;&gt;main.rs&lt;/a&gt; principal est plutôt simple, il déclare le réacteur asynchrone de tokio et affiche soit l’utilisateur si trouvé, soit l’erreur venant de la lib &lt;code&gt;user&lt;/code&gt; si ce n’est pas le cas.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://jsonplaceholder.typicode.com/users/2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;user:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans la lib &lt;code&gt;user&lt;/code&gt;, la méthode &lt;code&gt;fetch_user&lt;/code&gt; ne bouge pas.&lt;/p&gt;
&lt;p&gt;Enfin on introduit dans lib &lt;code&gt;user&lt;/code&gt; une méthode &lt;code&gt;run&lt;/code&gt; dont son rôle est de transformer le &lt;code&gt;Report&lt;/code&gt; de &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/blog_example1/error_management/-/blob/master/user/src/lib.rs#L24&quot;&gt;&lt;code&gt;fetch_user&lt;/code&gt;&lt;/a&gt; en une &lt;code&gt;UserError&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; thiserror&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;pub&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; enum&lt;/span&gt;&lt;span&gt; UserError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to fetch url: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unable to unmarshal user data: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Unmarshal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Unknown error&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Unknown&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On réutilise ici la crate &lt;code&gt;thiserror&lt;/code&gt; pour nous simplifier la création des erreurs, cette crate nous permettant dimplémenté le trait &lt;code&gt;Display&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On va ici introduire une fonctionnalité essentielle de &lt;code&gt;eyre&lt;/code&gt;: le déréférencement !&lt;/p&gt;
&lt;p&gt;L’idée est de récupérer l’erreur qui a été wrap par le &lt;code&gt;Report&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Imaginons la situation suivante, si l’on wrap une erreur venant d’un &lt;code&gt;File::open&lt;/code&gt;, nous allons obtenir un Report contenant une &lt;code&gt;io::Error&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour récupérer cette &lt;code&gt;io::Error&lt;/code&gt;, nous allons devoir la déréférencer du &lt;code&gt;Report&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; :&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Report&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;mp&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ot&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;xists&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;This file not exists&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;io_error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici le plus important à comprendre c’est l’appel à &lt;code&gt;report.downcast_ref::&amp;lt;E&amp;gt;()&lt;/code&gt;, &lt;code&gt;E&lt;/code&gt; étant le type vers lequel l’on souhaite caster le &lt;code&gt;Report&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce qui fait qu’à partir de ce moment là on est capable de savoir le type exact de l’erreur qui vient d’être levée.&lt;/p&gt;
&lt;p&gt;La deuxième capacité de &lt;code&gt;downcast_ref&lt;/code&gt;, est de pouvoir également extraire le contexte du &lt;code&gt;Report&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;io_error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; details == &amp;quot;This file not exists&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class=&quot;markdown-alert-warning&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si le contexte provient d’un &lt;code&gt;format!&lt;/code&gt; alors son type est &lt;code&gt;String&lt;/code&gt; et non &lt;code&gt;&amp;amp;str&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il faut donc modifier le downcast en conséquence!&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; :&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Report&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;mp&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ot&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;xists&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;wrap_err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;File &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; not exists&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;mp&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ot&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;xists&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;io_error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; details == &amp;quot;This file not exists&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Revenons maintenant à notre lib &lt;code&gt;user&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Notre fonction &lt;code&gt;run&lt;/code&gt;, prend en paramètre une URL et effectue un &lt;code&gt;fetch_user&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;S’il y a erreur, elle transforme le &lt;code&gt;Report&lt;/code&gt; en une &lt;code&gt;UserError&lt;/code&gt; qui peut ensuite être présentée publiquement.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;pub&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; UserError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;report&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Gestion d&amp;#39;une erreur de fetch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest_error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UserError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest_error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Gestion d&amp;#39;une erreur de désérialisation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;                //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Si du contexte est accroché à l&amp;#39;erreur on le récupère&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; report&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;downcast_ref&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                    return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UserError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Unmarshal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;                //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Sinon on renvoie l&amp;#39;erreur brute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UserError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Unmarshal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_error&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; On gère aussi le cas d&amp;#39;une erreur inconnue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UserError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Unknown&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Faisons quelques essais.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;url=”https://jsonplaceholder.typicode.com/users/2”&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User { id: 2, name: “Ervin Howell”, email: “Shanna@melissa.tv”, phone: “010-692-6593 x09125”, website: “anastasia.net” }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;url=”https://jsonplaceholder.typicode.com/users/22”&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Unable to unmarshal user data: Error while trying to deserialize user from https://jsonplaceholder.typicode.com/users/22&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;url=”https://jsonplaceholder.typicode.com2/users/2”&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Unable to fetch url: error sending request for url (https://jsonplaceholder.typicode.com2/users/): error trying to connect: dns error: Hôte inconnu. (os error 11001)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Et Voilà !&lt;/p&gt;
&lt;p&gt;Comme toujours, il y aurait encore tant de chose à dire, mais nous allons nous arrêter là pour aujourd’hui.&lt;/p&gt;
&lt;p&gt;J’espère que la découverte de la bibliothèque &lt;code&gt;eyre&lt;/code&gt; vous a plu, et que la restropective de la gestion d’erreur aussi! 😁&lt;/p&gt;
&lt;p&gt;Je vous souhaite une bonne journée et merci de m’avoir lu. ❤️&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="fr">
        <title>Debugguer avec la télemétrie en Rust</title>
        <published>2022-07-15T00:00:00+00:00</published>
        <updated>2022-07-15T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://staging.lafor.ge/telemetry-rust/"/>
        <id>https://staging.lafor.ge/telemetry-rust/</id>
        
        <content type="html" xml:base="https://staging.lafor.ge/telemetry-rust/">&lt;p&gt;Bonjour à toutes et tous 😀&lt;/p&gt;
&lt;p&gt;Un &lt;del&gt;court&lt;/del&gt; article sur ma frustration du moment. Je bosse actuellement avec de l’asynchrone et du parrallélisme.&lt;/p&gt;
&lt;p&gt;C’est très cool quand ça marche mais c’est une galère sans nom à débugguer quand ça veut pas. 🙄&lt;/p&gt;
&lt;p&gt;Et quand je dis ça veut pas, je veux dire, l’app bloque sans messages de log parce que vous êtes dans un test d’inté par exemple (non c’est pas du tout du vécu 😡).&lt;/p&gt;
&lt;p&gt;Aujourd’hui, je vous rédige ce billet pour vous montrer de quelle manière l’on peut débugguer ce genre de situations.&lt;/p&gt;
&lt;h2 id=&quot;installer-les-outils&quot;&gt;Installer les outils&lt;/h2&gt;
&lt;p&gt;Nous allons utiliser un projet en Go qui s’appelle &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://www.jaegertracing.io/&quot;&gt;Jaeger&lt;/a&gt; (rien à voir avoir avec les Titans 😋) , ceci est un outil de tracing permettant de visualiser l’éxécution d’un programme asynchrone.&lt;/p&gt;
&lt;p&gt;Comme pré-requis, je considère que vous avez Docker d’installé et de fonctionnel sur votre machine.&lt;/p&gt;
&lt;p&gt;Ainsi que Rust 1.62+ également installé et de fonctionnel.&lt;/p&gt;
&lt;p&gt;Lancez jaeger.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; jaeger&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;p6831:6831/udp&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;p6832:6832/udp&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;p16686:16686&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;    -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;p14268:14268&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    jaegertracing/all-in-one:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si vous vous rendez sur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;http://localhost:16686&quot;&gt;localhost:16686&lt;/a&gt;. Vous devriez vous retrouver devant une interface comme celle ci:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/home.png&quot; alt=&quot;home de jaeger&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous allons aussi avoir besoin d’un projet en Rust.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; lab-telementry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; lab-telementry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; opentelemetry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; opentelemetry-jaeger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; tracing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; tracing-opentelemetry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; tracing-subscriber&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou dans le Cargo.toml&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.17.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry-jaeger&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.16.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.1.35&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing-opentelemetry&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.17.4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing-subscriber&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.3.14&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;les-concepts-de-base&quot;&gt;Les concepts de base&lt;/h2&gt;
&lt;h3 id=&quot;tracer-et-layer&quot;&gt;Tracer et Layer&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Avant de savoir courir il faut apprendre à marcher.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Notre cerveau primitif, n’étant vraiment pas câblé pour l’asynchrone, nous allons expliquer les concepts de bases dans un environnement synchrone.&lt;/p&gt;
&lt;p&gt;Pour cela dans le &lt;code&gt;main.rs&lt;/code&gt;, nous allons créer un petit code de test.&lt;/p&gt;
&lt;p&gt;Nous allons d’abord déclarer notre &lt;code&gt;Tracer&lt;/code&gt; jaeger.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_agent_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous lui donnons le nom de service &lt;code&gt;lab-telemetry&lt;/code&gt;. C’est en quelque sorte l’identifiant projet dans Jaeger, en effet on peut faire le tracing d’une multitude de projet à la fois. Il faut bien quelque choses pour les distinguer.&lt;/p&gt;
&lt;p&gt;Ensuite nous allons déclarer un &lt;code&gt;Layer&lt;/code&gt; OpenTelemetry avec notre &lt;code&gt;Tracer&lt;/code&gt; jaeger.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://opentelemetry.io/&quot;&gt;OpenTelemetry&lt;/a&gt; est une initiative d’uniformisation des standards. Son but est de rendre compatibles l’ensemble des outils de l’écosystème de l’observabilité déjà existants.&lt;/p&gt;
&lt;p&gt;Puis nous allons enregister notre &lt;code&gt;Layer&lt;/code&gt; dans un &lt;code&gt;Registry&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le rôle du &lt;code&gt;Registry&lt;/code&gt; va être de capturer les &lt;code&gt;Span&lt;/code&gt; et de les distribuer aux différent &lt;code&gt;Layers&lt;/code&gt; qui ont souscrit à ce &lt;code&gt;Registry&lt;/code&gt;.
Dans notre cas le &lt;code&gt;opentelemetry_layer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En parlant de &lt;code&gt;Span&lt;/code&gt; créons en une.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;my span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Une &lt;code&gt;Span&lt;/code&gt; est une portion bornée temporellement dans l’éxécution d’un programme, qui a une date de début et une date de fin.&lt;/p&gt;
&lt;p&gt;Entre ces deux bornes temporelles, il va se dérouler des évènements.&lt;/p&gt;
&lt;p&gt;Nous allons aussi forcer les &lt;code&gt;Tracer&lt;/code&gt; à envoyer toutes les &lt;code&gt;Spans&lt;/code&gt; qu’ils connaissent avant de terminer le programme.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Declare a span&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;my span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Si vous allez sur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;http://localhost:16686&quot;&gt;localhost:16686&lt;/a&gt;. En sélectionnant le service &lt;code&gt;lab-telemetry&lt;/code&gt; et ensuite en appuyant sur le bouton
&lt;code&gt;Find Traces&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous devriez désormais voir la span dans le volet de droite, ici entouré en rouge.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync1.png&quot; alt=&quot;home de jaeger du service lab-telemetry&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cela signifie que notre système est opérationnel. Il envoie des &lt;code&gt;Span&lt;/code&gt; à Jaeger.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
	&lt;p&gt;&lt;strong&gt;On récapitule&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons un &lt;code&gt;Tracer&lt;/code&gt; jaeger qui est capable de transformer des &lt;code&gt;Spans&lt;/code&gt; en dans un format de messages que &lt;code&gt;Jaeger&lt;/code&gt; est capable de comprendre.&lt;/li&gt;
&lt;li&gt;Ce &lt;code&gt;Tracer&lt;/code&gt; est inclue dans un &lt;code&gt;Layer&lt;/code&gt; OpenTelemetry qui sert de couche de compatibilité au reste de la télémétrie.&lt;/li&gt;
&lt;li&gt;Ce &lt;code&gt;Layer&lt;/code&gt; est enregistré dans un &lt;code&gt;Registry&lt;/code&gt; qui écoute les spans de notre éxécution de code.&lt;/li&gt;
&lt;li&gt;Les &lt;code&gt;Spans&lt;/code&gt; sont des intervalles de temps dans l’éxécution de notre code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;les-spans&quot;&gt;Les spans&lt;/h3&gt;
&lt;p&gt;Je vous dis depuis tout à l’heure qu’une &lt;code&gt;Span&lt;/code&gt; est un intervalle de temps. Mais il ne semble pas y avoir ni de début ni de fin à notre &lt;code&gt;Span&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Déclarons le début de notre &lt;code&gt;Span&lt;/code&gt; ainsi que sa fin.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; guard&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;my_span bound&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    guard&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync2.png&quot; alt=&quot;home de jaeger du service lab-telemetry avec une span de 2 secondes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous avons bien une &lt;code&gt;Span&lt;/code&gt; de 2 secondes.&lt;/p&gt;
&lt;p&gt;Ce qui est intéressant, c’est que les &lt;code&gt;Spans&lt;/code&gt; peuvent elles-même contenir d’autres &lt;code&gt;Spans&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans Jaeger cela nous donne bien une &lt;code&gt;Span&lt;/code&gt; de 3 secondes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync3.png&quot; alt=&quot;home de jaeger du service lab-telemetry avec une span parent&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mais détail supplémentaire, cette entrée possède 2 spans.&lt;/p&gt;
&lt;p&gt;Cliquez sur &lt;code&gt;2 Spans&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync4.png&quot; alt=&quot;flamechart de la span parent&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous voyons bien l’imbrication des deux &lt;code&gt;Spans&lt;/code&gt;. Le parent dure 3 secondes, l’enfant démarre deux secondes après le début du parent et dure 1 seconde.&lt;/p&gt;
&lt;p&gt;Ce que vous voyez là ce nomme un &lt;code&gt;flamechart&lt;/code&gt; et constitue le nerf de la guerre de notre article.&lt;/p&gt;
&lt;p&gt;Il permet de visualiser temporellement les &lt;code&gt;Spans&lt;/code&gt; de notre application et ainsi comprendre les agencements des appels lors de l’éxécution du programme.&lt;/p&gt;
&lt;p&gt;Pour le moment tout est synchrone donc simple à comprendre mais ça va se corser très vite. 😇&lt;/p&gt;
&lt;p&gt;Le code actualisé.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Level&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Declare a span&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;les-logs&quot;&gt;Les logs&lt;/h3&gt;
&lt;p&gt;Nous sommes désormais dans la capacité de déterminer quand telles où telles &lt;code&gt;Span&lt;/code&gt; commencent et se terminent et même de les imbriquer.&lt;/p&gt;
&lt;p&gt;C’est bien de savoir le &lt;code&gt;Quand&lt;/code&gt; mais le &lt;code&gt;Quoi&lt;/code&gt; c’est encore mieux.&lt;/p&gt;
&lt;p&gt;C’est à ce stade que la notion de &lt;code&gt;logs&lt;/code&gt; est introduite.&lt;/p&gt;
&lt;p&gt;Elle va nous permettre de définir des messages rattacher à la &lt;code&gt;Span&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Nous allons attendre 2 secondes...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin du délai d&amp;#39;attente de 2 secondes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Nous allons attendre 2 secondes...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin du délai d&amp;#39;attente de 2 secondes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la span child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans Jaeger.&lt;/p&gt;
&lt;p&gt;Si vous cliquez sur les deux textes encadrés en rouge à gauche, puis sur &lt;code&gt;Logs&lt;/code&gt;. Vous devriez visualiser ceci:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync5.png&quot; alt=&quot;flamechart de la span parent avec logs&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ce qui est encadré en bleu se nomme un évènement ou &lt;code&gt;Event&lt;/code&gt;. Une même &lt;code&gt;Span&lt;/code&gt; peut contenir de zéro à plusieurs événements.&lt;/p&gt;
&lt;p&gt;Ici, nos deux &lt;code&gt;Spans&lt;/code&gt; possèdent chacune 4 &lt;code&gt;Events&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il est également possible de les ouvrir pour avoir encore plus de détails.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync6.png&quot; alt=&quot;détails des logs d’une span&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ici, nous retrouvons le corps du message ainsi que le niveau de log, le numéro de ligne et le fichier qui a émit cet &lt;code&gt;Event&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce qui est intéressant c’est que ces &lt;code&gt;Event&lt;/code&gt; peuvent-être variabilisés et enrichis.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;  info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync7.png&quot; alt=&quot;détails des logs d’une span avec variable&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et même avec des données complexes comme des structures.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Display&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        write!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;f&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Je suis une requête&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request_display&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; %&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request_debug&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Nous pouvons accéder au champ &lt;code&gt;request.id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nous pouvons appeler le trait &lt;code&gt;Dispay&lt;/code&gt; de &lt;code&gt;Request&lt;/code&gt; via le sigil &lt;code&gt;%&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nous pouvons également appeler le trait &lt;code&gt;Debug&lt;/code&gt; de &lt;code&gt;Request&lt;/code&gt; via le sigil &lt;code&gt;?&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sur Jaeger cela nous donne:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync8.png&quot; alt=&quot;détails des logs d’une span avec tag venant d’une structure&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Les champs qui sont rattachés à un &lt;code&gt;Event&lt;/code&gt; sont des &lt;code&gt;Tags&lt;/code&gt;. Un &lt;code&gt;Tag&lt;/code&gt; est une entité indexée qui peut être recherchée dans Jaeger et dans tout autre plateforme d’analyse de télémétrie.&lt;/p&gt;
&lt;p&gt;Il en va de même pour notre tag personnalisé &lt;code&gt;request.id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync9.png&quot; alt=&quot;recherche par tag&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;Et là on s’aperçoit très vite que si l’on balade un identifiant dans toute nos spans on va pouvoir avoir une vision d’ensemble extrêmement précise de ce qui se passe dans notre système pour un identifiant donné.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
	&lt;p&gt;&lt;strong&gt;On récapitule&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons un &lt;code&gt;Tracer&lt;/code&gt; jaeger qui est capable de transformer des &lt;code&gt;Span&lt;/code&gt; en dans un format de messages que &lt;code&gt;Jaeger&lt;/code&gt; est capable de comprendre.&lt;/li&gt;
&lt;li&gt;Ce &lt;code&gt;Tracer&lt;/code&gt; est compris dans un &lt;code&gt;Layer&lt;/code&gt; OpenTelemetry qui sert de couche de compatibilité au reste de la télémétrie.&lt;/li&gt;
&lt;li&gt;Ce &lt;code&gt;Layer&lt;/code&gt; est enregistré dans un &lt;code&gt;Registry&lt;/code&gt; qui écoute les spans de notre éxécution de code.&lt;/li&gt;
&lt;li&gt;Les &lt;code&gt;Spans&lt;/code&gt; sont des intervalles de temps dans l’éxécution de notre code.&lt;/li&gt;
&lt;li&gt;Les &lt;code&gt;Spans&lt;/code&gt; peuvent avoir des &lt;code&gt;Events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les &lt;code&gt;Events&lt;/code&gt; sont des points datés dans l’éxécution d’une &lt;code&gt;Span&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;Event&lt;/code&gt; peut avoir des &lt;code&gt;Tags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les &lt;code&gt;Tags&lt;/code&gt; sont des clefs-valeurs qui sont indexés et donc qui peuvent être recherchés au sein d’une plateforme d’analyse de télémétrie.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Avec ça, nous avons tout le vocabulaire nécessaire! 😀&lt;/p&gt;
&lt;p&gt;Le code de cette partie:&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Display&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;debug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; span&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Level&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    impl&lt;/span&gt;&lt;span&gt; Display&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            write!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;f&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Je suis une requête&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        request_display&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; %&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        request_debug&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Nous allons attendre 2 secondes...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin du délai d&amp;#39;attente de 2 secondes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la span child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Nous allons attendre 2 secondes...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin du délai d&amp;#39;attente de 2 secondes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la span child&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    child&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la span parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    parent&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;instrumentation-des-fonctions&quot;&gt;Instrumentation des fonctions&lt;/h3&gt;
&lt;p&gt;Pour le moment notre système fonctionne bien dans notre méthode &lt;code&gt;main&lt;/code&gt;, mais comme tout programme un peu conséquent il faudra invariablement le modulariser.&lt;/p&gt;
&lt;p&gt;Et donc le découper en fonction.&lt;/p&gt;
&lt;p&gt;Nous allons en écrire deux et réutiliser notre structure &lt;code&gt;Request&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons maintenant rajouter des spans, des events et des tags à nos fonctions.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; trace_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;handle_request&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request authenticated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        error!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request forbidden&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; trace_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Emulate call for db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et dans notre &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Level&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;TRACE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;entered&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sur jaeger, cela nous donne ceci:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync10.png&quot; alt=&quot;gérer plusieurs appels de fonctions&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;On y voit une span différente pour chaque appel à &lt;code&gt;handle_request&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En ouvrant les détails nous pouvons voir le &lt;code&gt;token&lt;/code&gt; en cause.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync11.png&quot; alt=&quot;détails d’un Tag&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;Maintenant nous allons simplifier l’écriture en utilisant un attribut de fonction.&lt;/p&gt;
&lt;p&gt;Cet attribut est &lt;code&gt;#[tracing::instrument]&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request authenticated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        error!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request forbidden&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Emulate call for db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Permet de redéfinir le nom de la span; par défaut il s’agit du nom de la fonction décorée.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il devient alors facile d’outiller les fonctions et d’en rajouter un peu partout.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/sync12.png&quot; alt=&quot;tag ajouté automatiquement par l’attribut instrument&quot; /&gt;&lt;/p&gt;
&lt;p&gt;En bonus, on gagne également le tag &lt;code&gt;request&lt;/code&gt; qui provient des paramètres de notre appel à &lt;code&gt;handle_request&lt;/code&gt;. Et ce, gratuitement.&lt;/p&gt;
&lt;p&gt;Code de la partie.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; span&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; trace_span&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Level&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request authenticated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        error!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request forbidden&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Emulate call for db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id=&quot;l-asynchrone&quot;&gt;L’asynchrone&lt;/h2&gt;
&lt;p&gt;Nous allons rendre asynchrone et parallélisé le code du dessus.&lt;/p&gt;
&lt;p&gt;Avant tout installons &lt;code&gt;tokio&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-features&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; macros&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-features&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; rt&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-features&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; rt-multi-thread&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne dans le Cargo.toml&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tokio&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.20.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;macros&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;rt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;rt-multi-thread&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis, il faut que l’on fasse évoluer notre méthode &lt;code&gt;handling_requests&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Elle devient asynchrone&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; corps de la méthode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis nous allons modifier notre fonction &lt;code&gt;handle_requests&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;t1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour que l’asynchrone fonctionne il lui faut un reactor, ici ce sera tokio.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Étant donné que handling_requests est désormais asynchrone, il faut la poll pour qu’elle fasse quelque chose.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le code complet&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Span&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Je décale l&amp;#39;exécution de 100 ms pour un rendu plus visuel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;t1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request authenticated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        error!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request forbidden&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Emulate call for db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Si l’on éxécute le code tel quel nous allons observer que nos spans sont découpés en 3.&lt;/p&gt;
&lt;p&gt;En effet, les différentes fonctions évoluant dans des threads différents les contextes et donc les root spans sont aussi différents.&lt;/p&gt;
&lt;p&gt;Ce qui nous donne le résultat suivant:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/async3.png&quot; alt=&quot;les spans sont coupés en trois car 3 threads&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pour réconciller ces threads nous allons devoir opérer quelques changements.&lt;/p&gt;
&lt;p&gt;La crate tracing nous permet de facilement attacher une span à un thread et plus particulèrement à la futur éxécutée.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; future&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cet appel à &lt;code&gt;instrument&lt;/code&gt; va venir accrocher la span “ma span” à l’éxécution de la futur ainsi sera repésenté par “ma span” dans Jaeger.&lt;/p&gt;
&lt;p&gt;Faites le test. 😛&lt;/p&gt;
&lt;p&gt;On peut donc en extrapole quelque chose comme:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;handle request success&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;handle request fail&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;t1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne le résultat suivant sur Jaeger&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/async4.png&quot; alt=&quot;les spans des threads sont regroupées et wrappées&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et si l’on désire ne avoir de wrapping on peut également écrire ceci:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Span::current()&lt;/code&gt; permet de récupérer la span du thread parent.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/async5.png&quot; alt=&quot;les spans des threads sont regroupées sans wrapping&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et voilà nous sommes en mesure de pouvoir comprendre d’un coup d’oeil ce qu’il se passe temporellement lors de l’éxécution en parallèle de plusieurs threads.&lt;/p&gt;
&lt;p&gt;Le code final&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Instrument&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Span&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;lab-telemetry&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_requests&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 43&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        method&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        token&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;bleubleu&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;current&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;t1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; t2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; handle_request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request authenticated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        error!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Request forbidden&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; auth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Emulate call for db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    request&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;token &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;blabla&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id=&quot;problemes-pouvant-etre-rencontres&quot;&gt;Problèmes pouvant être rencontrés&lt;/h2&gt;
&lt;h3 id=&quot;la-span-n-est-jamais-envoyee&quot;&gt;La span n’est jamais envoyée.&lt;/h3&gt;
&lt;p&gt;Parfois nous trouvons dans des situations où une span devrait apparaître mais ne le fait jamais.&lt;/p&gt;
&lt;p&gt;Pour comprendre cette situation, prenons le code suivant:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_threads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    for_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    infinite_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; infinite_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; for_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si l’on éxécute celui-ci nous allons avoir le résultat suivant:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful1.png&quot; alt=&quot;seul la span for-loop est envoyée&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Contenant les différents events des itérations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful2.png&quot; alt=&quot;détails de la span for_loop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Par contre, aucune trace de la span &lt;code&gt;infinite_loop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une span étant bornée temporellement, si celle-ci ne finit jamais, elle ne sera jamais envoyé au &lt;code&gt;Tracer&lt;/code&gt; et par conséquent les &lt;code&gt;Events&lt;/code&gt; qui y sont rattachés non plus.&lt;/p&gt;
&lt;p&gt;Pour nous permettre de visualiser le comportement de notre fonctions &lt;code&gt;infinite_loop&lt;/code&gt;. Nous allons devoir créer une span qui est bornée dans le temps et donc transmissible au &lt;code&gt;Tracer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et finalement affichable dans Jaeger.&lt;/p&gt;
&lt;p&gt;Pour ce faire nous allon utiliser une méthode qui se nomme &lt;code&gt;in_scope&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Dans ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tous les évènements qui sont déclenchés dans &lt;code&gt;in_scope&lt;/code&gt; seront rattachés à &lt;code&gt;ma span&lt;/code&gt; et envoyés sur Jaeger comme tel.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Remarque&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le code&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Dans ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Est équivalent à&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _enter&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; span&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;enter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Dans ma span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;drop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;span&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-caution&quot;&gt;
	&lt;p&gt;Si &lt;code&gt;drop(span)&lt;/code&gt; n’est pas appelé et que vous vous trouvez dans une boucle infinie.&lt;/p&gt;
&lt;p&gt;Votre span &lt;code&gt;ma span&lt;/code&gt; ne sera jamais envoyée!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nous pouvons réécrire notre fonction &lt;code&gt;infinite_loop&lt;/code&gt; ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; infinite_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;flag&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sur Jaeger nous avons désormais une span &lt;code&gt;infinite_loop&lt;/code&gt;! 😎&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful4.png&quot; alt=&quot;détails de la span infinite_loop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Et en ouvrant son détails on peut voir que toutes les spans ayant le même nom sont regroupés sous la forme d’un
bel escalier de spans.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful3.png&quot; alt=&quot;détails de la span infinite_loop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous avons notre &lt;code&gt;flag=start&lt;/code&gt; tout en haut et les &lt;code&gt;iteration=N&lt;/code&gt; ensuite.&lt;/p&gt;
&lt;p&gt;D’ailleurs nous pouvons créer le même genre de retour pour notre &lt;code&gt;for_loop&lt;/code&gt;, cela permettra de visualiser le temps pris par chaque itération.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; for_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;for_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette fois-ci sur Jaeger notre span &lt;code&gt;for_loop&lt;/code&gt; devient:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful5.png&quot; alt=&quot;détails de la span for_loop après utilisation de in_scope&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On peut y voir les temps passés dans les &lt;code&gt;in_scope&lt;/code&gt; de chaque itération.&lt;/p&gt;
&lt;p&gt;Et si l’on ouvre les détails cela nous donne:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful6.png&quot; alt=&quot;détails des sous spans de for_loop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous avons bien nos events de début et de chaque itération.&lt;/p&gt;
&lt;p&gt;Nous avons en prime l’event de fin car cette span est finie.&lt;/p&gt;
&lt;p&gt;Nous pouvons également le réaliser en asynchrone.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; spawn&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info_span&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_threads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;for_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;infinite_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; _&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fut1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; fut2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Force all Span to be sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; infinite_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;flag&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    loop&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;infinite_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        i&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; +=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; for_loop&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Début de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;for_loop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;iteration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Itération&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Fin de la boucle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Et obtenir le même résultat dans Jaeger.&lt;/p&gt;
&lt;h3 id=&quot;mon-jaeger-crash&quot;&gt;Mon Jaeger crash !&lt;/h3&gt;
&lt;p&gt;Dans certaines condition il se peut que votre Jeager crash, et qu’avant il prenne un
nombre exponentiel de mémoire.&lt;/p&gt;
&lt;p&gt;Ce cas, je l’ai observé lorsqu’un trop grand nombre de span sont envoyées en très peu de
temps.&lt;/p&gt;
&lt;p&gt;Vous risquez de vous retrouver avec ce genre de message d’erreur:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful7.png&quot; alt=&quot;jaeger qui a crash&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On peut aisément reproduire ce comportement grâce à ce code&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Déclaration du tracing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;will crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1000000&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;I was here &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Celui-ci va engorger le système et finir par faire crasher le système de télémétrie.&lt;/p&gt;
&lt;p&gt;Heureusement il est possible de régler ce soucis en configurant la manière dont les spans
sont traitées.&lt;/p&gt;
&lt;p&gt;En effet, il est possible d’affecter un niveau de log à nos spans.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;level &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;I was here &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Par contre en l’état le système ne filtrera rien, il faut rajouter un filtre qui aura pour effet de venir conditionner le traitement ou non de notre span.&lt;/p&gt;
&lt;p&gt;Pour en bénéficier, il faut activer une feature&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; tracing-subscriber&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-features&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; env-filter&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou via le Cargo.toml&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing-subscriber&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.3.14&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;env-filter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EnvFilter&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_default_env&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La 3ème ligne, indique d’utiliser la variable d’environnement standard &lt;code&gt;RUST_LOG&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce qui signifie que l’on peut venir piloter les spans au travers d’elle.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;RUST_LOG&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour les besoin du test et pour des raisons de visibilité, nous allons réduire le nombre d’itérations à 10.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Déclaration du tracing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;won&amp;#39;t crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Avec ce réglage vous allez voir dans Jaeger ceci:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful8.png&quot; alt=&quot;aucune span de la méthode dummy n’est envoyé&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aucune span ne sera produite.&lt;/p&gt;
&lt;p&gt;Par contre en éxécutant&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;RUST_LOG&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous verrez&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/careful9.png&quot; alt=&quot;les spans de la méthode dummy sont envoyées&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nous pouvons donc régler le degré de finesse de nos spans en fonction de nos besoins.&lt;/p&gt;
&lt;p&gt;Que ce soit de la télémétrie de production ou de développement et donc du debug.&lt;/p&gt;
&lt;p&gt;Récapitulatif de code:&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; futures&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;future&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;join_all&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; futures&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Stream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; StreamExt&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;runtime&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Tokio&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;debug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; info_span&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;EnvFilter&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;SubscriberInitExt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tokio&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;too much spans&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_batch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Tokio&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_threads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EnvFilter&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_default_env&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    info_span!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;won&amp;#39;t crash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;in_scope&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;            dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    shutdown_tracer_provider&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;level &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; dummy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    debug!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;I was here &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id=&quot;un-petit-exemple-concret&quot;&gt;Un petit exemple concret&lt;/h2&gt;
&lt;p&gt;Nous allons réaliser un exemple qui va récapituler les différents concepts et les mettre en action dans un cas concret.&lt;/p&gt;
&lt;p&gt;Le système que je vous propose sera un serveur web qui ira chercher des données sur un serveur distant. Et qui mettra en cache dans une base de données sqlite ces réponses de requêtes avant de servir le client.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/exemple1.png&quot; alt=&quot;schéma général de l’application d’exemple&quot; /&gt;&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
	&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ici le but n’est pas de créer quelque chose qui doit aller en prod, les décisions d’architectures peuvent être
qualifier au mieux de discutables. 😅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour cela nous allons avoir besoin d’un serveur distant, nous allons utiliser la plateforme &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;JSON placeholder&lt;/a&gt; qui est conçu pour cet usage.&lt;/p&gt;
&lt;p&gt;Et plus particulièrement son service &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://jsonplaceholder.typicode.com/users/&quot;&gt;&lt;code&gt;users&lt;/code&gt;&lt;/a&gt;. Qui permet de générer des données utilisateurs.&lt;/p&gt;
&lt;p&gt;Si l’on interroge ainsi &lt;code&gt;https://jsonplaceholder.typicode.com/users/1&lt;/code&gt;. Nous obtenons un utilisateur en particulier.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Leanne Graham&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Bret&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Sincere@april.biz&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;street&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Kulas Light&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;suite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Apt. 556&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Gwenborough&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;zipcode&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;92998-3874&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;geo&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;lat&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;-37.3159&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;lng&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;81.1496&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;phone&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1-770-736-8031 x56442&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;website&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;hildegard.org&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Romaguera-Crona&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;catchPhrase&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Multi-layered client-server neural-net&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;harness real-time e-markets&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class=&quot;markdown-alert-caution&quot;&gt;
	&lt;p&gt;Mais attention au retour de cette API, en effet tout id utilisateur supérieur à 10 renvoit un json vide mais un code de retout HTTP &lt;strong&gt;200&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afin de pouvoir manipuler ce JSON nous allons utiliser la lib &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.rs/serde_json/latest/serde_json/&quot;&gt;&lt;code&gt;serde_json&lt;/code&gt;&lt;/a&gt; qui nous impose de créer une structure pour accueillir les données.&lt;/p&gt;
&lt;p&gt;On l’installe&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; serde&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-features&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; derive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; serde&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; serde_json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Serialize&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    email&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    phone&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    website&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite pour des raisons de rapidité de mise en oeuvre, je vais utiliser un serveur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://actix.rs/&quot;&gt;actix-web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On l’installe&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; actix-web&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici le main&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;actix_web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; App&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;get_user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;127.0.0.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 8080&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il déclare un serveur en écoute locale sur le port &lt;strong&gt;8080&lt;/strong&gt;, et possède un service &lt;code&gt;get_user&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Que nous allons déclarer dès maintenant.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/user/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; get_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;into_inner&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;BadRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;User id can&amp;#39;t exceed 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;hit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;NotFound&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;           &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 404&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette méthode renvoit une &lt;em&gt;BadRequest&lt;/em&gt; si l’id est supérieur à 10. Dans le cas contraire il utilise le cache pour récupérer l’utilisateur associer à l’id demandé.&lt;/p&gt;
&lt;p&gt;Puis formate la réponse en erreur ou non, sous forme de JSON.&lt;/p&gt;
&lt;p&gt;Parlons en du cache.&lt;/p&gt;
&lt;p&gt;Celui-ci est constitué d’une base de données sqlite en local.&lt;/p&gt;
&lt;p&gt;À chaque requête on vient ouvrir cette BDD et effectuer une opération de &lt;code&gt;SELECT&lt;/code&gt; sur l’ID en question.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;db.sqlite&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;CREATE TABLE IF NOT EXISTS users (id INTEGER , value TEXT )&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;INSERT INTO users VALUES(?, ?)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;as&lt;/span&gt;&lt;span&gt; i64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;next&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; hit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;SELECT * FROM users WHERE id = ?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; key&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; as&lt;/span&gt;&lt;span&gt; i64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;next&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            State&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Row&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user_string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            State&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Done&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Lors de l’opération de &lt;em&gt;hit&lt;/em&gt; du cache, si celui-ci échoue car la valeur n’est pas encore disponible dans le cache. Celui-ci viens appeler une méthode &lt;code&gt;fetch_user&lt;/code&gt; qui réalise l’appel sur le réseau.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://jsonplaceholder.typicode.com/users/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme nous utilisons un ensemble de crates différentes leurs erreurs ne vont pas être compatibles. Pour éviter ce souci, nous créons une énumération pour unifier les erreurs.&lt;/p&gt;
&lt;p&gt;Nous utilisons aussi la crate &lt;code&gt;thiserror&lt;/code&gt; qui permet de facilement créer les méthode de display de chacune des erreurs.&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;sqlite errors &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;reqwest errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;json errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;type&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Un petit récap:&lt;/p&gt;
&lt;details &gt;
	&lt;summary&gt;&lt;span&gt;Code Rust&lt;/span&gt;&lt;/summary&gt;
	&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; App&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; HttpServer&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Serialize&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; State&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;use&lt;/span&gt;&lt;span&gt; thiserror&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Debug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;enum&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;sqlite errors &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0:?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;reqwest errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;json errors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;    Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Sqlite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; From&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CustomError&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;Reqwest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;type&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; CustomError&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;derive&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Serialize&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    name&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    email&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    phone&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    website&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;struct&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; sqlite&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;db.sqlite&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;CREATE TABLE IF NOT EXISTS users (id INTEGER , value TEXT )&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;INSERT INTO users VALUES(?, ?)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;as&lt;/span&gt;&lt;span&gt; i64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;next&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; hit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; mut&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;SELECT * FROM users WHERE id = ?&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; key&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; as&lt;/span&gt;&lt;span&gt; i64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;next&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            State&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Row&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; statement&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user_string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            State&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Done&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;                let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;                Self&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://jsonplaceholder.typicode.com/users/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; serde_json&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;response_string&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;as_str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/user/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; get_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;into_inner&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;        return&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;BadRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;User id can&amp;#39;t exceed 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;hit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    match&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; user&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;NotFound&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;json!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;           &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 404&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;actix_web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; or #[tokio::main]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span&gt; App&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;get_user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;127.0.0.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; 8080&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;run&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;await&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;Ainsi que les dépendances nécessaire&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;actix-web&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;4.1.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;reqwest&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.11.11&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.140&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;derive&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;serde_json&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.82&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mime&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.3.16&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;sqlite&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.26.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;thiserror&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1.0.31&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bien! Si vous exécuter ce code vous devriez voir apparaître  en vous rendant sur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://localhost:8080/user/2&quot;&gt;localhost:8080&lt;/a&gt;
un json avec le user id 2.&lt;/p&gt;
&lt;p&gt;Puis en réexécutant cette même requête une réponse sensiblement plus rapide.&lt;/p&gt;
&lt;p&gt;Mais plus rapide de combien au juste ? 🧐&lt;/p&gt;
&lt;p&gt;La télémétrie va nous venir en aide.&lt;/p&gt;
&lt;p&gt;Nous allons outiller nos fonctions !&lt;/p&gt;
&lt;p&gt;D’abord le cache&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Cache&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;skip&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fields&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;=&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; hit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis les autres méthodes&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; reqwest&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/user/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; get_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;u32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et on finit par initialiser le tracing comme il se doit.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;actix_web&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; or #[tokio::main]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;tracing&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;instrument&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt; fn&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a Jaeger Tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; tracer_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; opentelemetry_jaeger&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;new_pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_service_name&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;cache user&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;install_simple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Create a tracing layer with the configured tracer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; opentelemetry_layer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt; =&lt;/span&gt;&lt;span&gt; tracing_opentelemetry&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_tracer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracer_jaeger&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with_threads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; Register Layers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tracing_subscriber&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;registry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EnvFilter&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;from_default_env&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;with&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry_layer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;        .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et de rajouter les dépendances nécessaires.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.17.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;opentelemetry-jaeger&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.16.0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.1.35&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing-opentelemetry&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.17.4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;tracing-subscriber&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.3.14&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; features&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;env-filter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si l’on reproduit cette expérience&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Si vous éxécuter ce code vous devriez en vous rendant sur [localhost:8080](https://localhost:8080/user/2) voir apparaître &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;un json avec le user id 2.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Puis en réexécutant cette même requête une réponse sensiblement plus rapide.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En ayant pris soin de supprimer la base de données sqlite.&lt;/p&gt;
&lt;p&gt;Vous devriez avoir les spans suivantes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/exemple2.png&quot; alt=&quot;spans de l’exemple&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On observe un facteur x100 entre la requête du dessous et celle du dessus.&lt;/p&gt;
&lt;p&gt;Bien évidemment, celle du dessus est la requête avec cache et celle du dessous sans cache.&lt;/p&gt;
&lt;p&gt;Voyons ces spans en détails.&lt;/p&gt;
&lt;p&gt;Tout d’abord sans le cache.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/exemple3.png&quot; alt=&quot;span sans cache&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On voit bien l’ordonnencement des actions&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
  

flowchart LR
get_user--&gt;Cache::hit--&gt;fetch--&gt;Cache::set


&lt;/pre&gt;
&lt;p&gt;On peut d’ailleurs détailler l’exécution grâce aux tags de nos spans.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/exemple4.png&quot; alt=&quot;détail de la span sans cache&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On voit bien l’ID 2 être baladé dans les différents appels de fonctions.&lt;/p&gt;
&lt;p&gt;Et maintenant si on réitère l’opération avec le cache déjà rempli.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/telemetry/exemple5.png&quot; alt=&quot;span avec cache&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On a beacoup moins de spans dont une absence de &lt;code&gt;fetch_user&lt;/code&gt;, donc pas d’appel réseau donc pas 100 ms dans la vue en allant rechercher l’info sur le web !!&lt;/p&gt;
&lt;p&gt;Notre appel se résume à un simple:&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
  

flowchart LR
get_user--&gt;Cache::hit


&lt;/pre&gt;
&lt;p&gt;Pour ceux qui en ont besoin je vous met le code &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/blog_example1/telemetry&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;J’espère que cette très légère introduction à la télémétrie vous aura plu.&lt;/p&gt;
&lt;p&gt;En écrivant cet article, je n’ai pu que constater le gouffre insondable de mon ignorance et le chemin qui me reste à parcourir pour commencer à maîtriser le sujet.&lt;/p&gt;
&lt;p&gt;Voyez cet article comme une sorte d’état de l’art de mes connaissances à l’instant présent.&lt;/p&gt;
&lt;p&gt;Je vous remercie de votre lecture et vous donne rendez-vous pour autre chose dans un autre article. ❤️&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="fr">
        <title>Centraliser et normaliser ses logs avec Vector</title>
        <published>2021-09-14T00:00:00+00:00</published>
        <updated>2021-09-14T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://staging.lafor.ge/vector/"/>
        <id>https://staging.lafor.ge/vector/</id>
        
        <content type="html" xml:base="https://staging.lafor.ge/vector/">&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;../assets/images/vector/letters.gif&quot; alt=&quot;&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Bonjour! 😀&lt;/p&gt;
&lt;p&gt;Mon nombre de VMs a explosé au cours de ces derniers mois. Je ne m’en plains pas, mais il devient de plus en plus fastidieux d’aller consulter mes logs.&lt;/p&gt;
&lt;p&gt;Un autre de mes problèmes est que mon infra est constituée de programmes écrits dans différents langages qui ont chacun leur manière de rédiger leurs logs.&lt;/p&gt;
&lt;p&gt;Une autre complication est l’utisation de Docker et Kubernetes qui enrobe les processus et rajoute une couche de complexité dans la compréhension du run des applications.&lt;/p&gt;
&lt;p&gt;J’avais tout d’abord commencé à regarder le produit “Syslog” qui a fait ces preuves. Mais celui-ci ne convenait pas à mes besoins car les messages générés contenanaient trop d’informations parasites, ne permettant pas leur exploitation directe.&lt;/p&gt;
&lt;p&gt;C’est alors que durant un de mes lives sur &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://twitch.tv/akanoa&quot;&gt;twitch&lt;/a&gt; l’un de mes spectateurs m’a indiqué l’existence d’un produit nommé &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/&quot;&gt;Vector&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Vector est un binaire qui peut-être installé de diverses &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/setup/installation/&quot;&gt;manières&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je vais utiliser la méthode de l’installation par package.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;1sLf&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;  &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;https://repositories.timber.io/public/vector/cfg/setup/bash.deb.sh&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;apt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; vector&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;principes-de-fonctionnement&quot;&gt;Principes de fonctionnement&lt;/h2&gt;
&lt;p&gt;Vector possède une architecture fonctionnelle plutôt directe.&lt;/p&gt;
&lt;p&gt;Il peut prendre une ou plusieurs de sources de données, réaliser une suite de transformations sur ces évènements puis les distribuer vers une ou plusieurs sorties.&lt;/p&gt;
&lt;p&gt;L’ensemble de ce processus est appelé un pipeline.&lt;/p&gt;
&lt;p&gt;Il est décrit dans un fichier de configuration utilisant le langage de description &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://toml.io/en/&quot;&gt;&lt;code&gt;TOML&lt;/code&gt;&lt;/a&gt;. On peut le faire en YAML et en JSON mais ne parlons pas des sujets qui fâchent. 😁&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;p&gt;Les entrées du pipeline sont appelées des &lt;code&gt;sources&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vector vous proposent un vaste &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sources/&quot;&gt;choix de sources&lt;/a&gt; qui vont des plus haut-niveau comme directement se connecter à l’API Docker pour récupérer les logs des containers à des choses bien plus bas-niveau comme la lecture de socket ou de fichiers.&lt;/p&gt;
&lt;p&gt;Une source est défini ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma_source&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;type de la source&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous pouvez définir autant de sources que vous le désirez.&lt;/p&gt;
&lt;p&gt;L’identifiant &lt;code&gt;ma_source&lt;/code&gt; est le nom de votre entrée et permettra de l’identifier au sein du pipeline.&lt;/p&gt;
&lt;p&gt;Une source a pour sortie un évènement sous la forme d’un message au format JSON. Chaque source possède sa structure de sortie qui est documentée pour chacune d’elle.&lt;/p&gt;
&lt;h3 id=&quot;transformations&quot;&gt;Transformations&lt;/h3&gt;
&lt;p&gt;Chaque source peut bénéficier d’une ou plusieurs transformations. Les transformations sont des opérations qui sont réalisées sur les évènements provenant des sources.&lt;/p&gt;
&lt;p&gt;Une transformation peut prendre une ou plusieurs sources.&lt;/p&gt;
&lt;p&gt;De même que pour les sources, Vector propose là aussi des &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/transforms/&quot;&gt;transformations&lt;/a&gt; déjà existantes.&lt;/p&gt;
&lt;p&gt;Une transformation se décrit sous cette forme.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma_transformation&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;type de la transformation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_source_1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_source_2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le champ &lt;code&gt;inputs&lt;/code&gt; est la collection de flux d’entrées définis par un ou plusieurs identifiants.&lt;/p&gt;
&lt;p&gt;Il est aussi possible de chaîner les transformations pour rafiner les traitements.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma_transformation&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;type de la transformation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_source_1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_source_2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma_transformation_2&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;type de la transformation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_transformation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;remap&quot;&gt;Remap&lt;/h4&gt;
&lt;p&gt;Dans les transformations, il en existe une qui est plus spéciale que les autres. Il s’agit de la transformation &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/transforms/remap/&quot;&gt;&lt;code&gt;remap&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Celle ci a un format un peu différent qui prend un paramètre &lt;code&gt;source&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans celui ci, il est possible de définir des transformations personnalisées au moyen d’un langage de manipulation de données appelé le &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/vrl/&quot;&gt;&lt;code&gt;VRL&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce langage est ensuite converti en du Rust, permettant de bénéficier de toutes les garanties concernant le typage des données manipulé ainsi que la faillibilité des appels de fonctions et de routines de traitement.&lt;/p&gt;
&lt;p&gt;Le langage est complet et propose tous les outils nécessaire comme l’affectatation de variable, la notion de condition, ainsi que de contextes et de blocs.&lt;/p&gt;
&lt;h3 id=&quot;sinks&quot;&gt;Sinks&lt;/h3&gt;
&lt;p&gt;Dans la terminologie de Vector les sorties de pipelines sont appelés des &lt;code&gt;sinks&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De même une &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sinks/&quot;&gt;sélection de sinks&lt;/a&gt; pré-construits existe.&lt;/p&gt;
&lt;p&gt;Un sink prend une collection de flux d’événements et les délivre à sa destination.&lt;/p&gt;
&lt;p&gt;Votre pipeline peut posséder autant de sinks que vous désirez et chaque sinks prend autant d’entrées que voulu.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma_sortie&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;type de ma sortie&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_source&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ma_transformation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;cas-pratique&quot;&gt;Cas pratique&lt;/h2&gt;
&lt;h3 id=&quot;cahier-des-charges&quot;&gt;Cahier des charges&lt;/h3&gt;
&lt;p&gt;Mon cas d’utilisation est le suivant. Je possède une série de VMs qui tournent à l’intérieur d’un réseau.&lt;/p&gt;
&lt;p&gt;Chacune de ces VMs possède une stack Docker décrite par un docker-compose.&lt;/p&gt;
&lt;p&gt;Le but est de centraliser les logs de toutes ces VMs, en les regroupant par container et par jours.&lt;/p&gt;
&lt;p&gt;Par exemple si nous avons 2 machines appelées respectivement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker-001&lt;/li&gt;
&lt;li&gt;docker-002&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et possédant chacune le docker-compose suivant:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ervices&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;omcat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;omcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;etty&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;etty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ustom-js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alors l’aborescence de logs finaux devra ressembler à :&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── by-host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ├── docker-001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │   └── docker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       ├── json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   ├── tomcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   ├── jetty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │   └── js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │       ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       │       └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │       └── text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           ├── tomcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           ├── jetty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │           └── js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │               ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    │               └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    └── docker-002&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        └── docker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ├── json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   ├── tomcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   ├── jetty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │   └── js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │       ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            │       └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            └── text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                ├── tomcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                ├── jetty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                │   ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                │   └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                └── js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    ├── 13-09-2021.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    └── 14-09-2021.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notre but va être de construire une topologie de centralisation et de normalisation de logs qui réponde à ce besoin.&lt;/p&gt;
&lt;p&gt;Nous utiliseront bien évidemment Vector pour la plupart des opérations.&lt;/p&gt;
&lt;h4 id=&quot;descriptif-des-contraintes&quot;&gt;Descriptif des contraintes&lt;/h4&gt;
&lt;p&gt;Tomcat et Jetty sont des serveurs HTTP écrits tous les deux en Java mais ne génèrent pas leur logs sous le même format.&lt;/p&gt;
&lt;p&gt;Une ligne de log Tomcat ressemblera à :&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;14-Sep-2021 06:48:31.489 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [102] milliseconds&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alors que Jetty renverra plutôt des messages de logs ainsi:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2021-09-14 06:48:34.560:INFO:oejs.AbstractConnector:main: Started ServerConnector@11245489{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous avons aussi dans notre stack une application NodeJs qui possède de même, sa propre façon de créer ses logs.&lt;/p&gt;
&lt;p&gt;Vous pouvez retrouvez dans ce &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/Akanoa/vector-pipelines/-/blob/main/docker/services/js/files/app.js&quot;&gt;projet&lt;/a&gt; les sources de l’image NodeJS.&lt;/p&gt;
&lt;p&gt;Cette image écrira ses logs sous cette forme:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2021-09-14T06:52:52.480Z [main] info: Application started&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme vous pouvez le voir chacun de ces logs signifie que l’application a démarré mais aucune de ces lignes n’est identique d’un container à un autre, ce qui complexifie grandement le traitement des logs de notre stack Docker.&lt;/p&gt;
&lt;p&gt;Nous allons devoir normaliser tout ça! 😀&lt;/p&gt;
&lt;p&gt;Une autre contrainte est que les stacks Docker sont séparées les unes des autres dans des VMs pour des raisons de sécurité et scalabilité.&lt;/p&gt;
&lt;p&gt;Il va donc falloir rappatrier ces logs normalisés au niveau d’un point unique qui se chargera de leur aggrégation.&lt;/p&gt;
&lt;h3 id=&quot;topologie&quot;&gt;Topologie&lt;/h3&gt;
&lt;p&gt;Une des règles que nous allons essayer de nous astreindre est de ne pas générer inutilement de &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://fr.wikipedia.org/wiki/Point_de_d%C3%A9faillance_unique#:~:text=Un%20point%20de%20d%C3%A9faillance%20unique,l&amp;#x27;arr%C3%AAt%20complet%20du%20syst%C3%A8me.&quot;&gt;SPOF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ceci signifie que la stack Docker doit-être à même de fonctionner lorsque le pipeline de logs est defectueux.&lt;/p&gt;
&lt;p&gt;Donc avant d’être poussé vers l’aggrégateur, les logs normalisés seront conservés sur les VMs et régulièrement effacés par un logrotate.&lt;/p&gt;
&lt;h3 id=&quot;recuperer-les-logs-de-ses-containers&quot;&gt;Récupérer les logs de ses containers&lt;/h3&gt;
&lt;p&gt;La première difficulté à laquelle nous allons être confronté, est de pouvoir récupérer les logs qui sont générés par les applications encapsulées dans les containers.&lt;/p&gt;
&lt;p&gt;Vector possède une &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sources/docker_logs/&quot;&gt;source Docker&lt;/a&gt; mais de l’aveu même de la documentation, il est fortement déconseillé de l’utiliser.&lt;/p&gt;
&lt;p&gt;Nous allons donc devoir trouver une manière détournée de récupérer ces logs.&lt;/p&gt;
&lt;p&gt;Heureusement, Docker nous fourni &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.docker.com/config/containers/logging/&quot;&gt;une série&lt;/a&gt; de manières de réaliser cette extraction.&lt;/p&gt;
&lt;p&gt;Notre cahier des charges nous impose plusieurs contraintes. Il ne faut pas qu’un défaut dans le système de pipeline de logs n’interdise le fonctionnement de la stack Docker.&lt;/p&gt;
&lt;p&gt;Cette difficulté exclut d’emblée tous les systèmes d’envoie de logs par protocole réseau. En effet si le pipeline décède ou est innacessible, les containers ne démarreront pas.&lt;/p&gt;
&lt;p&gt;Les éliminés sont donc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;syslog en réseau&lt;/li&gt;
&lt;li&gt;fluentd&lt;/li&gt;
&lt;li&gt;splunk en réseau&lt;/li&gt;
&lt;li&gt;graylog&lt;/li&gt;
&lt;li&gt;logentries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/vector/koh-lanta.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On peut aussi sortir les drivers spécifiques au GAFAM: AWS et GCP.&lt;/p&gt;
&lt;p&gt;ETW étant pour windows, il ne nous aidera pas non plus sur le coup.&lt;/p&gt;
&lt;p&gt;Il nous reste les stockages de logs locaux:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;local&lt;/li&gt;
&lt;li&gt;json-file&lt;/li&gt;
&lt;li&gt;journald&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Local est trop simple et ne permet pas de gérer les métadata. Et le stockage JSON ne permet pas une recherche efficace en local.&lt;/p&gt;
&lt;p&gt;Nous allons donc nous tourner vers un stockage de logs en utilisant journald.&lt;/p&gt;
&lt;p&gt;Pour plus d’informations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://guillaume.fenollar.fr/blog/journald-tutoriel-journald-journalctl&quot;&gt;https://guillaume.fenollar.fr/blog/journald-tutoriel-journald-journalctl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://www.freedesktop.org/software/systemd/man/journalctl.html&quot;&gt;https://www.freedesktop.org/software/systemd/man/journalctl.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme expliqué dans ces ressources, la grande force de journald est de permettre le stockage des méta-données des messages à des fins de filtrages.&lt;/p&gt;
&lt;p&gt;Examinons tout d’abord ce que nous fourni le &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://docs.docker.com/config/containers/logging/journald/&quot;&gt;driver&lt;/a&gt; de logging journald de Docker.&lt;/p&gt;
&lt;p&gt;En plus du message, nous avons accès à plusieurs meta-data, dont:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CONTAINER_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SYSLOG_IDENTIFIER&lt;/code&gt; ou &lt;code&gt;CONTAINER_TAG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IMAGE_NAME&lt;/code&gt; non documenté mais présent dans mes expérimentations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ceci constituera nos logs brutes.&lt;/p&gt;
&lt;p&gt;En plus de ces méta-data propres au driver docker. Il existe une série de méta-datas constitutive du protocole journald dont la liste exhaustive est définie dans l’&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sources/journald/#examples&quot;&gt;exemple suivant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ceux qui vont particulièrement nous intéresser sont:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;host&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;__REALTIME_TIMESTAMP&lt;/code&gt;, le timestamp en microsecondes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configurons nos container pour envoyer leur logs vers journald.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ersion&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;3.7&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ervices&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;omcat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;omcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ogging&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;river&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ournald&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;etty&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;etty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ogging&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;river&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ournald&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;  j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;mage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ustom-js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ogging&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;river&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ournald&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;      o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ptions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;        t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;ag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous rajoutons un &lt;code&gt;tag&lt;/code&gt; qui nous permettra de traiter les messages plus facilement. Cette valeur sera définie dans la méta-donnée &lt;code&gt;SYSLOG_IDENTIFIER&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nous pouvons maintenant commencer la création de notre pipeline 😁&lt;/p&gt;
&lt;p&gt;Pour cela crée un fichier &lt;code&gt;docker_logs_pipeline_normalization.toml&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;journald_docker_unit&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journald&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;include_units&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;data_dir&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;${PWD}/data&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;journald_docker_unit&lt;/code&gt; sera l’identifiant de notre source. Puis on définit cette source comme étant du type &lt;code&gt;journald&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On filtre par seulement l’unit &lt;code&gt;docker&lt;/code&gt; et on défini un dossier qui contiendra le &lt;em&gt;checkpoint&lt;/em&gt; de lecture du journal.&lt;/p&gt;
&lt;p&gt;Ceci permet de ne pas retraiter plusieurs fois les même logs.&lt;/p&gt;
&lt;h3 id=&quot;normaliser-les-evenements&quot;&gt;Normaliser les évènements&lt;/h3&gt;
&lt;p&gt;Nous allons normaliser cet évènement pour le rendre moins spécifique à docker. Ceci nous permettra dans l’avenir de plus facilement gérer d’autres sources.&lt;/p&gt;
&lt;p&gt;Pour cela nous allons utiliser notre première transformation.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;normalized_journald_docker_events&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journald_docker_unit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;service_identifier = .IMAGE_NAME+&amp;quot;/&amp;quot;+.CONTAINER_ID ?? &amp;quot;unknown&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;. = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;message&amp;quot; : .message,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;timestamp&amp;quot;: .timestamp,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;unix_timestamp&amp;quot; : .__REALTIME_TIMESTAMP,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;hostname&amp;quot; : .host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    &amp;quot;meta&amp;quot; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;type&amp;quot; : &amp;quot;docker&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;image&amp;quot; : .IMAGE_NAME,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;container_id&amp;quot; : .CONTAINER_ID,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;log_topology&amp;quot; : .SYSLOG_IDENTIFIER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;.service_identifier = service_identifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette transformation prend un évènement du type:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;CONTAINER_ID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;306bbf1dd696&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;CONTAINER_ID_FULL&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;306bbf1dd69616a0435dec35fa2e3a7d73725915e7cd9f331f5da90dafd400f9&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker_tomcat_1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;CONTAINER_TAG&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;IMAGE_NAME&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;tomcat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;PRIORITY&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;SYSLOG_IDENTIFIER&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_BOOT_ID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;79f4683a192e41218842e2c683972993&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_CAP_EFFECTIVE&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;3fffffffff&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_CMDLINE&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_COMM&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;dockerd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_EXE&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/usr/bin/dockerd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_GID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_MACHINE_ID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;c9f961f08f12487d833a6198ff3d4ffe&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_PID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;966&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SELINUX_CONTEXT&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;unconfined&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SOURCE_REALTIME_TIMESTAMP&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;163182514785904&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SYSTEMD_CGROUP&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;/system.slice/docker.service&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SYSTEMD_INVOCATION_ID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;fc3ebfb5002d41eb9d0e364f60610d94&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SYSTEMD_SLICE&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;system.slice&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_SYSTEMD_UNIT&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker.service&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_TRANSPORT&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journal&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;_UID&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;__MONOTONIC_TIMESTAMP&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;254749478898&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;__REALTIME_TIMESTAMP&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1631825147859&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker-001.example.com&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;16-Sep-2021 20:45:47.859 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [146] milliseconds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;source_type&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journald&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2021-09-16T20:45:47.859335Z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et le transforme en un document de ce type:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;hostname&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker-001.example.com&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;16-Sep-2021 20:45:47.859 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [146] milliseconds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;container_id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;306bbf1dd696&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;tomcat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;log_topology&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;service_identifier&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;tomcat/306bbf1dd696&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2021-09-16T20:45:47.859335Z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;unix_timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1631825147859&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;De cette manière les logs peuvent venir de n’importe quel service on ne conserve, les traces de docker que dans les méta-données de l’évènement.&lt;/p&gt;
&lt;h3 id=&quot;router-les-messages&quot;&gt;Router les messages&lt;/h3&gt;
&lt;p&gt;En fonction du type d’application qui produit le log, nous devons effectuer des traitements différents.&lt;/p&gt;
&lt;p&gt;Pour se faire, nous allons diviser le flux de messages en fonction qu’il vienne d’une application Java ou NodeJs.&lt;/p&gt;
&lt;p&gt;Nous allons utiliser une autre transformation: le &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/transforms/route/&quot;&gt;&lt;code&gt;routing&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_stream_by_log_topology&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;normalized_journald_docker_events&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    [&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_stream_by_log_topology&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    js&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;.meta.log_topology == &amp;quot;js&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    java&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;.meta.log_topology == &amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette transformation créé deux flux, un contenant tous les messages qui ont comme identifiant le tag &lt;code&gt;java&lt;/code&gt; et un autre avec le tag &lt;code&gt;js&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;extraire-les-donnees-des-messages-de-logs&quot;&gt;Extraire les données des messages de logs&lt;/h3&gt;
&lt;p&gt;Pour le moment nos messages de logs sont trop bruts pour pouvoir être exploités par un système automatisé.&lt;/p&gt;
&lt;p&gt;Il faut extraire les informations de celui-ci.&lt;/p&gt;
&lt;p&gt;Généralement les bibilothèques de log dans les différents langages de programmation permettent de définir la sévérité des messages (INFO, WARN, ERROR, FATAL) ainsi que la partie de code qui a produit ce log.&lt;/p&gt;
&lt;p&gt;Nous allons tenter d’extraire ces données.&lt;/p&gt;
&lt;h4 id=&quot;les-logs-java&quot;&gt;Les logs Java&lt;/h4&gt;
&lt;p&gt;Nous avons deux types de containers; du Jetty et du Tomcat. Chacun d’eux à sa façon propre de gérer ses logs.&lt;/p&gt;
&lt;p&gt;Une ligne de log Tomcat ressemblera à:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;13-Sep-2021 05:47:49.513 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler [&amp;quot;http-nio-8080&amp;quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alors que Jetty générera plutôt ceci:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2021-09-13 05:47:47.584:INFO:oejs.AbstractConnector:main: Started ServerConnector@41dddee8{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons utiliser une autre transformation &lt;code&gt;remap&lt;/code&gt; pour réaliser ce travail. Le VRL propose tout &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/vrl/functions/#parse-functions&quot;&gt;une série de parsers&lt;/a&gt; déjà intégrés.&lt;/p&gt;
&lt;p&gt;Malheureusement, aucun d’eux n’est adapté aux logs tel que définis par mes containers.&lt;/p&gt;
&lt;p&gt;Il faut donc se rabattre sur nos bonne vieilles regexp. 😛&lt;/p&gt;
&lt;p&gt;Voici la transformation que je vous propose, il y aurait surement des axes d’améliorations possibles.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse_message_body_java&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;split_stream_by_log_topology.java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    structured = parse_regex(.message, r&amp;#39;^\d{2}-\w{3}-\d{4}\s(?:\d{2}:){2}\d{2}.\d{3}\s(?P&amp;lt;severity&amp;gt;\w+)\s\[[\w-]+\]\s(?P&amp;lt;path&amp;gt;[^\s]+)\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                 parse_regex(.message, r&amp;#39;^\d{4}-\d{2}-\d{2}\s(?:\d{2}:){2}\d{2}.\d{3}:(?P&amp;lt;severity&amp;gt;\w+):(?P&amp;lt;path&amp;gt;[\w\.-]+):(?P&amp;lt;section&amp;gt;[\w-]+):\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                 { &amp;quot;message&amp;quot;: .message }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .message_extracted = structured.message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .path = structured.path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .severity = &amp;quot;info&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    if is_string(.severity) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        .severity = downcase(.severity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un mot sur la création de la variable &lt;code&gt;structured&lt;/code&gt;. Elle est constituée de plusieurs parties.&lt;/p&gt;
&lt;p&gt;Si on schématise cela donne:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;structured = A ?? B ?? default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;A&lt;/code&gt; et &lt;code&gt;B&lt;/code&gt; sont appelés des fonctions faillibles, cela signifie que lorsque qu’elle échoue une action doit être entreprise.&lt;/p&gt;
&lt;p&gt;Il existe plusieurs moyen de gérer la faillibilité d’une fonction.&lt;/p&gt;
&lt;p&gt;La première est de la rendre infaillible en ajoutant un &lt;code&gt;!&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;structured = A!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans ce cas si une erreur survient, le message est abandonné et ne continuera pas dans le pipeline. C’est la manière la plus rapide de gérer
les erreurs mais la plus propre. c’est l’équivalant de lever une exception dans le code.&lt;/p&gt;
&lt;p&gt;Une deuxième solution est de traiter l’erreur à la manière de Golang en analysant l’erreur retournée.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;structured, err = A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if err != null {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  # on traite l&amp;#39;erreur&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le VRL possède son propre système de &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/vrl/errors/#compile-time-errors&quot;&gt;codes d’erreur&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La troisième et dernière solution qui est à mon avis la plus propre,
est la coalescence, il s’agit d’un opérateur qui permet de chaîner des fonctions faillibles.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;structured = A ?? B ?? default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici, si &lt;code&gt;A&lt;/code&gt; échoue alors on éxécute &lt;code&gt;B&lt;/code&gt; et si &lt;code&gt;B&lt;/code&gt; échoue alors on prend la valeur de &lt;code&gt;default&lt;/code&gt;. &lt;code&gt;default&lt;/code&gt; doit absolument être infaillible sinon ça ne compilera pas.&lt;/p&gt;
&lt;p&gt;Dans notre cas l’idée est d’essayer de parser le corps du message en supposant qu’il s’agit d’un message Tomcat. Si la regex ne match pas, la fonction &lt;code&gt;parse_regex&lt;/code&gt; échoue et l’on passe au parse de message Jetty. Et si ça échoue aussi on créé un document par défaut qui ne contient que le message.&lt;/p&gt;
&lt;p&gt;Nous allons utiliser ce système de gestion d’erreurs pour gérer plusieurs types de formats de logs au sein d’une même transformation.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;13-Sep-2021 05:47:49.513 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler [&amp;quot;http-nio-8080&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2021-09-13 05:47:47.584:INFO:oejs.AbstractConnector:main: Started ServerConnector@41dddee8{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vont respectivement donner ces valeurs à la variable &lt;code&gt;structured&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Initializing ProtocolHandler [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;http-nio-8080&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;INFO&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;org.apache.coyote.AbstractProtocol.init&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Started ServerConnector@41dddee8{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;INFO&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;oejs.AbstractConnector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On en profite pour normaliser la sévérité du log. Mais on doit prendre quelques précautions. En effet, toutes les
lignes ne posséderont pas de sévérité. Or la méthode VRL &lt;code&gt;downcase&lt;/code&gt; prend exclusivement des chaîne de caractères comme paramètre d’entrée.&lt;/p&gt;
&lt;p&gt;Comme on peut le voir les données sont extraites et normalisées sous une forme commune qui facilite leur traitement ultérieur.&lt;/p&gt;
&lt;p&gt;Finalement la sortie finale sera:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;hostname&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker-001.example.com&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;16-Sep-2021 20:45:47.859 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [146] milliseconds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message_extracted&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Server startup in [146] milliseconds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;container_id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;306bbf1dd696&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;tomcat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;log_topology&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;org.apache.catalina.startup.Catalina.start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;service_identifier&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;tomcat/306bbf1dd696&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2021-09-16T20:45:47.859335Z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;unix_timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1631825147859&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;les-logs-nodejs&quot;&gt;Les logs NodeJs&lt;/h3&gt;
&lt;p&gt;De la même manière que pour les logs venant des containers java. Nous allons utiliser une transformation qui va venir extraire les données venant de nos lignes de logs.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse_message_body_js&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;split_stream_by_log_topology.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    structured = parse_regex(.message, r&amp;#39;^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\s\[(?P&amp;lt;path&amp;gt;[\w_/-]+)\]\s(?P&amp;lt;severity&amp;gt;\w+):\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                { &amp;quot;message&amp;quot;: .message }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .message_extracted = structured.message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .path = structured.path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .severity = &amp;quot;info&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    if is_string(.severity) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        .severity = downcase(.severity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour rappel un log NodeJs de notre application ressemble à:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2021-09-14T06:52:52.480Z [main] info: Application started&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après transformation:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;hostname&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker-001.example.com&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2021-09-16T20:45:45.357Z [main] info: Application started&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;message_extracted&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;Application started&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;container_id&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2ccdfff60bd2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;log_topology&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;service_identifier&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;js/2ccdfff60bd2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;2021-09-16T20:45:45.357827Z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;   &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;unix_timestamp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-3&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-14&quot;&gt;1631825145357&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a ici aussi fait en sorte que les messages aient des topologies identiques. Nous pourrons désormais traiter
de manière unique les logs venant du Java et du NodeJS.&lt;/p&gt;
&lt;h3 id=&quot;exporter-nos-logs-normalises-vers-l-aggregateur&quot;&gt;Exporter nos logs normalisés vers l’aggrégateur&lt;/h3&gt;
&lt;p&gt;Jusqu’à présent nous avons normalisé nos logs mais il reste toujours sur notre machine, nous ne résolvons toujours pas le souci de la centralisation des logs.&lt;/p&gt;
&lt;p&gt;Nous allons devoir les exporter vers une destination qui se chargera de leur aggrégation.&lt;/p&gt;
&lt;p&gt;Et quoi de mieux que d’envoyer vers un autre pipeline Vector! 😀&lt;/p&gt;
&lt;p&gt;Ce choix technique nous permettra de pouvoir réaliser tous les post-traitements voulus. Au contraire de les envoyer directement dans un store comme Elasticsearch ou autre.&lt;/p&gt;
&lt;p&gt;Pour cela nous allons utiliser un &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sinks/vector/&quot;&gt;sink Vector&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur la machine contenant la stack docker dont on veut extraire les logs,&lt;/p&gt;
&lt;p&gt;on rajoute au pipeline:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;vector_aggregator&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parse_message_body_java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parse_message_body_js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;address&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;192.168.9.63:9000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons cette fois-ci prendre 2 flux en entrée, les messages java et NodeJs extraits et normalisés.&lt;/p&gt;
&lt;p&gt;En suite on définit l’addresse de notre instance Vector qui sert d’aggrégateur.&lt;/p&gt;
&lt;p&gt;Et c’est tout 😁&lt;/p&gt;
&lt;p&gt;Vous pouvez désormais envoyer d’une multitude de noeuds vos logs vers un point central.&lt;/p&gt;
&lt;h3 id=&quot;definition-du-pipeline-d-aggregation&quot;&gt;Définition du pipeline d’aggrégation&lt;/h3&gt;
&lt;p&gt;Je vous ai dit que nous allions pousser nos logs vers un autre Vector, lui aussi va avoir besoin d’une configuration.&lt;/p&gt;
&lt;p&gt;Créons un fichier &lt;code&gt;aggregator.toml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Tout d’abord la source, une &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sources/vector/&quot;&gt;source Vector&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;vector_server&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;address&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.0.0.0:9000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On écoute sur le port 9000.&lt;/p&gt;
&lt;p&gt;Étant donné qu’il s’agit juste de démontrer la faisabilité de la centralisation des logs. Nous allons nous contenter d’une simple sortie fichier. Mais il est bien évidemment possible de faire des choses bien plus complexes, incluant des transformations, des aggrégations et des réductions.&lt;/p&gt;
&lt;p&gt;Déclarons donc un &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://vector.dev/docs/reference/configuration/sinks/file/&quot;&gt;sink File&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;file_json_output&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector_server&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;encoding&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ndjson&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;./logs/by-host/{{ hostname }}/{{ meta.type }}/json/{{ service_identifier }}/%Y-%m-%d.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous allons définir un autre sinks, qui nous permettra de lire les logs comme si nous étions dans le stdout/err de l’application.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;file_text_output&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector_server&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;encoding&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;./logs/by-host/{{ hostname }}/{{ meta.type }}/text/{{ service_identifier }}/%Y-%m-%d.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;lift-off-rocket&quot;&gt;Lift-off ! 🚀&lt;/h3&gt;
&lt;p&gt;On a tous nos pipelines! Il est temps de lancer tout ça! 😁&lt;/p&gt;
&lt;p&gt;Tout d’abord, installez Vector sur tout vos serveurs, aussi bien ceux qui contiendront les stack dont on veut récupérer les logs que le noeud d’aggrégation.&lt;/p&gt;
&lt;p&gt;Copiez y respectivement les fichiers &lt;code&gt;docker_logs_pipeline_normalization.toml&lt;/code&gt; et &lt;code&gt;aggregator.toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lancez dans l’ordre&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-4&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-11&quot;&gt;-config&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; aggregator.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vector --config docker_logs_pipeline_normalization.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si vous faites l’inverse vous aurez une erreur car le pipeline d’extraction de logs essaie de se connecter au port 9000. Or celui n’est pas encore en écoute.&lt;/p&gt;
&lt;p&gt;Ceci me permet de vous prévenir que si votre réseau n’est pas suffisamment stable, il se peut que des problèmes de connectivité apparaissent et des erreurs surviennent.&lt;/p&gt;
&lt;p&gt;Ceci avait motivé notre choix dès le début de confier la gestion des logs en premier lieu à journald puis à Vector. Si Vector tombe les logs ne seront pas perdu et la stack Docker continuera de tourner comme si de rien n’était.&lt;/p&gt;
&lt;p&gt;D’une manière général, un couplage faible entre systèmes est toujours a préféré lorsque que les contraintes le permettent. Ici par exemple nous avons perdu en réactivité mais gagné en résillience.
Tout est une histoire de balance entre performance et sécurité, c’est un peu la définition de l’ingéniérie. 😁&lt;/p&gt;
&lt;p&gt;Maintenant si vous lancez vos &lt;code&gt;docker-compose up&lt;/code&gt;, vous devriez voir les fichiers de logs apparaître sur votre noeud d’aggrégation.&lt;/p&gt;
&lt;h3 id=&quot;on-resume&quot;&gt;On résume&lt;/h3&gt;
&lt;p&gt;Il est temps de faire le bilan.&lt;/p&gt;
&lt;p&gt;On possède deux pipelines:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker_logs_pipeline_normalization.toml&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;journald_docker_unit&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journald&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;include_units&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;data_dir&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;${PWD}/data&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;normalized_journald_docker_events&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;journald_docker_unit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    service_identifier = .IMAGE_NAME+&amp;quot;/&amp;quot;+.CONTAINER_ID ?? &amp;quot;unknown&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    . = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;message&amp;quot; : .message,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;timestamp&amp;quot;: .timestamp,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;unix_timestamp&amp;quot; : .__REALTIME_TIMESTAMP,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;hostname&amp;quot; : .host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        &amp;quot;meta&amp;quot; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;type&amp;quot; : &amp;quot;docker&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;image&amp;quot; : .IMAGE_NAME,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;container_id&amp;quot; : .CONTAINER_ID,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;            &amp;quot;log_topology&amp;quot; : .SYSLOG_IDENTIFIER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .service_identifier = service_identifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_stream_by_log_topology&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;normalized_journald_docker_events&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    [&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_stream_by_log_topology&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    js&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;.meta.log_topology == &amp;quot;js&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;    java&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;.meta.log_topology == &amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse_message_body_java&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;split_stream_by_log_topology.java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    structured = parse_regex(.message, r&amp;#39;^\d{2}-\w{3}-\d{4}\s(?:\d{2}:){2}\d{2}.\d{3}\s(?P&amp;lt;severity&amp;gt;\w+)\s\[[\w-]+\]\s(?P&amp;lt;path&amp;gt;[^\s]+)\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                 parse_regex(.message, r&amp;#39;^\d{4}-\d{2}-\d{2}\s(?:\d{2}:){2}\d{2}.\d{3}:(?P&amp;lt;severity&amp;gt;\w+):(?P&amp;lt;path&amp;gt;[\w\.-]+):(?P&amp;lt;section&amp;gt;[\w-]+):\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                 { &amp;quot;message&amp;quot;: .message }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .message_extracted = structured.message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .path = structured.path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .severity = &amp;quot;info&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    if is_string(.severity) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        .severity = downcase(.severity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;transforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse_message_body_js&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;remap&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;split_stream_by_log_topology.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;source&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    structured = parse_regex(.message, r&amp;#39;^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\s\[(?P&amp;lt;path&amp;gt;[\w_/-]+)\]\s(?P&amp;lt;severity&amp;gt;\w+):\s(?P&amp;lt;message&amp;gt;.*)$&amp;#39;) ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;                { &amp;quot;message&amp;quot;: .message }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .message_extracted = structured.message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .path = structured.path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    .severity = &amp;quot;info&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    if is_string(.severity) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;        .severity = downcase(.severity)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;vector_aggregator&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parse_message_body_java&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;parse_message_body_js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;address&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;192.168.9.63:9000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aggregator.toml&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;vector_server&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;address&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;0.0.0.0:9000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;version&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;file_json_output&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector_server&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;encoding&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;ndjson&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;./logs/by-host/{{ hostname }}/{{ meta.type }}/json/{{ meta.type }}/{{ service_identifier }}/%Y-%m-%d.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sinks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;file_text_output&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;inputs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;vector_server&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;encoding&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;./logs/by-host/{{ hostname }}/{{ meta.type }}/text/{{ service_identifier }}/%Y-%m-%d.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L’intégralité des sources peut-être retrouvé sur le &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://gitlab.com/Akanoa/vector-pipelines/-/tree/main&quot;&gt;projet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Petits dessins parce que c’est cool les dessins. 😉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/vector/vector_log_node.png&quot; alt=&quot;vector node&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Voici ce qui se passe schématiquement sur un noeud.&lt;/p&gt;
&lt;p&gt;Les applications crachent leurs logs sur journald.&lt;/p&gt;
&lt;p&gt;Vector vient lire journald pour en extraire les lignes de logs.&lt;/p&gt;
&lt;p&gt;Normalise et extrait les informations pertinentes puis retransmet par réseau à un autre Vector.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/vector/vector_log_aggregator.png&quot; alt=&quot;vector aggreagator&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;Les logs normalisés des différents noeuds transitent par réseau vers notre aggrégateur.&lt;/p&gt;
&lt;p&gt;Nous pouvous tout à fait créer des docker-003, 004, ou 100. La topologie restera la même.&lt;/p&gt;
&lt;p&gt;Tant que votre réseau tient le traffic et que votre noeud d’aggrégation aussi il n’y aura pas de souci.&lt;/p&gt;
&lt;p&gt;Si votre trafic devient trop important, il faudra peut-être penser à une topologie différente qui fera apparaitre un broker de messages qui tiendra lieu de buffer pour gérer la back-pressure de votre traffic de logs.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Cet article est le premier d’une série sur l’Observabilité, une discipline de l’informatique qui se base sur plusieurs concepts dont la gestion des logs.&lt;/p&gt;
&lt;p&gt;Nous avons fait que la moitié du chemin concernant l’étude de nos logs, nous les avons normalisés et centralisés mais pas encore traités et rendus intelligents.&lt;/p&gt;
&lt;p&gt;Dans la suite des articles, nous tenteront de définir une logique de recherche de logs permettant la détection et la résolution de bugs.&lt;/p&gt;
&lt;p&gt;Je n’ai pas encore décidé de la technologie qui sera mis en place mais peut-être un couple &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://www.elastic.co/fr/elastic-stack/&quot;&gt;Elasticsearch-Kibana&lt;/a&gt; ou des produits plus exotiques comme &lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https://grafana.com/oss/loki/&quot;&gt;Loki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J’espère que cette petite présentation des bases de la réalisation d’un système de pipeline de logs vous a plu et l’on se dit à plus tard pour la suite de nos aventures dans le monde merveilleux normalisé et automatisé de l’Observabilité! 🤩&lt;/p&gt;
&lt;p&gt;Merci de m’avoir lu! 💖&lt;/p&gt;
</content>
        
    </entry>
</feed>
