<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Erwan Deruelle</title>
    <description>The latest articles on Forem by Erwan Deruelle (@d3rwan).</description>
    <link>https://forem.com/d3rwan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F363609%2F67a9399c-0f97-441b-a573-fc7c66464396.jpg</url>
      <title>Forem: Erwan Deruelle</title>
      <link>https://forem.com/d3rwan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/d3rwan"/>
    <language>en</language>
    <item>
      <title>Discovering Vector</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Wed, 15 Apr 2020 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/discovering-vector-10jk</link>
      <guid>https://forem.com/d3rwan/discovering-vector-10jk</guid>
      <description>&lt;h2&gt;
  
  
  TL/DR
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Logstash&lt;/code&gt; + &lt;code&gt;Rust&lt;/code&gt; = &lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; ?&lt;/p&gt;

&lt;p&gt;We can actually describe Vector as a Logstash built in Rust, with all the language’s advantages for free (high performance, cross-compilation), but the flaws of a still young product (few modules, no known references). Note that the documentation seems well done, and the first existing modules allow you to manage a lot of simple monitoring use-case. As we can agree that Logstash is not the best product in the world, let’s hope that Vector will find its place in the community in the coming months. In addition, Vector natively offers modules equivalent to the Logstash’s one, which means that the migration will not be complicated!&lt;/p&gt;

&lt;h2&gt;
  
  
  And so what ? We have time, right ? #LockedDown
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; could be defined as an high-performance observability data router that makes transforming, collecting, and sending events (logs &amp;amp; metrics) easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concept
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QimCTqYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/concept.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QimCTqYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/concept.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, it’s an ETL based on the following concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt; (aka. E / Extract)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading raw data from the source.For example, we could &lt;a href="https://vector.dev/docs/reference/sources/file/"&gt;read log into a file&lt;/a&gt;, &lt;a href="https://vector.dev/docs/reference/sources/kafka/"&gt;listen a Kafka topic&lt;/a&gt; or &lt;a href="https://vector.dev/docs/reference/sources/statsd/"&gt;get StatsD metrics&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transform&lt;/strong&gt; (aka. T / Transform)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transform raw data, or complete data stream.For example, we could &lt;a href="https://vector.dev/docs/reference/transforms/filter/"&gt;filter entries&lt;/a&gt; or &lt;a href="https://vector.dev/docs/reference/transforms/regex_parser/"&gt;parse a log using a regular expression&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sink&lt;/strong&gt; (aka. L / Load)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Destination for events. Each module’s transmission method is dictated by the downstream service it is interacting with (ie. individual events, bulk or stream). For example, we could &lt;a href="https://vector.dev/docs/reference/sinks/aws_s3/"&gt;save raw data into Amazon S3&lt;/a&gt;, &lt;a href="https://vector.dev/docs/reference/sinks/elasticsearch/"&gt;indexing them into Elasticsearch&lt;/a&gt; or &lt;a href="https://vector.dev/docs/reference/sinks/prometheus/"&gt;expose to Prometheus&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Fast
&lt;/h4&gt;

&lt;p&gt;Built in Rust, Vector is fast and memory-efficient, all without runtime or garbage collector&lt;/p&gt;

&lt;h4&gt;
  
  
  One only tool, from source to destination
&lt;/h4&gt;

&lt;p&gt;Vector is designed to be used by everyone, whatever the context, by offering several deployment strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#daemon"&gt;Daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, it serves as serves as an light-weight agent by running in the background, in its own process, for collecting all data for that host.&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RUClwejT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_daemon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RUClwejT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_daemon.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#sidecar"&gt;Sidecar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, it serves also an an agent, but we will have one process by service. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d2Rbm7Fq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_sidecar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d2Rbm7Fq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_sidecar.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#service"&gt;Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In ths case, Vector is a separate service designed to receive data from an upstream source and fan-out to one or more destinations. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rmjTySoX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_service.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rmjTySoX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_service.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By using and/or combining theses strategies, we can define several architecture topologies to collect our data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#distributed"&gt;Distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this topology, each Vector instance will directly send data to downstream services. It’s the simplest topology, and it will easily scale with our architecture. However, it can impact local performance or lead to data losses. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WekvkHgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_distributed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WekvkHgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_distributed.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#centralized"&gt;Centralized&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, each agent will send data to a dedicated centralized Vector instance, which will responsible to do the most expensive operations. So, it’s more efficient for client nodes, but a dedicated centralized service as a SPOF which could lead to data losses. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E2k4d3ff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_centralized.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E2k4d3ff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_centralized.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#stream-based"&gt;Stream based&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Variant of the previous topology, in which we will add a broker upstream of the centralized service in order to remove the SPOF. This topology is the most scalable and reliable, but also the most complex and expensive. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob6lyL8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_stream.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob6lyL8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_stream.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Easy deployment
&lt;/h4&gt;

&lt;p&gt;Built with Rust, Vector cross-compiles to a single static binary without any runtime.&lt;/p&gt;
&lt;h2&gt;
  
  
  Well, but does it really works ?
&lt;/h2&gt;

&lt;p&gt;I will be inspired by a previous blog post : &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/d3rwan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UIAVFYfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--RJauYKK2--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/363609/67a9399c-0f97-441b-a573-fc7c66464396.jpg" alt="d3rwan image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/d3rwan/an-elk-stack-from-scratch-with-docker-ofh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;An ELK stack from scratch, with Docker&lt;/h2&gt;
      &lt;h3&gt;Erwan Deruelle ・ Apr  9 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#monitoring&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#elk&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#elasticsearch&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kibana&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RMPXmfml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/archi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RMPXmfml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/archi.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Proof of concept architecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this case, we will use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elasticsearch, search engine which provide full text search &amp;amp; analytics,&lt;/li&gt;
&lt;li&gt;Kibana, which provide an UI for exploring data, and create interactive dashboards&lt;/li&gt;
&lt;li&gt;Vector, as central service, to transform events and sending them to Elasticsearch,&lt;/li&gt;
&lt;li&gt;Kafka, as an upstream broker&lt;/li&gt;
&lt;li&gt;Vector, as an agent, to ingest raw source data and sending them to Kafka&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;So here, we are under a &lt;a href="https://vector.dev/docs/setup/deployment/topologies/#stream-based"&gt;Stream based topology&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Services and interactions are described in a docker-compose.yml file:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The Vector central service is configured as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading events from Kafka&lt;/li&gt;
&lt;li&gt;JSON Parsing from events send by Vector agent&lt;/li&gt;
&lt;li&gt;Grok Parsing (same as Logstash Grok format) from raw log line&lt;/li&gt;
&lt;li&gt;Indexing into Elasticsearch&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Fun fact, we can &lt;a href="https://vector.dev/docs/reference/tests/"&gt;unit testing our configuration&lt;/a&gt;, as we can see in the [[tests]] section.&lt;/p&gt;

&lt;p&gt;Note that each configuration step is based on at least one previous step.&lt;/p&gt;

&lt;p&gt;On our webapp side, we will have an Vector agent configured as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading logs from file&lt;/li&gt;
&lt;li&gt;Sending them to Kafka&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Complete projet is available on github&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/d3rwan"&gt;
        d3rwan
      &lt;/a&gt; / &lt;a href="https://github.com/d3rwan/discovering_vector"&gt;
        discovering_vector
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Now, I can start all my services with docker-compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; docker-compose build
 docker-compose up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then, you should be able to access the web app (&lt;a href="http://localhost:80"&gt;http://localhost:80&lt;/a&gt;, in my case) &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Web Application example (source: &lt;a href="https://github.com/sbilly/joli-admin"&gt;https://github.com/sbilly/joli-admin&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After few minutes browsing, you can go to Kibana UI. (in my case, &lt;a href="http://localhost:5601"&gt;http://localhost:5601&lt;/a&gt;), then click on &lt;code&gt;Management&lt;/code&gt; tab, then &lt;code&gt;Kibana &amp;gt; Index Patterns&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vSkpsNmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/add_index_kibana.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vSkpsNmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/add_index_kibana.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Adding vector-* index pattern&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here we go ! A &lt;code&gt;vector-YYYY.MM.DD&lt;/code&gt; index should be created with my application logs.From there, I will be able to create my searchs, visualizations, dashboards or canvas in Kibana, and use all theses informations.&lt;/p&gt;

&lt;p&gt;To conclude, it’s actually quite easy to use &lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; as a substitute for Logstash/Beats in an Elastic stack, and it works.Remains to see if performance gains are real, and if the project can resist in the future and become a real alternative for the community.Until then, even very young, this project is full of promises and good ideas (unit tests, multi-topologies, …), and so deserves that we take a look!&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>vector</category>
      <category>rust</category>
      <category>logstash</category>
    </item>
    <item>
      <title>A la découverte de Vector</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Tue, 14 Apr 2020 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/a-la-decouverte-de-vector-5287</link>
      <guid>https://forem.com/d3rwan/a-la-decouverte-de-vector-5287</guid>
      <description>&lt;h2&gt;
  
  
  TL/DR
&lt;/h2&gt;

&lt;p&gt;En 2 briques, &lt;br&gt;
 &lt;code&gt;Logstash&lt;/code&gt; ? ETL ! &lt;br&gt;
 &lt;code&gt;Rust&lt;/code&gt; ? &lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; ! &lt;br&gt;
On peut effectivement décrire Vector comme un Logstash qu’on aurait réécrit en Rust, avec tous les avantages inhérents au langage (performance, binaire natif), mais les défauts d’une solution encore très jeune (nombre de modules limités, peu de références). On notera que la documentation semble plutôt bien faite, et que les composants natifs permettent de gérer beaucoup de use-case simple de monitoring. Et comme on peut convenir que Logstash n’est pas le meilleur produit du monde, espérons que Vector trouve sa place dans les prochains mois dans la communauté. Et en plus, ca tombe bien, Vector propose nativement des modules équivalents à ceux de Logstash, ce qui fait que la migration ne sera pas compliquée !&lt;/p&gt;
&lt;h2&gt;
  
  
  Après-tout, on a le temps non ? #Confinement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; se défini comme un routeur de données d’observabilité haute-performance, qui permet la collecte, la transformation et l’envoi d’évênements (logs et/ou métriques).&lt;/p&gt;
&lt;h3&gt;
  
  
  Fonctionnement conceptuel
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QimCTqYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/concept.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QimCTqYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/concept.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il s’agit basiquement d’un ETL qui s’appuie sur les notions suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt; (aka. E / Extract)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Récupération des données brutes depuis l’endroit où elles sont produites.&lt;br&gt;
Par exemple, on pourra &lt;a href="https://vector.dev/docs/reference/sources/file/"&gt;lire les logs dans un fichier&lt;/a&gt;, &lt;a href="https://vector.dev/docs/reference/sources/kafka/"&gt;écouter une file Kafka&lt;/a&gt; ou &lt;a href="https://vector.dev/docs/reference/sources/statsd/"&gt;récupérer des métriques de StatsD&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transform&lt;/strong&gt; (aka. T / Transform)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transformation des données brutes, ou du flux complet de données,&lt;br&gt;
Par exemple, on pourra &lt;a href="https://vector.dev/docs/reference/transforms/filter/"&gt;filtrer des entrées&lt;/a&gt; ou encore &lt;a href="https://vector.dev/docs/reference/transforms/regex_parser/"&gt;parser un log selon une expression régulière&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sink&lt;/strong&gt; (aka. L / Load)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Destination des données lues et transformées. Chaque module enverra les données de manière unitaire ou sous la forme d’un stream en fonction du service cible.&lt;br&gt;
Par exemple, on pourra &lt;a href="https://vector.dev/docs/reference/sinks/aws_s3/"&gt;sauvegarder les données brutes sous Amazon S3&lt;/a&gt;, les &lt;a href="https://vector.dev/docs/reference/sinks/elasticsearch/"&gt;indexer dans un cluster Elasticsearch&lt;/a&gt; ou les &lt;a href="https://vector.dev/docs/reference/sinks/prometheus/"&gt;exposer à Prometheus&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Fonctionnalités
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Rapide
&lt;/h4&gt;

&lt;p&gt;Ecrit en Rust, Vector est très rapide avec une gestion efficiente de la mémoire.Le tout sans runtime, ni garbage collector.&lt;/p&gt;
&lt;h4&gt;
  
  
  Un outil unique, de la source à la destination
&lt;/h4&gt;

&lt;p&gt;Vector propose plusieurs stratégies de déploiement afin de pouvoir être utilisé par tous, quelque-soit le contexte.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#daemon"&gt;Déploiement en tant que Démon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ici, on lancera une instance de Vector en tâche de fond pour collecter &lt;em&gt;toutes&lt;/em&gt; les données du serveur hôte &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RUClwejT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_daemon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RUClwejT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_daemon.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#sidecar"&gt;Déploiement en tant que Sidecar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans cette stratégie, on lancera une instance de Vector par service à monitorer. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d2Rbm7Fq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_sidecar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d2Rbm7Fq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_sidecar.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/strategies/#service"&gt;Déploiement en tant que Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ici, Vector est lancé en tant qu’un service dédié. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rmjTySoX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_service.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rmjTySoX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/strategy_service.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En utilisant et/ou combinant ces stratégies, on peut donc définir des topologies d’architecture de collecte de données&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#distributed"&gt;Collecte distribuée&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans cette topologie, chaque instance de Vector va directement envoyer les données au(x) service(s) cibles. Il s’agit du cas le plus simple, et qui permet de &lt;em&gt;scaler&lt;/em&gt; facilement. Néanmoins, il peut induire des pertes de performance locales ou de données.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WekvkHgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_distributed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WekvkHgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_distributed.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#centralized"&gt;Collecte Centralisée&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ici, chaque instance de Vector va envoyer les données à une instance centrale, chargée d’effectuer les opérations les plus coûteuses. De fait, moins d’impact sur les performances locales des applicatifs, mais un service centrale en tant que &lt;a href="https://fr.wikipedia.org/wiki/Point_de_d%C3%A9faillance_unique"&gt;SPOF&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E2k4d3ff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_centralized.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E2k4d3ff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_centralized.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vector.dev/docs/setup/deployment/topologies/#stream-based"&gt;Collecte Streamée&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Variante de la topologie précédente, dans laquelle on va rajouter un broker en amont du service centrale afin de supprimer le SPOF. Cette topologie est la plus scalable et durable, mais aussi la plus complexe à mettre en place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob6lyL8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_stream.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob6lyL8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/topology_stream.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Simplicité de déploiement
&lt;/h4&gt;

&lt;p&gt;Concu en Rust, Vector se présente donc sous la forme d’un binaire cross-compilé pour l’os cible, et ne nécessite pas de runtime type JVM&lt;/p&gt;
&lt;h2&gt;
  
  
  Bon, OK, mais ca marche au moins ?
&lt;/h2&gt;

&lt;p&gt;Pour tester Vector, je vais m’inspirer d’un post précédent : &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/d3rwan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UIAVFYfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--RJauYKK2--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/363609/67a9399c-0f97-441b-a573-fc7c66464396.jpg" alt="d3rwan image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/d3rwan/une-stack-elk-from-scratch-avec-docker-5gp6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Une stack ELK from scratch avec Docker&lt;/h2&gt;
      &lt;h3&gt;Erwan Deruelle ・ Apr  9 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#monitoring&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#elk&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#elasticsearch&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kibana&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RMPXmfml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/archi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RMPXmfml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/archi.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Architecture de notre POC&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dans le cas présent, je vais m’appuyer sur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elasticsearch, comme moteur d’indexation, de recherche &amp;amp; d’analytics,&lt;/li&gt;
&lt;li&gt;Kibana, comme IHM de visualisation et de génération de tableaux de bord interactifs&lt;/li&gt;
&lt;li&gt;Vector, en tant que service central, pour transformer les données et les envoyer vers Elasticsearch,&lt;/li&gt;
&lt;li&gt;Kafka, en tant que broker en amont de ma stack de monitoring&lt;/li&gt;
&lt;li&gt;Vector, en tant qu’agent, pour récupérer les données sources et les envoyer vers Kafka&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;On se positionne donc dans la topologie de &lt;a href="https://vector.dev/docs/setup/deployment/topologies/#stream-based"&gt;Collecte Streamée&lt;/a&gt; décrite ci-avant&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’ensemble des services et des interactions sont décrites dans un fichier docker-compose.yml:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Le service central Vector est configuré comme suit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lecture des événements depuis le broker Kafka&lt;/li&gt;
&lt;li&gt;Parsing du JSON de l’événement envoyé depuis l’agent Vector&lt;/li&gt;
&lt;li&gt;Parsing Grok (format Logstash) de la ligne de log brute&lt;/li&gt;
&lt;li&gt;Indexation vers Elasticsearch&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Fun fact, il est possible de &lt;a href="https://vector.dev/docs/reference/tests/"&gt;tester unitairement la configuration&lt;/a&gt; avec Vector, comme on peut le voir dans la section [[tests]] du fichier&lt;/p&gt;

&lt;p&gt;On pourra également noter que chaque step de configuration se base sur au moins un step précédent.&lt;/p&gt;

&lt;p&gt;Côté webapp, on ajoute un agent Vector configuré comme suit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lecture des logs depuis un fichier&lt;/li&gt;
&lt;li&gt;Envoi vers le broker Kafka&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Le projet de test complet est disponible sur github &lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/d3rwan"&gt;
        d3rwan
      &lt;/a&gt; / &lt;a href="https://github.com/d3rwan/discovering_vector"&gt;
        discovering_vector
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Il ne me reste qu’à lancer tous mes services&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; docker-compose build
 docker-compose up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Puis me rendre sur ma webapp (dans mon cas, &lt;a href="http://localhost:80"&gt;http://localhost:80&lt;/a&gt;)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Exemple d’application web (source: &lt;a href="https://github.com/sbilly/joli-admin"&gt;https://github.com/sbilly/joli-admin&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Après une rapide navigation, je peux me rendre sur mon IHM Kibana (dans mon cas, &lt;a href="http://localhost:5601"&gt;http://localhost:5601&lt;/a&gt;), puis dans l’onglet &lt;code&gt;Management&lt;/code&gt; puis &lt;code&gt;Kibana &amp;gt; Index Patterns&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vSkpsNmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/add_index_kibana.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vSkpsNmD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/vector/add_index_kibana.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Ajout du pattern d’index vector-*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Et voilà ! Un index &lt;code&gt;vector-YYYY.MM.DD&lt;/code&gt; a été crée et contient bien mes logs applicatifs. A partir de là, je vais pouvoir créer mes indexs, recherches visualisations, dashboards et autre canvas dans Kibana, et pouvoir utiliser ces informations de monitoring.&lt;/p&gt;

&lt;p&gt;Pour conclure, il est effectivement assez facile d’utiliser &lt;a href="https://vector.dev/"&gt;Vector&lt;/a&gt; comme remplaçant de logtash/beats dans une stack Elastic, et le fait est que ca fonctionne. Reste à voir sur la durée si les gains de performance annoncé sont réels, et si le projet arrive durablement à s’imposer dans la communauté. En attendant, même très jeune, ce projet est plein de promesses et de bonnes idées (tests unitaires, multi-topologies natives, …), et mérite donc qu’on y jette un oeil!&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>vector</category>
      <category>rust</category>
      <category>logstash</category>
    </item>
    <item>
      <title>Hello, new world - De Medium à Dev.to</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Fri, 10 Apr 2020 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/hello-new-world-de-medium-a-dev-to-4n68</link>
      <guid>https://forem.com/d3rwan/hello-new-world-de-medium-a-dev-to-4n68</guid>
      <description>&lt;h2&gt;
  
  
  Préambule
&lt;/h2&gt;

&lt;p&gt;Quel jour on est déjà ? Ah, #ConfinementJour25 selon Twitter.Depuis quelques jours j’ai ressenti l’envie de refaire des articles de blog.&lt;/p&gt;

&lt;p&gt;Lors de mes derniers articles, j’avais choisi d’utiliser la plateforme &lt;a href="https://medium.com"&gt;Medium&lt;/a&gt;, qui permettait à l’époque facilement de publier du contenu au travers d’une IHM minimaliste, tout en offrant une belle visibilité.Depuis, la plateforme a évoluée, et est devenue assez désagréable à utiliser &lt;em&gt;en tant que lecteur&lt;/em&gt;. Affichage permanent du paywall, obligation de se connecter, &lt;em&gt;exode&lt;/em&gt; d’une partie de la communauté tech…&lt;/p&gt;

&lt;p&gt;L’alternative du moment, c’est &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;, et ca a l’avantage (ou l’inconvénient) d’être orientée tech, là ou &lt;a href="https://medium.com"&gt;medium&lt;/a&gt; se voulait plus généraliste.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--yFV_YQMa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1002604104194056192/IEoNsLNM_normal.jpg" alt="DEV Community 👩‍💻👨‍💻 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        DEV Community 👩‍💻👨‍💻
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/thepracticaldev"&gt;@thepracticaldev&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      DEV is now open source &lt;a href="https://t.co/05nuBnkbKI"&gt;dev.to/ben/devto-is-n…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      17:04 PM - 08 Aug 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1027239140826460170" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1027239140826460170" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      266
      &lt;a href="https://twitter.com/intent/like?tweet_id=1027239140826460170" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      796
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Néanmoins, on peut se poser la question : est-ce que ce ne serait pas qu’un nouveau &lt;a href="https://medium.com"&gt;medium&lt;/a&gt;, qui suivra le même chemin ? Sans-doute diront certains, néanmoins &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; propose nativement une fonctionnalité de cross-posting qui permet de publier sur leur site un article que vous auriez publié ailleurs. On pourrait donc avoir les avantages d’une plateforme en vogue (visibilité, communauté), tout en gardant la propriété de ses données ? C’est même un concept : &lt;a href="https://indieweb.org/POSSE"&gt;POSSE - Publish on your Own Site, Syndicate ElseWhere&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  De medium à un blog maison
&lt;/h2&gt;

&lt;p&gt;J’ai décidé de partir sur &lt;a href="https://www.gatsbyjs.org/"&gt;Gatsby&lt;/a&gt;, un générateur de site statique basé sur ReactJS et GraphQL.Gatsby se base d’une part sur des composants React affichant la structure du blog, et permet d’autre part de parser des fichers markdown qui correspondent aux articles de blog.&lt;/p&gt;

&lt;p&gt;Par ailleurs, la fonctionnalité Github Pages permet d’exposer un site statique.&lt;/p&gt;

&lt;p&gt;1- Récupérer mes anciens articles sur &lt;a href="https://medium.com"&gt;medium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour cela, j’ai utilisé le projet &lt;a href="https://www.npmjs.com/package/mediumexporter"&gt;mediumexporter&lt;/a&gt; qui permet automatique de parser un article en markdown depuis son url publique.&lt;br&gt;&lt;br&gt;
Il a fallu néanmoins une seconde passe de nettoyage du markdown généré, notamment pour remplacer les medias importés dans &lt;a href="https://medium.com"&gt;medium&lt;/a&gt; (image, tweets ou gist).&lt;/p&gt;

&lt;p&gt;2- Bootstraper un blog avec Gatsby&lt;/p&gt;

&lt;p&gt;Rien de plus simple, il existe un tas de boilerplate sur Github, parmis lesquels celui de Dan Abramov, le créateur de Redux.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gaearon"&gt;
        gaearon
      &lt;/a&gt; / &lt;a href="https://github.com/gaearon/overreacted.io"&gt;
        overreacted.io
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Personal blog by Dan Abramov.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Le plus simple est cependant de se baser sur le starter officiel qui explique le mode opératoire pas à pas.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gatsbyjs"&gt;
        gatsbyjs
      &lt;/a&gt; / &lt;a href="https://github.com/gatsbyjs/gatsby-starter-blog"&gt;
        gatsby-starter-blog
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Gatsby starter for creating a blog
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;3- Publier sur Github Pages&lt;/p&gt;

&lt;p&gt;Là encore, la &lt;a href="https://www.gatsbyjs.org/docs/how-gatsby-works-with-github-pages/#deploying-to-a-path-on-github-pages"&gt;documentation officielle&lt;/a&gt; est bien faite et explique le fonctionnement pas à pas.&lt;/p&gt;

&lt;p&gt;En 2 mots, dans mon cas, depuis mon repository Github, en allant dans le menu &lt;code&gt;Settings&lt;/code&gt;, dans la section &lt;code&gt;GitHub Pages&lt;/code&gt;, je choisi la branche dans laquelle est versionnée la version générée du blog&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FwcuzD8s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/gh-pages.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FwcuzD8s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/gh-pages.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Configuration de Github Pages&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A noter que la branche &lt;code&gt;gh-pages&lt;/code&gt; est la branche par défaut lors de l’utilisation du plugin &lt;a href="https://www.npmjs.com/package/gh-pages"&gt;gh-pages&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  D’un blog maison à Dev.to
&lt;/h2&gt;

&lt;p&gt;Là encore, rien de très compliqué.&lt;br&gt;&lt;br&gt;
Une fois son compte crée, il suffit de configurer son alimentation par un flux RSS.&lt;/p&gt;

&lt;p&gt;Pour cela, se rendre dans le menu &lt;code&gt;Settings &amp;gt; Publishing from RSS&lt;/code&gt;, puis y renseigner l’url du flux RSS généré par son blog personnel (par défaut, un blog Gatsby aura généré un fichier &lt;code&gt;rss.xml&lt;/code&gt; à la racine)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vIVVLUnC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/rss-dev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vIVVLUnC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/rss-dev.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Configuration de l’alimentation par flux RSS&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A partir de là, tous les articles de votre blog vont être importés dans &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;, et seront visible depuis le menu &lt;code&gt;dashboard&lt;/code&gt;. Par défaut, les articles sont importés en mode &lt;code&gt;draft&lt;/code&gt;, ce qui vous laissera le soin de valider la bonne importation, et éventuellement corriger les éventuelles différences.Par exemple, dans le cas d’import d’un tweet ou d’un gist, il existe &lt;a href="https://dev.to/p/editor_guide"&gt;une syntaxe particulière&lt;/a&gt; qu’il faudra adapter pour un rendu optimal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RYo3TFi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/frontmatter.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RYo3TFi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/hello-new-world/frontmatter.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Edition d’un post depuis &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dernier point important, verifier que le champ &lt;code&gt;canonical_url&lt;/code&gt; dans la configuration de votre post se réfère bien au post original sur votre blog.&lt;/p&gt;

&lt;p&gt;Et voila, en quelques heures, j’ai pu récupérer le contenu des mes anciens posts, créer et déployer un blog personnel pour les publier, et les syndiquer sur &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hello, new world.&lt;/p&gt;

</description>
      <category>blogging</category>
    </item>
    <item>
      <title>Retour sur Devoxx France 2018 - Les conférences les plus…</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Wed, 02 May 2018 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/retour-sur-devoxx-france-2018-les-conferences-les-plus-20o</link>
      <guid>https://forem.com/d3rwan/retour-sur-devoxx-france-2018-les-conferences-les-plus-20o</guid>
      <description>&lt;p&gt;La 7ème édition de Devoxx France (aka la conférence des développeurs passionnnés) s’est déroulée du 18 au 20 avril dernier. Voici mon retour sur les conférences les + …&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/NMW-2592/%23RetourAuxSources_:_%F0%9F%8D%AA_Les_cookies_HTTP"&gt;La plus gourmande 🍪&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/hsablonniere"&gt;Hubert Sablonnière&lt;/a&gt; nous présente le résultat de son enquête sur un des plus grands mystères du web actuel : les &lt;em&gt;cookies&lt;/em&gt; HTTP. Création de Lou Montulli, également créateur du navigateur en ligne de commande Lynx ou initiateur de la balise  et des gifs animés, le cookie est un protocole serveur/navigateur pour stocker un état côté client. Dans son talk, le speaker nous explique les pièges à éviter, et les bonnes pratiques à avoir pour sécuriser au maximum son application. Un *back to basics *à voir absolument quand on est pas à l’aise avec ces petites choses, élément fondateur du web actuel.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sg6j7KT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbI655DW4AAQTDn.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--k-4uEuC3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1214796079230787586/j7JOs5RA_normal.jpg" alt="Arnaud Héritier #AtHome profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Arnaud Héritier #AtHome
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @aheritier
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      On mange des 🍪 avec &lt;a href="https://twitter.com/hsablonniere"&gt;@hsablonniere&lt;/a&gt; à &lt;a href="https://twitter.com/hashtag/devoxxfr"&gt;#devoxxfr&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      10:34 AM - 19 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=986916041363206145" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=986916041363206145" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      1
      &lt;a href="https://twitter.com/intent/like?tweet_id=986916041363206145" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      9
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/LHA-6515/Let%E2%80%99s_Sketchnote_:_prise_de_notes_visuelle"&gt;La plus visuelle 🎨&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Dans leur quickie Let’s sketchnote, &lt;a href="https://twitter.com/ane_naiz"&gt;Ane Diaz&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/AmelieBenoit33"&gt;Amélie Benoit&lt;/a&gt; nous présente les bases de la prise de note visuelle. A priori accessible à tout ceux qui ont passé le CP, le &lt;em&gt;sketchnote&lt;/em&gt; consiste à utiliser des éléments de base tels que du texte ou des pictos, de les enrichir de flèches et de contenants, et d’agrémenter de couleur pour obtenir des compte-rendus uniques et créatifs. Et en plus ca favorise la concentration et la mémoire. On demande à voir nos oeuvres sans le talent des demoiselles, mais on ressort de là en ayant envie d’essayer. Un mini coup de coeur.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_v68qwKN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbO0LQEXUAAzlxp.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s---K0VJUOI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1223352051440193541/iHz4nZYZ_normal.jpg" alt="Amélie Benoit profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Amélie Benoit
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @ameliebenoit33
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Hi Sherlock ! &lt;a href="https://twitter.com/hashtag/Sketchnote"&gt;#Sketchnote&lt;/a&gt; sur la conférence à propos des cookies HTTP de &lt;a href="https://twitter.com/hsablonniere"&gt;@hsablonniere&lt;/a&gt; à &lt;a href="https://twitter.com/hashtag/DevoxxFR"&gt;#DevoxxFR&lt;/a&gt; 🍪&lt;br&gt;&lt;br&gt;Reprise des bases, questions autour de la sécurité, le tout très clair et ludique ! 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      14:03 PM - 20 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987330857051545600" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987330857051545600" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      28
      &lt;a href="https://twitter.com/intent/like?tweet_id=987330857051545600" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      65
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  La plus digitale 👋
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/EmmanuelPESENTI"&gt;Emmanuel Pesenti&lt;/a&gt; vient nous expliquer comment le programme #FrenchRoad doit permettre à la France de rattraper son immense retard numérique, avec notamment son projet de &lt;em&gt;carte à tout faire, *et de faire en sorte que la France devienne une *nation digitale européenne. *Cette keynote n’est finalement qu’une variante française (et digitale) de celle d’&lt;a href="https://twitter.com/arnocast"&gt;Arnaud Castanier&lt;/a&gt; la veille où ce dernier nous a expliqué comment l’Estonie, avec son programme e-resident est devenue une nation à la pointe du numérique, avec 32000 e-residents de 150 nations différentes, ainsi que 5000 entreprises, et même une e-ambassade. La nation digitale hexagonale a donc beaucoup de travail devant elle. *On se sort les doigts ?&lt;/em&gt;&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6P9uUhtB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/481937222137286656/BH3nAEeF_normal.jpeg" alt="Numérique, bordel ! profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Numérique, bordel !
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @numeriquebordel
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      On me dit dans l'oreillette que c'est plus de 10 fois en 31 min. &lt;br&gt;&lt;a href="https://twitter.com/DevoxxFR"&gt;@DevoxxFR&lt;/a&gt;, faites quelque chose ! Remplacez le mot par un bip, plaquez les orateurs au sol, peu importe. Juste faites quelque chose ! &lt;a href="https://twitter.com/hashtag/DevoxxFR"&gt;#DevoxxFR&lt;/a&gt; &lt;a href="https://t.co/DCIbQgTktA"&gt;twitter.com/adericbourg/st…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      07:34 AM - 20 Apr 2018
    &lt;/div&gt;

      &lt;div class="ltag__twitter-tweet__quote"&gt;
        &lt;div class="ltag__twitter-tweet__quote__header"&gt;
          &lt;span class="ltag__twitter-tweet__quote__header__name"&gt;
            Alban Dericbourg
          &lt;/span&gt;
          &lt;a class="comment-mentioned-user" href="https://dev.to/adericbourg"&gt;@adericbourg&lt;/a&gt;

        &lt;/div&gt;
        #DevoxxFR 
Durée nécessaire avant d'entendre parler de doigts / digital :
 — jeudi : 48 min 
 — vendredi : 24 min
      &lt;/div&gt;

    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987233102425665541" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987233102425665541" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      19
      &lt;a href="https://twitter.com/intent/like?tweet_id=987233102425665541" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      42
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/KTY-9125/Architecture_Realtime_Data_de_Dailymotion"&gt;La plus ironique 🤔&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Suite au rachat de Vivendi, Dailymotion a dû se réinventer. Un des axes de travail des équipes fût d’améliorer la partie recommandations, pour passer sur du temps réel. Dans ce talk, &lt;a href="https://twitter.com/philgiro?lang=fr"&gt;Philippe Girolami&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/didiergirard"&gt;Didier Girard&lt;/a&gt; nous présente comment, face à un timing court et des équipes en reconstruction, Dailymotion a choisi de passer d’une stack OSS en interne à la stack data cloud de Google, et les gains apportés par celle-ci. Quand bien même Google est également, avec Youtube, leur principe concurrent.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TNaXgauQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbO5938WsAEmbN7.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--f2FFq9Zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1144622835643703296/ocCvL2pH_normal.jpg" alt="Erwan Deruelle profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Erwan Deruelle
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/d3rwan"&gt;@d3rwan&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      « Architecture realtime data de Dailymotion » &lt;a href="https://twitter.com/hashtag/DevoxxFR"&gt;#DevoxxFR&lt;/a&gt; &lt;br&gt;Ou l’on apprend que Dailymotion utilise les technologies de son principal concurrent Google pour faire marcher son infra... Ironique ? 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      14:28 PM - 20 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987337236093030400" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987337236093030400" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=987337236093030400" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      0
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/THX-0000/Balade_au_pays_de_%C2%ABLet's_Encrypt%C2%BB"&gt;La plus sécuritaire 🔐&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Dans son talk, &lt;a href="https://twitter.com/fcabestre"&gt;Frédéric Cabestre&lt;/a&gt; repart des bases des clés publiques/privées et nous emmène sur les chemins des certificats et autres joyeusetés, pour enfin que nous puissions comprendre comment Let’s Encrypt a changé la donne dans le milieu des autorités de certifications. Des rappels utiles si vous avez déjà mis le nez dedans, à voir absolument pour les autres !&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5jiTksJ1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbJlLCZWAAE5d2Q.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--UQh7R3fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1047527816798130177/aorYnP1r_normal.jpg" alt="Guillaume Membré profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Guillaume Membré
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @guillaumemembre
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Merci &lt;a href="https://twitter.com/fcabestre"&gt;@fcabestre&lt;/a&gt; d'avoir éclairé ma lanterne sur l'automatisation des certificats 'let's encrypt' à &lt;a href="https://twitter.com/hashtag/devoxxfr2018"&gt;#devoxxfr2018&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      13:39 PM - 19 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=986962564126052358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=986962564126052358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      3
      &lt;a href="https://twitter.com/intent/like?tweet_id=986962564126052358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      4
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  La plus legacy (mais dans des conteneurs) 🚢
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/dgageot"&gt;David Gageot&lt;/a&gt; vient nous montrer comment faire tourner une application monolithique dans Docker, puis dans Kubernetes, en quelques lignes de Yaml. Dans un second temps, il va utiliser la puissance du pattern &lt;em&gt;Facade&lt;/em&gt; pour faciliter le décommissionnement ; notamment, comment l’utilisation du service mesh Istio peut nous faire gagner rapidement plein de fonctionnalités ultra puissante (monitoring, HTTPS everywhere, rate-limiting, déploiement blue/green, circuit-breaker) entre ses différents services exposés dans Kubernetes. Une présentation rudement menée qui donne envie de s’y mettre (quand bien même on ne fait pas de legacy) !&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zNZG71xr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbI_H_mXkAEITjW.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--X7YqH6TO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1224729033117749249/2upRBuNY_normal.jpg" alt="CANAL+ TECH 📺📱🎬 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        CANAL+ TECH 📺📱🎬
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @canaltechteam
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Retour à la tech : transformer une appli legacy avec &lt;a href="https://twitter.com/hashtag/Kubernetes"&gt;#Kubernetes&lt;/a&gt; et &lt;a href="https://twitter.com/hashtag/Istio"&gt;#Istio&lt;/a&gt; avec &lt;a href="https://twitter.com/dgageot"&gt;@dgageot&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/DevoxxFr"&gt;#DevoxxFr&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      10:53 AM - 19 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=986920712467251202" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=986920712467251202" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=986920712467251202" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      1
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/YTS-2643/Du_mutualisme_a_l'Open_Source"&gt;La plus mutualiste ⛩&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/chanksleroux?lang=fr"&gt;Alexandre Delègue&lt;/a&gt;, &lt;a href="https://twitter.com/trevorreznik?lang=fr"&gt;Matthieu Ancelin&lt;/a&gt; et &lt;a href="https://twitter.com/desmfr?lang=fr"&gt;Francois Desmie&lt;/a&gt;r nous racontent comment la MAIF a décidé de reconstruire son S.I de 0, et nous présenter les résultats de ce travail. Avec à la clé déjà 2 produits prometteurs open-sourcés, &lt;a href="https://maif.github.io/"&gt;Otoroshi &amp;amp; Izanami&lt;/a&gt;, une méthodologie et des principes forts symbolisés par des cartes à jouer, et encore plein de choses à faire. Un exemple à suivre ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/oss-by-maif/open-source-%C3%A0-la-maif-gen%C3%A8se-et-ambition-6e7b2bc3d93d"&gt;Open Source à la MAIF : genèse et ambition&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://cfp.devoxx.fr/2018/talk/WIW-5296/_Monitorer_l'inconnu,_1000_*_100_series_par_jour"&gt;La plus barbue 🎅🏻&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://twitter.com/waxzce"&gt;Quentin Adam&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/clementd"&gt;Clément Delafargue&lt;/a&gt;, C[E|T]O chez CleverCloud viennent nous parler de leurs expérimentations pour la mise en place de métriques sur leur plateforme. Les principales difficultés résultent de la méconnaissance des applications à superviser, et le volume potentiel de données à stocker, ils ont buttés sur la plupart des solutions du marché (InfluxDB, Prometheus) avant de découvrir Warp10. De leurs expérimentations sont ressorties la solution metrics en cours de déploiement chez Clever, ainsi que des projets open-source en collaboration avec OVH (poke.digital notamment). Et un utile rappel que, malgré la hype &lt;em&gt;#serverless&lt;/em&gt;, nous vivons toujours dans un monde plein de serveurs !&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CM0rXntA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DbPH3EcXkAU68zo.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--f2FFq9Zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1144622835643703296/ocCvL2pH_normal.jpg" alt="Erwan Deruelle profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Erwan Deruelle
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/d3rwan"&gt;@d3rwan&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Pour finir en beauté, &lt;a href="https://twitter.com/waxzce"&gt;@waxzce&lt;/a&gt; et &lt;a href="https://twitter.com/clementd"&gt;@clementd&lt;/a&gt; viennent nous expliquer comment monitorer l’inconnu. &lt;a href="https://twitter.com/hashtag/devoxxFR"&gt;#devoxxFR&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      15:29 PM - 20 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987352499500744704" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987352499500744704" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      1
      &lt;a href="https://twitter.com/intent/like?tweet_id=987352499500744704" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      10
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;a href="http://cfp.devoxx.fr/2018/talk/FON-7243/Pourquoi_vous_devriez_arreter_d'utiliser_les_field_injection"&gt;La plus personnelle 😊&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;J’ai eu le plaisir et l’honneur cette année encore d’être speaker à Devoxx France. Et j’en profite ici pour remercier les gens qui sont *derrière la scène *pour l’énorme travail qu’ils réalisent chaque année. Tout en espérant avoir convaincu mes spectateurs d’arrêter d’utiliser les injections par champ!&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--f2FFq9Zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1144622835643703296/ocCvL2pH_normal.jpg" alt="Erwan Deruelle profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Erwan Deruelle
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/d3rwan"&gt;@d3rwan&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Les slides de ma présentation "Pourquoi vous devriez arrêter les field injection" à &lt;a href="https://twitter.com/DevoxxFR"&gt;@DevoxxFR&lt;/a&gt; sont disponible ici : &lt;a href="https://t.co/kTUmrrtZ1h"&gt;speakerdeck.com/d3rwan/pourquo…&lt;/a&gt;&lt;br&gt; &lt;a href="https://twitter.com/hashtag/StopFieldInjection"&gt;#StopFieldInjection&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/DevoxxFR"&gt;#DevoxxFR&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      12:35 PM - 20 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987308718193827841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987308718193827841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      1
      &lt;a href="https://twitter.com/intent/like?tweet_id=987308718193827841" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      8
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Evidemment, ce retour ne peut être que partiel étant donné le nombre de talk auquel je n’ai pas assisté (sachant qu’on parle de 200 conférences sur 3 jours!), mais n’oubliez pas que l’ensemble des talks de cette année sont dès à présent &lt;a href="https://www.youtube.com/playlist?list=PLTbQvx84FrARa9pUtZYK7t_UfyGMCPOBn"&gt;disponible en ligne&lt;/a&gt;.Et à l’année prochaine! 😉&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jsv3eSCq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1201133634830393345/LdIBRIZ-_normal.jpg" alt="DevoxxFR profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        DevoxxFR
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @devoxxfr
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Save the date. &lt;a href="https://twitter.com/hashtag/devoxxfr"&gt;#devoxxfr&lt;/a&gt; 2019 aura lieu les 17, 18 et 19 avril 2019
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      06:44 AM - 20 Apr 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=987220513952010241" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=987220513952010241" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      70
      &lt;a href="https://twitter.com/intent/like?tweet_id=987220513952010241" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      92
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


</description>
      <category>conference</category>
      <category>devoxxfr</category>
    </item>
    <item>
      <title>Régnez sur vos APIs avec Kong</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Sat, 11 Feb 2017 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/regnez-sur-vos-apis-avec-kong-179p</link>
      <guid>https://forem.com/d3rwan/regnez-sur-vos-apis-avec-kong-179p</guid>
      <description>&lt;p&gt;&lt;a href="https://www.mashape.com/" rel="noopener noreferrer"&gt;Mashape&lt;/a&gt; est un catalogue public d’API, permettant à ses utilisateurs de partager ses APIs ou d’utiliser celle des autres. Afin de sécuriser et gérer ces quelques 15000 micro-services présents dans leur catalogue, Mashape a crée &lt;a href="https://getkong.org/" rel="noopener noreferrer"&gt;Kong&lt;/a&gt;, une solution d’API management.&lt;/p&gt;

&lt;p&gt;Kong est une solution open-source basée sur NGinx, qui permet de répondre aux contraintes des milliards de requêtes par mois que doit gérer Mashape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Fmodules.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Fmodules.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kong s’appuie également sur une base de données Cassandra (possibilité d’utiliser PostgreSQL), ainsi que sur un ensemble de plug-ins. Par défaut, la solution offre déjà un socle de modules permettant l’authentification, la sécurité, le rate-limiting ou encore la supervision. Il vous sera également possible si besoin de créer vos propres plug-in (cf. &lt;a href="https://getkong.org/plugins/" rel="noopener noreferrer"&gt;la documentation officielle&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Dans votre infrastructure, l’API manager se place en amont des services à exposer (approche reverse-proxy), et prendra en charge les fonctionnalités que vous lui déléguez. Dès lors, chacun de vos services métiers n’aura plus à gérer ces taches techniques et pourra se concentrer sur son coeur métier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Farchi-wo-kong.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Farchi-wo-kong.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Farchi-w-kong.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd3rwan.github.io%2Fd3rwan-blog%2Fmedia%2Fkong%2Farchi-w-kong.png" alt="Architecture Legacy vs. Architecture orientée API"&gt;&lt;/a&gt;&lt;em&gt;Architecture Legacy vs. Architecture orientée API&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alors, que vous deviez gérer un ensemble de micro-services, une API qui commence à devenir populaire ou simplement un backend web/mobile, il est peut-être temps de commencer à gérer vos APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Dans cette partie, nous utiliserons comme API partenaire celle exposée par le site &lt;a href="http://anapioficeandfire.com/" rel="noopener noreferrer"&gt;http://anapioficeandfire.com/&lt;/a&gt; et qui expose les données relatives à l’univers de Game of Thrones.&lt;/p&gt;

&lt;p&gt;Pour déployer Kong, nous utiliserons des conteneurs Docker &lt;em&gt;orchestrés&lt;/em&gt; par docker-compose. La configuration de la stack est la suivante :&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Démarrer la stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depuis le répertoire contenant le fichier docker-compose.yml décrit précédemment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # run (daemon)
    docker-compose up -d
    # show logs
    docker-compose logs -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une fois la stack démarrée, nous pouvons accéder à ses différents composants&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;localhost si vous utilisez Docker sous Mac ou Linux, l’adresse de docker-machine sinon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;API Manager - localhost:8001&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API grâce à laquelle nous allons administrer Kong&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;API Gateway - localhost:8000&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API grâce à laquelle nous accéderons à nos API&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Kong Dashboard - localhost:8080&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IHM open-source qui utilise l’API d’administration afin d’offrir une interface d’administration&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;A présent, nous allons pouvoir utiliser notre API manager.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dans la suite de l’article, nous directement l’API via des appels REST, mais nous pourrions également utiliser l’IHM de Kong Dashboard pour configurer Kong&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Créer une API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X POST http://localhost:8001/apis/ \
 --data 'name=GOT' \
 --data 'upstream_url=http://anapioficeandfire.com/api/' \
 --data 'request_path=/got/' \
 --data 'preserve_host=false'\
 --data 'strip_request_path=true'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On crée une API qu’on appelle &lt;em&gt;GOT&lt;/em&gt; et qui pointe vers notre API partenaire, sur le path &lt;em&gt;/got/&lt;/em&gt; de notre API gateway. On peut désormais y accéder via l’API gateway&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X GET http://localhost:8000/got/characters/583
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Activer l’authentification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X POST http://localhost:8001/apis/GOT/plugins/ \
  --data 'name=key-auth' \
  --data 'config.key_names=apiKey'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On associe le plugin &lt;a href="https://getkong.org/plugins/key-authentication/" rel="noopener noreferrer"&gt;key-auth&lt;/a&gt; de Kong à notre API qui ne sera donc plus accessible sans token d’authentification&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X GET http://localhost:8000/got/characters/583
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ajouter un utilisateur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X POST http://localhost:8001/consumers/ \
  --data "username=erwan"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Autoriser ce nouvel utilisateur à accéder à l’API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X POST http://localhost:8001/consumers/erwan/key-auth \
  --data "key=secret"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notre API est donc bien sécurisée, et seulement accessible avec la clé d’authentification&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X GET [http://localhost:8000/got/characters/583](http://localhost:8000/got/characters/583)
curl -i -X GET [http://localhost:8000/got/characters/583](http://localhost:8000/got/characters/583)?apiKey=secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Activer le &lt;a href="https://getkong.org/plugins/rate-limiting/" rel="noopener noreferrer"&gt;rate-limiting&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST http://localhost:8001/apis/GOT/plugins \
  --data "name=rate-limiting" \
  --data "config.hour=2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notre API est à présent limitée à 2 appels par heure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret
curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret
curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L’accès à notre API peut à présent se faire via notre API manager après seulement quelques minutes de configuration. Grâce à Kong, on pourra par la suite ajouter des contraintes d’accès, des règles de réécriture de requêtes ou encore du monitoring sans devoir modifier notre coeur métier, ou demander à nos partenaires de le faire.&lt;/p&gt;

&lt;p&gt;N’hésitez pas non plus à parcourir le site de Kong, et sa documentation plutôt complète pour voir tout ce qu’il pourrait faire pour vous.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getkong.org/" rel="noopener noreferrer"&gt;Site officiel - https://getkong.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Par ailleurs, vous pourrez retrouver la configuration décrite précédemnt directement &lt;a href="https://github.com/d3rwan/kong_docker_stack" rel="noopener noreferrer"&gt;sur ce repo github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et devenez le &lt;em&gt;king&lt;/em&gt; de vos API’s!&lt;/p&gt;

</description>
      <category>kong</category>
      <category>apimanagement</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Yarn, un n-ième package-manager ?</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Thu, 10 Nov 2016 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/yarn-un-n-ieme-package-manager-hch</link>
      <guid>https://forem.com/d3rwan/yarn-un-n-ieme-package-manager-hch</guid>
      <description>&lt;p&gt;Npm, Bower, JSPM… A chaque saison son nouveau package-manager dans l’écosystème JS. Le dernier né, Yarn, a été annoncé il y a quelques semaines par les développpeurs de Facebook. Alors, qu’est-ce que se cache vraiment derrière ce n-ième package-manager ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.facebook.com/posts/1840075619545360"&gt;Yarn: A new package manager for JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En premier lieu, Yarn n’a pas l’objectif de remplacer npm ou bower. Il s’agit avant-tout d’un nouveau client ligne de commande permettant la récupération de dépendances depuis le registry npm.&lt;/p&gt;

&lt;p&gt;Il propose en outre les améliorations suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; Optimisation des appels et maximisation de l’utilisation réseau, notamment via un mécanisme d’analyse de l’arbre des dépendances et de parallélisation des requêtes (vs. en série pour npm)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Déterministe&lt;/strong&gt; Pour un même projet, les mêmes dépendances seront installées de la même manière sur tous les environnements (plus d’effet &lt;em&gt;“ it works on my machine”&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fonctionnement offline&lt;/strong&gt; Une fois un package installé, il est mis en cache et pourra être installé ensuite sans connexion internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Résilience&lt;/strong&gt; Le processus d’installation est plus robuste, notamment dans le cas de coupure réseau (rejeu des requêtes vs. processus d’installation en erreur)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registre multiple&lt;/strong&gt; Possibilité de récupérer des sources depuis plusieurs registres (npm, bower, github, …)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sécurité&lt;/strong&gt; Utilisation de checksums pour vérifier l’intégrité des dépendances&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mise en place
&lt;/h2&gt;

&lt;p&gt;Pour installer Yarn, le plus simple est encore d’utiliser… npm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g yarn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Dès lors, on peut utiliser le client yarn en lieu et place du client npm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# npm install
yarn

# npm init
yarn init

# npm install angular --save
yarn add angular 

# npm install gulp --global
yarn global agg gulp

# npm uninstall angular --save
yarn remove angular

# npm install angular-mocks --save-dev
yarn add angular-mocks --dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wNidzaGu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/yarn_loading.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wNidzaGu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/yarn_loading.gif" alt="Installation avec Yarn"&gt;&lt;/a&gt;&lt;em&gt;Installation avec Yarn&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pour le reste, on continue d’utiliser le fichier &lt;em&gt;package.json&lt;/em&gt; pour lister les dépendances d’un projet, dépendances qui seront toujours stockées dans le répertoire &lt;em&gt;node_modules&lt;/em&gt;. Yarn ajoute néanmoins un nouveau fichier &lt;em&gt;yarn.lock&lt;/em&gt;. C’est ce fichier qui va garantir l’installation déterministe, puisqu’il va lister chaque dépendance, la version exacte à utiliser, l’ordre d’installation etc… Ce fichier sera crée lors de la première installation par Yarn, puis mis à jour ensuite lors de chaque modification.&lt;/p&gt;

&lt;p&gt;Il est important de noter que ce fichier doit &lt;strong&gt;être présent sur chaque environnement&lt;/strong&gt; afin de garantir une installation &lt;strong&gt;déterministe&lt;/strong&gt; , et donc qu’il &lt;strong&gt;doit être versionné&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Et les perfs dans tout ca ? Sur un benchmark sur le site de Yarn (donc probablement hyper objectif), les chiffres sont là. C’est &lt;em&gt;vachement&lt;/em&gt; plus rapide dans la plupart des cas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BRyzb6vM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/bench.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BRyzb6vM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/bench.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TDeUnGqN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/bench2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TDeUnGqN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/bench2.png" alt="Benchmark NPM / YARN (source: [https://yarnpkg.com/en/compare](https://yarnpkg.com/en/compare))"&gt;&lt;/a&gt;&lt;em&gt;Benchmark NPM / YARN (source: &lt;a href="https://yarnpkg.com/en/compare"&gt;https://yarnpkg.com/en/compare&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Et en réalité ?&lt;/p&gt;

&lt;p&gt;Pour comparer les performance entre les deux outils, j’ai utilisé l’utilitaire &lt;a href="https://www.npmjs.com/package/npmvsyarn"&gt;npmvsyarn&lt;/a&gt; qui permet de comparer pour une librairie ou un projet (contenant un &lt;em&gt;package.json&lt;/em&gt;) donnés les performances entre l’utilisation de npm &amp;amp; celle de Yarn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dy3a50Xp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dy3a50Xp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex.png" alt="Exemple avec les librairies Angular &amp;amp; React"&gt;&lt;/a&gt;&lt;em&gt;Exemple avec les librairies Angular &amp;amp; React&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Concernant l’ajout/suppression d’une librairie seule, Yarn est effectivement plus rapide (jusqu’à 50%), en particulier lorsque le cache et le fichier yarn.lock existe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ifKxQMjv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ifKxQMjv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lSErNioV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lSErNioV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/yarn/ex3.png" alt="Exemple avec un projet React ([redux-webpack-es6-boilerplate](https://github.com/nicksp/redux-webpack-es6-boilerplate)) et un projet Angular ([angular1.4-ES6-material-webpack-boilerplate](https://github.com/shprink/angular1.4-ES6-material-webpack-boilerplate))"&gt;&lt;/a&gt;&lt;em&gt;Exemple avec un projet React (&lt;a href="https://github.com/nicksp/redux-webpack-es6-boilerplate"&gt;redux-webpack-es6-boilerplate&lt;/a&gt;) et un projet Angular (&lt;a href="https://github.com/shprink/angular1.4-ES6-material-webpack-boilerplate"&gt;angular1.4-ES6-material-webpack-boilerplate&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sur un projet complet, Yarn s’en sort mieux également (jusqu’à 2.5 fois plus rapide). Là encore, on voit que la présence du cache et du &lt;em&gt;yarn.lock&lt;/em&gt; améliore d’autant plus les performances.&lt;/p&gt;

&lt;p&gt;Bien évidemment, ces exemples sont trop limités pour être représentatifs. Néanmoins, le site &lt;em&gt;berriart.com&lt;/em&gt; propose un benchmark plus complet des deux outils sur différents environnements d’intégration continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.berriart.com/blog/2016/10/npm-yarn-benchmark/"&gt;NPM vs Yarn benchmark&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Là encore, les résultats vont dans le même sens:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Yarn est entre 2x et 3x plus rapide que npm&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Après quelques heures d’utilisation, Yarn semble répondre aux attentes qu’il a suscité: plus rapide que npm, avec des fonctionnalités équivalentes, et une migration sans heurts.&lt;/p&gt;

&lt;p&gt;Bien qu’il soit sans doute peut-être un peu tôt pour l’utiliser sur un projet structurant en production, il semble dès aujourd’hui être une alternative crédible au client npm par défaut. On pourra donc facilement l’utiliser sur un nouveau projet ou un projet annexe, afin de confirmer toutes les bonnes prédispositions affichées.&lt;/p&gt;

&lt;p&gt;Quant au futur, on ne peut qu’espérer qu’il permette l’amélioration de l’existant, que se soit en poussant à l’amélioration de npm ou en devenant un standard defacto. A moins qu’un petit-nouveau n’arrive d’ici là, et change encore la donne…&lt;/p&gt;

</description>
      <category>yarn</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Une stack ELK from scratch avec Docker</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Wed, 28 Sep 2016 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/une-stack-elk-from-scratch-avec-docker-5gp6</link>
      <guid>https://forem.com/d3rwan/une-stack-elk-from-scratch-avec-docker-5gp6</guid>
      <description>&lt;p&gt;Ou comment déployer une architecture de monitoring en quelques minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mo-ni-to-rer
&lt;/h2&gt;

&lt;p&gt;En quelques années, le monitoring est devenu une activité indispensable dans le monde de l’IT. Qu’il soit technique ou fonctionnel, qu’il fournisse des métriques, charts, ou autres KPI, le monitoring de son système est devenu un must-have.&lt;/p&gt;

&lt;p&gt;Dans la suite de l’article, nous allons voir comment déployer une architecture de monitoring à partir de zéro, en quelques minutes, grâce à Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  La stack
&lt;/h2&gt;

&lt;p&gt;Pour commencer, nous nous appuyerons sur la stack &lt;strong&gt;&lt;em&gt;ELK&lt;/em&gt;&lt;/strong&gt; qui, en quelques années, est devenue une alternative crédible aux autres solutions de monitoring (Splunk, solutions SAAS…).&lt;/p&gt;

&lt;p&gt;Elle se compose des éléments suivants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E&lt;/strong&gt; comme &lt;em&gt;Elasticsearch&lt;/em&gt;, le moteur d’indexation, de recherche &amp;amp; d’analytics,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt; comme &lt;em&gt;Logstash&lt;/em&gt;, un ETL permettant de récupérer les données dans des sources hétérogènes, les transformer et les envoyer vers Elasticsearch,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;K&lt;/strong&gt; comme &lt;em&gt;Kibana&lt;/em&gt;, un IHM de visualisation et de générations de tableaux de bord interactifs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous ajouterons également :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt; comme *Redis, *utilisé comme broker en amont, qui servira de buffer en cas de latence du système, tout en évitant un engorgement trop important en cas de pic,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; comme &lt;em&gt;Curator&lt;/em&gt;, un outil de management des indexs&lt;/li&gt;
&lt;li&gt;**B *&lt;em&gt;comme *Beats&lt;/em&gt;, sondes à installer côté client afin d’envoyer les logs/métriques à notre stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hdv6Mdhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/stack-elk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hdv6Mdhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/stack-elk.jpeg" alt="Stack de monitoring"&gt;&lt;/a&gt;&lt;em&gt;Notre stack de monitoring&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Déploiement
&lt;/h2&gt;

&lt;p&gt;Nous utiliserons des conteneurs Docker pour chacun des composants de notre stack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/elasticsearch/"&gt;Elasticsearch&lt;/a&gt;, dans sa version 5.1.2,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/logstash/"&gt;Logstash&lt;/a&gt;, dans sa version 5.1.2,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/kibana/"&gt;Kibana&lt;/a&gt;, dans sa version 5.1.2,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/redis/"&gt;Redis&lt;/a&gt;, dans sa version 3.2.6,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/bobrik/curator/"&gt;Curator&lt;/a&gt;, dans sa version 4.0.4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’ensemble des services et des interactions sont décrites dans un fichier docker-compose.yml:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pour chacun des services, on va définir si besoin les ports à exposer ou les volumes à utiliser (notamment les fichiers de configuration). Un exemple de configuration viable est disponible sur mon compte github : &lt;a href="https://github.com/d3rwan/docker_elk_stack"&gt;docker_elk_stack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello, world
&lt;/h2&gt;

&lt;p&gt;En se basant sur ce repository, nous allons déployer une stack fonctionnelle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# clone repo &amp;amp; build images
git clone [https://github.com/d3rwan/docker_elk_stack](https://github.com/d3rwan/docker_elk_stack)
cd docker_elk_stack
docker-compose build

# run (daemon)
docker-compose up -d

# show logs
docker-compose logs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Une fois les différents composants démarrés, vous devriez pouvoir accéder à l’interface Kibana (port 5601).&lt;/p&gt;

&lt;p&gt;Puis nous allons lancer un example d’application web (site HTML statique exposé par Nginx, ainsi qu’une sonde FileBeat permettant l’envoi des logs vers notre stack ELK)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# build image
docker build ./webapp -t dockerelkstack_webapp

# run (daemon)
docker run --network dockerelkstack_logging --link redis:redis -p 80:80 -d --name webapp dockerelkstack_webapp

# show logs
docker logs webapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Une fois notre composant démarré, vous devriez pouvoir accéder à l’application web (port 80).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" alt="Exemple d’application web"&gt;&lt;/a&gt;&lt;em&gt;Exemple d’application web (source: &lt;a href="https://github.com/sbilly/joli-admin"&gt;https://github.com/sbilly/joli-admin&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Après avoir navigué quelques minutes, en retournant sur l’IHM de Kibana, un index logstash-* est à présent disponible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F60H8N3w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/configure-pattern.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F60H8N3w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/configure-pattern.png" alt="Configuration pattern d'index"&gt;&lt;/a&gt;&lt;em&gt;Kibana : écran de configuration d’un pattern d’index (ici, l’index logstash-* est détecté)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Après avoir crée notre pattern d’index, nous pouvons à présent naviguer dans les logs de notre application web (onglet &lt;em&gt;Discover&lt;/em&gt;), créer des visualisations (onglet &lt;em&gt;Visualize&lt;/em&gt;) et des tableaux de bord (onglet &lt;em&gt;Dashboard&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMnBnxui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/response.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMnBnxui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/response.png" alt="Kibana: données brutes"&gt;&lt;/a&gt;&lt;em&gt;Kibana: Visualisation brute des logs de notre application web&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qdF-4Gx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/analytics.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qdF-4Gx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/analytics.png" alt="Kibana: tableau de bord analytique"&gt;&lt;/a&gt;&lt;em&gt;Kibana: Tableau de bord analytique&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And… voilà! Nous avons donc mis en place, en quelques minutes seulement, une stack de supervision opérationnelle.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>elk</category>
      <category>elasticsearch</category>
      <category>kibana</category>
    </item>
    <item>
      <title>An ELK stack from scratch, with Docker</title>
      <dc:creator>Erwan Deruelle</dc:creator>
      <pubDate>Wed, 28 Sep 2016 12:00:00 +0000</pubDate>
      <link>https://forem.com/d3rwan/an-elk-stack-from-scratch-with-docker-ofh</link>
      <guid>https://forem.com/d3rwan/an-elk-stack-from-scratch-with-docker-ofh</guid>
      <description>&lt;p&gt;Or how to deploy a complete monitoring architecture in few minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor
&lt;/h2&gt;

&lt;p&gt;In few years, monitoring has become an indispensable activity in the IT world. Technical or functional, whether it provides metrics, charts, or other KPIs, monitoring its system has become a must-have.&lt;/p&gt;

&lt;p&gt;In the rest of the article, we will learn how to deploy a monitoring architecture from scratch, in few minutes, thanks to Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;First off, we will use the ELK stack, which has become in a few years a credible alternative to other monitoring solutions (Splunk, SAAS …).&lt;/p&gt;

&lt;p&gt;It is based on the following software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E&lt;/strong&gt; as &lt;em&gt;Elasticsearch&lt;/em&gt;, search engine which provide full text search &amp;amp; analytics,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt; as &lt;em&gt;Logstash&lt;/em&gt;, an ETL for retrieving data from heterogeneous sources, transforming them and sending them to &lt;em&gt;Elasticsearch&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;K&lt;/strong&gt; as &lt;em&gt;Kibana&lt;/em&gt;, which provide an UI for exploring data, and create interactive dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But also :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt; as *Redis, *an upstream broker which will serve as buffer in case of latency of the system, while avoiding excessive congestion in case of a peak,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; as &lt;em&gt;Curator&lt;/em&gt;, a tool to manage our index&lt;/li&gt;
&lt;li&gt;**B *&lt;em&gt;as *Beats&lt;/em&gt;, client-side agent to send the logs/metrics to our stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hdv6Mdhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/stack-elk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hdv6Mdhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/stack-elk.jpeg" alt="The complete architecture"&gt;&lt;/a&gt;&lt;em&gt;The complete architecture&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy
&lt;/h2&gt;

&lt;p&gt;We will use Docker containers for each stack component.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/elasticsearch/"&gt;Elasticsearch&lt;/a&gt; (5.1.2),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/logstash/"&gt;Logstash&lt;/a&gt; (5.1.2),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/kibana/"&gt;Kibana&lt;/a&gt; (5.1.2),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/_/redis/"&gt;Redis&lt;/a&gt; (3.2.6),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hub.docker.com/r/bobrik/curator/"&gt;Curator&lt;/a&gt; (4.0.4)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Services and interactions are described in a docker-compose.yml file:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;A viable configuration is also available on my github account : &lt;a href="https://github.com/d3rwan/docker_elk_stack"&gt;docker_elk_stack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello, world
&lt;/h2&gt;

&lt;p&gt;Based on this repository, we will deploy a functional stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# clone repo &amp;amp; build images
git clone [https://github.com/d3rwan/docker_elk_stack](https://github.com/d3rwan/docker_elk_stack)
cd docker_elk_stack
docker-compose build

# run (daemon)
docker-compose up -d

# show logs
docker-compose logs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After startup, you should be able to access Kibana (port 5601).&lt;/p&gt;

&lt;p&gt;Then, we will deploy a basic example web app (NGinx serving HTML + Filebeat agent to send log in our stack)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# build image
docker build ./webapp -t dockerelkstack_webapp

# run (daemon)
docker run --network dockerelkstack_logging --link redis:redis -p 80:80 -d --name webapp dockerelkstack_webapp

# show logs
docker logs webapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After startup, you should be able to access the web app (port 80).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ef7zqoWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/joliadmin.png" alt="Example web app capture (source: [https://github.com/sbilly/joli-admin](https://github.com/sbilly/joli-admin))"&gt;&lt;/a&gt;&lt;em&gt;Example web app capture (source: &lt;a href="https://github.com/sbilly/joli-admin"&gt;https://github.com/sbilly/joli-admin&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After few minutes browsing, returning to Kibana. An index (logstash-*) is now available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F60H8N3w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/configure-pattern.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F60H8N3w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/configure-pattern.png" alt="Kibana: Index pattern configuration screen (here, logstash-\* index is available)"&gt;&lt;/a&gt;&lt;em&gt;Kibana: Index pattern configuration screen (here, logstash-* index is available)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After creating index, we can now exploring our web app logs (Discover tab), create visualizations (Visualize tab) and dashboards (Dashboard tab).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMnBnxui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/response.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMnBnxui--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/response.png" alt="Kibana: Exploring the raw logs"&gt;&lt;/a&gt;&lt;em&gt;Kibana: Exploring the raw logs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qdF-4Gx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/analytics.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qdF-4Gx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d3rwan.github.io/d3rwan-blog/media/elk/analytics.png" alt="Kibana: Analytic dashboard"&gt;&lt;/a&gt;&lt;em&gt;Kibana: Analytic dashboard&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And… voilà! In just few minutes, we set up, an operational monitoring stack.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>elk</category>
      <category>elasticsearch</category>
      <category>kibana</category>
    </item>
  </channel>
</rss>
