<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aurélien Hébert, Author at OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/author/aurelien-hebert/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/author/aurelien-hebert/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Fri, 08 Jan 2021 10:54:57 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>Aurélien Hébert, Author at OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/author/aurelien-hebert/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Erlenmeyer and PromQL compatibility</title>
		<link>https://blog.ovhcloud.com/erlenmeyer-and-promql-compatibility/</link>
		
		<dc:creator><![CDATA[Aurélien Hébert]]></dc:creator>
		<pubDate>Wed, 16 Dec 2020 11:03:27 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Time series]]></category>
		<guid isPermaLink="false">https://www.ovh.com/blog/?p=20123</guid>

					<description><![CDATA[Today in the monitoring world, we see the rise of the Prometheus tool. It&#8217;s a great tool to deploy in your infrastructure, as it allows you to scrap all of your servers or applications to retrieve, store and analyze the metrics. And all you have to do is to extract and run it, it does [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Ferlenmeyer-and-promql-compatibility%2F&amp;action_name=Erlenmeyer%20and%20PromQL%20compatibility&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p>Today in the monitoring world, we see the rise of the <a href="https://prometheus.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Prometheus</a> tool. It&#8217;s a great tool to deploy in your infrastructure, as it allows you to scrap all of your servers or applications to retrieve, store and analyze the metrics. And all you have to do is to extract and run it, it does all the work by itself. Of course, Prometheus comes with some trade-offs (pull, how to handle late ingestion), and some limits, as you have your data only for a couple of days.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://www.ovh.com/blog/wp-content/uploads/2020/12/IMG_0404-1024x537.png" alt="Erlenmeyer and PromQL compatibility" class="wp-image-20266" width="512" height="269" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0404-1024x537.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0404-300x157.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0404-768x403.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0404.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></figure></div>



<h2 class="wp-block-heading">Context</h2>



<p>How is it possible to handle Prometheus long-time storage? A vast amount of Time Series DataBase are now fully compatible with Prometheus. It&#8217;s easy to check that Prometheus ingest is working well, however, how can we validate the PromQL &#8211; or Prometheus queries &#8211; part? A few months ago, <a href="https://promlabs.com/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">PromLab</a> released a new tool called &#8220;<a href="https://github.com/promlabs/promql-compliance-tester" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">PromQL compliance tester</a>&#8220;. They recently created <a href="https://promlabs.com/promql-compliance-tests" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">this page</a> where they reference the result of several products PromQL compliance tests. On this blog post, we will see how this tool helps us improve our PromQL implementation. </p>



<h3 class="wp-block-heading">Compliance tester</h3>



<p>The <a href="https://github.com/promlabs/promql-compliance-tester" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">PromQL compliance tester</a> is open source and contains a full set of tests. When using this tool, it generates for you around 500 PromQL queries covering the vast majority of the language. It includes tests on simple scalar, selectors, time range functions, operators, and so on. This tool will execute a request on both a Prometheus instance and the tested backend. It will then expect you to get the same result as PromQL output. It expects an exact match for all metadata of a series (tags and names). It&#8217;s more flexible for the ticks as you can set a parameter to round your check at the milliseconds. Finally, the compliance tool checks the equality of both query values, as many things can impact the floating predictability, it computes an approximated equality. </p>



<h3 class="wp-block-heading">Erlenmeyer</h3>



<p>At Metrics, we used a <a href="https://warp10.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Warp10</a> TSDB with it&#8217;s own analytical query engine <a href="https://warp10.io/content/03_Documentation/04_WarpScript" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">WarpScript</a>. We decided to build an open source tool to transpile PromQL queries into WarpScript called <a href="https://github.com/ovh/erlenmeyer" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Erlenmeyer</a>. This compliance tester was a great help to validate some of our implementation and to detect which query were not fully ISO.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="573" height="295" src="https://www.ovh.com/blog/wp-content/uploads/2020/12/IMG_0406.png" alt="Erlenmeyer and PromQL compatibility" class="wp-image-20265" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0406.png 573w, https://blog.ovhcloud.com/wp-content/uploads/2020/12/IMG_0406-300x154.png 300w" sizes="(max-width: 573px) 100vw, 573px" /></figure></div>



<h3 class="wp-block-heading">Set up</h3>



<p>To start testing our PromQL experience, we set up a local Prometheus with a default configuration. This configuration makes Prometheus run and collect some &#8220;Demo&#8221; Metrics, then we forwarded all of them to one of our Metrics regions using Prometheus remote write. We added a local instance of Erlenmeyer to query the data stored in a distributed Warp10 backend. Then, we iterated on each set of tests of the PromLab compliance tool to identify all issues and improved our existing PromQL implementation. </p>



<p>To be compliant, we had to reduce the precision for the value of the compliance tool. We set the precision to <code>0.001</code> instead of <code>0.00001</code>. We also had to remove the Warp10 <code>.app</code> label from the result. As on Warp10 instance, we identify users based on this <code>.app</code> label.</p>



<h3 class="wp-block-heading">A test query</h3>



<p>When running the test, you will get a full report of your failing queries. Let&#8217;s take an example:</p>



<pre class="wp-block-code"><code class="">RESULT: FAILED: Query returned different results:
  model.Matrix{
  	&amp;{
  		Metric: Inverse(DropResultLabels, s`{instance="demo.promlabs.com:10002", job="demo"}`),
  		Values: []model.SamplePair{
  			... // 52 identical elements
  			{Timestamp: s"1606323726.058", Value: Inverse(TranslateFloat64, float64(2.6928936527e+10))},
  			{Timestamp: s"1606323736.058", Value: Inverse(TranslateFloat64, float64(2.691644054725e+10))},
  			{
  				Timestamp: s"1606323746.058",
- 				Value:     Inverse(TranslateFloat64, float64(2.6922272529119648e+10)),
+ 				Value:     Inverse(TranslateFloat64, float64(2.689432207325e+10)),
  			},
  			{Timestamp: s"1606323756.058", Value: Inverse(TranslateFloat64, float64(2.6915188293125e+10))},
  			{Timestamp: s"1606323766.058", Value: Inverse(TranslateFloat64, float64(2.69215848005e+10))},
  			... // 4 identical elements
  		},
  	},
  }</code></pre>



<p>The test reports includes all errors occurring during the test. In this example, we can see, that for a single series we have 56 correct values. However one is invalid, we see it on two lines. The first one is the one starting by &#8220;-&#8220;. This stands for the expected value. And the second one starting by a &#8220;+&#8221; corresponds to the tested instance value. In this case, the value isn&#8217;t precise enough (2.68 instead of 2.69).</p>



<h2 class="wp-block-heading">Results</h2>



<p>Now that we have a full test set-up running, we can see what we improved from its results. If you want to access the full detailed fixes, you can check the code update made <code><a href="https://github.com/ovh/erlenmeyer/pull/48" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">here</a></code>. This tool helped us to fix some implementation, sanitize known issues, to know what PromQL features we missed, and detect a few new bugs! Let&#8217;s review the change.</p>



<h3 class="wp-block-heading">Quick implementation fixes</h3>



<p>Running those test was a great help for us to understand some of implementations errors we had when trying to match PromQL behavior. For example, the time range function was sampling before computing the operation. Reversing those steps provided us a direct match with a native query. It also helped us also fix some minor bugs on how to handle the comparison operators or multiple functions as label_replace, holt_winters, predict_linear or the full set of time functions (hour, minute, month&#8230;). </p>



<p>We improved also our handling of PromQL operator aggregators : by and without. </p>



<h3 class="wp-block-heading">Sanitize known issues</h3>



<p>We discovered recently, that we were not matching PromQL behavior on the series name. As a result we were keeping the name for all compute operations. Prometheus has, however, a different approach as the name is only kept when it&#8217;s relevant. The compliance tester helps us on how to validate this specific update for all queries. </p>



<p>With this tool, we test the validity of a query compared to a native PromQL query, it helps us to sanitize our query output. We knew that, in case of missing values or empty series, we were not ISO compliant. We have corrected the part of the Erlenmeyer software handling the output to match all PromQL cases included in the tests.</p>



<h3 class="wp-block-heading">Unimplemented features</h3>



<p>Running the test, lead us to discover that we missed some PromQL native features. As a matter of fact, Erlenmeyer now supports the PromQL unary or the &#8220;bool&#8221; keywords. The support of unary allows the use of &#8220;-my_series&#8221; for example. In PromQL, the bool keywords convert the result to booleans. It returns as series values 1 or 0 depending on the condition, where 1 stands for true and zero for false.</p>



<h3 class="wp-block-heading">Open issues</h3>



<p>Running all compliance tests and improving our code base lead to us to around 91% of success. For the rest, we open <a href="https://github.com/ovh/erlenmeyer/issues" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">new issues</a> on Erlenmeyer, we detected that: </p>



<ul class="wp-block-list"><li>the handling of the over_time function is not correct when the range is below the data point frequency,</li><li>rate, delta, increase and predict_linear, our result isn&#8217;t precise enough to match PromQL output when then the range is below 5 minutes,</li><li>some minor bugs on series selector (!=), or on the label_replace (some checks are missing on parameters validators),</li><li>the PromQL subqueries, as well as, some functions are not implemented: ^ and % on two series set and the deriv function.</li></ul>



<p>Those are the 4 missing points to cover the full PromQL feature set with Erlenmeyer. Our <a href="https://github.com/ovh/erlenmeyer/blob/master/doc/promql.md" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">documentation</a> already contained all the missing implementations. </p>



<h2 class="wp-block-heading">Actions</h2>



<p>This tool was a great help to improve our PromQL compliance and we are happy with our compliance result. Indeed we reach 91% with the provided test result:  </p>



<pre class="wp-block-code"><code class="">General query tweaks:
*  Metrics test
================================================================================
Total: 496 / 541 (91.68%) passed</code></pre>



<p>Our next action, is to release those fixes and improvements on all our Metrics regions. Looking forward to see what you think about our PromQL implementation! </p>



<p>We now see a lot of projects are implementing Prometheus writes and reads. These projects bring Prometheus a lot of missing features like long-term storage, delete, late ingestion, historical data analysis, HA&#8230; Being able to validate PromQL implementation is a big challenge, and is a great help in choosing the right backend according to the need. </p>
<img decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Ferlenmeyer-and-promql-compatibility%2F&amp;action_name=Erlenmeyer%20and%20PromQL%20compatibility&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Jerem: An Agile Bot</title>
		<link>https://blog.ovhcloud.com/jerem-an-agile-bot/</link>
		
		<dc:creator><![CDATA[Aurélien Hébert]]></dc:creator>
		<pubDate>Fri, 21 Feb 2020 16:58:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Agile Telemetry]]></category>
		<category><![CDATA[Agility]]></category>
		<category><![CDATA[Metrics]]></category>
		<category><![CDATA[Observability]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Time series]]></category>
		<guid isPermaLink="false">https://www.ovh.com/blog/?p=16943</guid>

					<description><![CDATA[At OVHCloud, we are open sourcing our “Agility Telemetry” project. Jerem, as our data collector, is the main component of this project. Jerem scrapes our JIRA at regular intervals, and extracts specific metrics for each project. It then forwards them to our long-time storage application, the OVHCloud Metrics Data Platform.&#160;&#160; Agility concepts from a developer&#8217;s [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fjerem-an-agile-bot%2F&amp;action_name=Jerem%3A%20An%20Agile%20Bot&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p>At OVHCloud, we are open sourcing our “Agility Telemetry” project. <strong><a href="https://github.com/ovh/jerem" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Jerem</a></strong>, as our data collector, is the main component of this project. Jerem scrapes our <strong>JIRA</strong> at regular intervals, and extracts <strong>specific metrics</strong> for each project. It then forwards them to our long-time storage application, the <strong>OVHCloud <a href="https://www.ovh.com/fr/data-platforms/metrics/" data-wpel-link="exclude">Metrics Data Platform</a></strong>.&nbsp;&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="537" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/1FA9BFB1-689F-4D25-A0EC-A65B99909343-1024x537.jpeg" alt="Jerem: an agile bot" class="wp-image-17160" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/1FA9BFB1-689F-4D25-A0EC-A65B99909343-1024x537.jpeg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/1FA9BFB1-689F-4D25-A0EC-A65B99909343-300x157.jpeg 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/1FA9BFB1-689F-4D25-A0EC-A65B99909343-768x403.jpeg 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/1FA9BFB1-689F-4D25-A0EC-A65B99909343.jpeg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Agility concepts from a developer&#8217;s point of view</h3>



<p>To help you understand our goals for <strong>Jerem</strong>, we need to explain some Agility concepts we will be using. First, we will establish a <strong>technical quarterly roadmap</strong> for a product, which sets out all <strong>features</strong> we <strong>plan to release</strong> every three months. This is what we call an <strong>epic</strong>.&nbsp;</p>



<p>For each epic, we identify the tasks that will need to be completed. For all of those tasks, we then evaluate the complexity of tasks using <strong>story points</strong>, during a team preparation session. A story point reflects the effort required to complete the specific JIRA task. </p>



<p>Then, to advance our roadmap, we will conduct regular <strong>sprints</strong> that correspond to a period of <strong>ten days</strong>, during which the team will onboard several tasks. The amount of story points taken in a sprint should match, or be close to, the <strong>team velocity</strong>. In other words, the average number of story points that the team is able to complete each day.</p>



<p>However, other urgent tasks may arise unexpectedly during sprints. That’s what we call an <strong>impediment</strong>. We might, for example, need to factor in helping customers, bug fixes, or urgent infrastructure tasks.&nbsp;&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">How Jerem works </h3>



<p>At OVH we use JIRA to track our activity. Our <strong>Jerem</strong> bot scraps our <strong>projects</strong> <strong>from</strong> <strong>JIRA</strong> and exports all necessary data to our  <strong>OVHCloud <a href="https://www.ovh.com/fr/data-platforms/metrics/" data-wpel-link="exclude">Metrics Data Platform</a></strong>. Jerem can also push data to any Warp 10 compatible database. In Grafana, you simply query the Metrics platform (using <a href="https://github.com/ovh/ovh-warp10-datasource" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Warp10 datasource</a>) with for example our <a href="https://github.com/ovh/jerem/blob/master/grafana/program_management.json" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">program management dashboard</a>. All your KPI are now available in a nice dashboard!</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="256" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45-1024x256.jpeg" alt="" class="wp-image-17164" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45-1024x256.jpeg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45-300x75.jpeg 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45-768x192.jpeg 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45-1536x384.jpeg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/DD1C99D4-E0B6-4AEC-9BDF-9ACA09CB1D45.jpeg 1720w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></div>



<h3 class="wp-block-heading">Discover Jerem metrics</h3>



<p>Now that we have an overview of the main Agility concepts involved, let&#8217;s dive into Jerem! How do we convert those Agility concepts into metrics? First of all, we&#8217;ll retrieve all metrics related to epics (i.e. new features). Then, we will have a deep look at the sprint metrics.</p>



<h4 class="wp-block-heading">Epic data</h4>



<p>To explain Jerem epic metrics, we&#8217;ll start by creating a new one. In this example, we called it <code>Agile Telemetry</code>. We add a Q2-20 label, which means that we plan to release it for Q2. To record an epic with Jerem, you need to set a quarter for the final delivery! Next, we&#8217;ll simply add four tasks, as shown below:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="651" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Epic-1-1024x651.png" alt="" class="wp-image-16984" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Epic-1-1024x651.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Epic-1-300x191.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Epic-1-768x489.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Epic-1.png 1182w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>To get the metrics, we need to evaluate each individual task. We we&#8217;ll do this together during preparation sessions. In this example, we have custom story points for each task. For example, we estimated the <code>write a BlogPost about Jerem</code> task as being a 3.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="472" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10-1024x472.png" alt="" class="wp-image-16957" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10-1024x472.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10-300x138.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10-768x354.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10-1536x709.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-11.32.10.png 1697w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>As a result, Jerem now has everything it needs to start collecting epic metrics. This example provides five metrics:</p>



<ul class="wp-block-list"><li><code>jerem.jira.epic.storypoint</code>: the total number of story points needed to complete this epic. The value here is 14 (the sum of all the epic story points). This metric will evolve whenever as the epic is updated by adding or removing tasks.&nbsp;</li><li><code>jerem.jira.epic.storypoint.done</code>: the number of completed tasks. In our example, we have already completed the <code>Write Jerem bot</code> and <code>Deploy Jerem Bot</code>, so we have already completed eight story points.</li><li><code>jerem.jira.epic.storypoint.inprogress</code>: the number of &#8216;in progress&#8217; tasks, such as <code>Write a BlogPost about Jerem</code>.</li><li><code>jerem.jira.epic.unestimated</code>: the number of unestimated tasks, shown as <code>Unestimated Task</code> in our example.</li><li><code>jerem.jira.epic.dependency</code>: the number of tasks that have dependency labels, indicating that they are mandatory for other epics or projects.</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="443" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Metris-epics-1024x443.png" alt="" class="wp-image-16958" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metris-epics-1024x443.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metris-epics-300x130.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metris-epics-768x332.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metris-epics-1536x665.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metris-epics.png 1784w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>This way, for each epic in a project, Jerem collects five unique metrics.  </p>



<h4 class="wp-block-heading">Sprint data</h4>



<p>To complete epic tasks, we work using a <strong>sprint</strong> process. When doing sprints, we want to provide a lot of <strong>insights</strong> into our <strong>achievements</strong>. That&#8217;s why Jerem collects sprint data too! </p>



<p>So let&#8217;s open a new sprint in JIRA and start working on our task. This gives us the following JIRA view:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="241" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Sprint-ui-1024x241.png" alt="" class="wp-image-16963" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Sprint-ui-1024x241.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Sprint-ui-300x71.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Sprint-ui-768x181.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Sprint-ui-1536x362.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Sprint-ui.png 1804w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Jerem collects the following metrics for each sprint:&nbsp;</p>



<ul class="wp-block-list"><li><code>jerem.jira.sprint.storypoint.total</code>: the total number of story points onboarded into a sprint.</li><li><code>jerem.jira.sprint.storypoint.inprogress</code>: the story points currently in progress within a sprint.</li><li><code>jerem.jira.sprint.storypoint.done</code>: the number of story points currently completed within a sprint.</li><li><code>jerem.jira.sprint.events</code>: the &#8216;start&#8217; and of the &#8216;end&#8217; dates of sprint events, recorded as Warp10 string values.</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="480" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Metrics-sprints-1024x480.png" alt="" class="wp-image-16964" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-sprints-1024x480.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-sprints-300x141.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-sprints-768x360.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-sprints-1536x720.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-sprints.png 1785w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>As you can see in the Metrics view above, we will record every sprint metric twice. We do this to provide a quick view of the active sprint, which is why we use the &#8216;current&#8217; label&#8217;. This also enables us to query past sprints, using the real sprint name. Of course, an active sprint can also be queried using its name.   </p>



<h4 class="wp-block-heading">Impediment data</h4>



<p>Starting a sprint means you need to know all the tasks you will have to work on over the next few days. But how can we track and measure unplanned tasks? For example, the very urgent one for your manager, or the teammate that needs a bit of help?</p>



<p>We can add special tickets on JIRA to keep track of those task. That&#8217;s what we call an &#8216;impediment&#8217;. They are labelled according their nature. If, for example, the production requires your attention, then it&#8217;s an &#8216;Infra&#8217; impediment. You will also retrieve metrics for the &#8216;Total&#8217; (all kinds of impediments), &#8216;Excess&#8217; (the unplanned tasks), &#8216;Support&#8217; (helping teammates), and &#8216;Bug fixes or other&#8217; (for all other kinds of impediment).</p>



<p>Each impediment belongs to the active sprint it was closed in. To close an impediment, you only have to flag it as &#8216;Done&#8217; or &#8216;Closed&#8217;.</p>



<p>We also retrieve metrics like:</p>



<ul class="wp-block-list"><li><code>jerem.jira.impediment.TYPE.count</code>: the number of impediments that occurred during a sprint.</li><li><code>jerem.jira.impediment.TYPE.timespent</code>: the amount of time spent on impediments during a sprint.</li></ul>



<p><code>TYPE</code> corresponds to the <strong>kind</strong> of recorded impediment. As we didn&#8217;t open any actual impediments, Jerem collects only the <code>total</code> metrics.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="433" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Metrics-impediment-1024x433.png" alt="" class="wp-image-16965" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-impediment-1024x433.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-impediment-300x127.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-impediment-768x325.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-impediment-1536x650.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Metrics-impediment.png 1773w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>To start recording impediments, we simply create a new JIRA task, in which we add an &#8216;impediment&#8217; label. We we also set its nature, and the actual time spent on it.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="819" height="903" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-14.16.54.png" alt="" class="wp-image-16967" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-14.16.54.png 819w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-14.16.54-272x300.png 272w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/Screen-Shot-2020-02-06-at-14.16.54-768x847.png 768w" sizes="auto, (max-width: 819px) 100vw, 819px" /></figure>



<p>For the impediment, we&#8217;ll we also retrieve the global metrics that Jerem always records:</p>



<ul class="wp-block-list"><li><code>jerem.jira.impediment.total.created</code>: the time spent from the creation date to complete an impediment. This allows us to retrieve a total impediment count. We can also record all impediment actions, even outside sprints.&nbsp;</li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>For a single Jira project, like our example, you can expect around 300 metrics. This might increase depending on the epic you create and flag on Jira, and the one you close.</p></blockquote>



<h3 class="wp-block-heading">Grafana dashboard</h3>



<p>We love building Grafana dashboards! They provide both the team and the manager a lot of insights into KPIs. The best part of it for me, as a developer, is that I see why it&#8217;s nice to fill a JIRA task!</p>



<p>In our first <a href="https://github.com/ovh/jerem/blob/master/grafana/program_management.json" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Grafana dashboard</a>, you will retrieve all the best program management KPIs. Let&#8217;s start with the global overview:</p>



<h4 class="wp-block-heading">Quarter data overview</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="421" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/quarter-data-sandbox-1024x421.png" alt="" class="wp-image-16968" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/quarter-data-sandbox-1024x421.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/quarter-data-sandbox-300x123.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/quarter-data-sandbox-768x316.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/quarter-data-sandbox-1536x632.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/quarter-data-sandbox.png 1840w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Here, you will find the current epic in progress. You will also find the global team KPIs, such as the predictability, the velocity, and the impediment stats. It&#8217;s here where the magic happens! When filled correctly, this dashboard will show you exactly what your team should deliver in the current quarter. This means you have quick access to all important current subjects. You will also be able to see if your team is expected to deliver on too many subjects, so you can quickly take action and delay some of the new features.</p>



<h4 class="wp-block-heading">Active sprint data</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="286" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/sprintdata-1024x286.png" alt="" class="wp-image-16969" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/sprintdata-1024x286.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/sprintdata-300x84.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/sprintdata-768x214.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/sprintdata-1536x428.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/sprintdata.png 1839w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The active sprint data panel is often a great support during our daily meetings. In this panel, we get a quick overview of the team&#8217;s achievements, and can establish the time spent on parallel tasks. </p>



<h4 class="wp-block-heading">Detailed data</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="286" src="https://www.ovh.com/blog/wp-content/uploads/2020/02/detail-KPI-1024x286.png" alt="" class="wp-image-16970" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/02/detail-KPI-1024x286.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/detail-KPI-300x84.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/detail-KPI-768x215.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/detail-KPI-1536x429.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2020/02/detail-KPI.png 1847w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The last part provides more detailed data. Using the epic Grafana variable, we can check specific epics, along with the completion of more global projects. You have also a <code>velocity chart</code>, which plots the past sprint, and compares the expected story points to the ones actually completed.   </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>The Grafana dashboard is directly availble in the Jerem project. You can import it directly in Grafana, provided you have a valid Warp 10 datasource configured. </p><p>To make the dashboard work as required, you have to configure the Grafana project variable in the form of a WarpScript list <code>[ 'SAN' 'OTHER-PROJECT' ]</code>. If our program manager can do it, I am sure you can! 😉 </p></blockquote>



<p>Setting up Jerem and automatically loading program management data give us a lot of insights. As a developer, I really enjoy it and I&#8217;ve quickly become used to tracking a lot more events in JIRA than I did before. You are able to directly see the impact of your tasks. For example, you see how quickly the roadmap is advancing, and you become able to identify any bottlenecks that are causing impediments. Those bottlenecks then become epics. In other words, once we start to use Jerem, we just auto-fill it! I hope you will enjoy it too! If you have any feedback, we would love to hear it.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fjerem-an-agile-bot%2F&amp;action_name=Jerem%3A%20An%20Agile%20Bot&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
