blob: 91c242a3dc87e23b09bf143ec1289da64877088f [file] [log] [blame]
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php";
$App = new App();
$Nav = new Nav();
$Menu = new Menu();
include($App->getProjectCommon());
$pageTitle = "Project Dashboards";
$pageKeywords = "dashboard";
$pageAuthor = "Bjorn Freeman-Benson Nov 20/05";
ob_start();
?>
<div id="maincontent">
<div id="midcolumn">
<h1><?= $pageTitle ?></h1>
<p><em>This is the legend for the metrics, <a href="index.php">the live dashboards are on another page</a>.</em></p>
<p>
<b>Dashboard internals</b><br>
As of January 2006 all information displayed in the
<a href="index.php">Dashboard</a> is obtained by means of the
<tt>project-info.xml</tt> file for each project. More information about the
<tt>project-info.xml</tt> files and how project status reporting is done can
be found <a href="http://www.eclipse.org/projects/dev_process/project-status-infrastructure.php">in the
project status infrastructure documentation</a>.
<br><br>
All <tt>project-info.xml</tt> files are expected to be found in the
<tt>project-info</tt> directory within each project:
<pre>
http://www.eclipse.org/<i>&lt;project&gt;</i>/project-info/project-info.xml
</pre>
Currently there are only a limited set of XML tags, obtained from the
<tt>project-info.xml</tt> files, that are of interest to the dashboard
statistics computation process.
<br><br>
<ul>
<li><b><i>&lt;bugzilla url="..."&gt;</i></b> The bugzilla tag contains the list
of products that are related to this project and that will be evaluated by
the statistics computation code. If the <i>url</i> is provided it will contain
a link to the web page describing how to submit a bug and how the bugs are
handled within that project. Bugzilla components are listed like this:
<pre>
&lt;bugzilla url="<i>/projectX/bugzilla-products.php</i>"&gt;
&nbsp;&nbsp;&lt;product name="<i>product1</i>"/&gt;
&nbsp;&nbsp;&lt;product name="<i>product2</i>"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
&nbsp;&nbsp;&lt;product name="<i>productN</i>"/&gt;
&lt;/bugzilla&gt;
</pre>
<li><b><i>&lt;newsgroups&gt;</i></b> This tag encompasses the tags containing
all newsgroups. The newsgroups listed here will be the ones that will be used
at computation time for each particular project. The current definition of these
tags looks like this:
<pre>
&lt;newsgroups&gt;
&nbsp;&nbsp;&lt;newsgroup&gt;<i>newsgroup1</i>&lt;/newsgroup&gt;
&nbsp;&nbsp;&lt;newsgroup&gt;<i>newsgroup2</i>&lt;/newsgroup&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
&nbsp;&nbsp;&lt;newsgroup&gt;<i>newsgroupN</i>&lt;/newsgroup&gt;
&lt;/newsgroups&gt;
</pre>
For the purpose of the statistics collected by dashboard all newsgroups are
treated as a single newsgroup. All posts from all newsgroups are cached into
a single object in memory and processed as described <a href="#news">here</a>.
<br><br>
<li><b><i>&lt;mailing-lists url="..."&gt;</i></b> This tag behaves in the same
way as the &lt;newsgroups/&gt; tag but it collects information about the
different mailing lists for a project. The optional <i>url</i> points to
the web page describing the purpose of the different lists. If absent then it
will default to the main Eclipse mailing lists page. The mailing lists are
defined like this:
<pre>
&lt;mailing-lists url="<i>/projectX/mailing-list-description.php</i>"&gt;
&nbsp;&nbsp;&lt;list name="<i>list1</i>"/&gt;
&nbsp;&nbsp;&lt;list name="<i>list2</i>"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
&nbsp;&nbsp;&lt;list name="<i>listN</i>"/&gt;
&lt;/mailing-lists&gt;
</pre>
In the case of mailing lists the information is obtained from an internal
Eclipse database where statistics are collected nightly for the different
Eclipse project mailing lists. However, the information from the different
lists (if a project has more than one defined in their <tt>project-info.xml</tt>
file) are merged in the statistical computation process and treated as one
mailing list.
<br><br>
<li><b><i>&lt;articles&gt;</i></b> This tag is only used to compute the
number of articles contained in the project. It will only be reflected in
the liveness measure (see below) but the logs will contain the articles
counted per project. Articles are defined like:
<pre>
&lt;articles&gt;
&nbsp;&nbsp;&lt;article&gt;http://www.eclipse.org/article1.html&lt;/article&gt;
&nbsp;&nbsp;&lt;article&gt;http://www.eclipse.org/article2.html&lt;/article&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
&nbsp;&nbsp;&lt;article&gt;http://www.eclipse.org/articleN.html&lt;/article&gt;
&lt;/articles&gt;
</pre>
<br>
</ul>
If any of the above tags is empty or not defined, inside the project's
<tt>project-info.xml</tt> file, then the particular statistic(s) (news, bugs,
mail) will not be computed for that project and the fields for them will appear
as <i>"N/A"</i>. Empty or undefined tags will reflect directly in the liveness
measure as this number will go into the negative.
<br><br>
The statistical computation process for dashboard takes these elements
described above and uses them to generate the data displayes on the live
dashboard. More information about each of the statistics shown can be found
below. For a more complete example of a <tt>project-info.xml</tt> file please
consult this <a href="http://www.eclipse.org/projects/dev_process/example-project-info.xml">link</a>.
</p>
<br><br>
<p>
<b>The Live Dashboard</b><br>
The live dashboard displays a daily snapshot for each of the projects found
in the Eclipse Foundation database. As mentioned in the paragraphs above the
information for each project is retrieved from their <tt>project-info.xml</tt>
file.
<br><br>
Dashboard has the capacity to sort by project name (alphabetically) or by
liveness (descending). The default sort is by project name. To change between
the two simply click on the appropriate text (<a>Project name</a> or
<a>Liveness</a>) above the project listings (see Figure 1).
<br><br>
If a project is listed in the Eclipse Foundation database but does not have a
<tt>project-info.xml</tt> file then the liveness of the project will be
<color="red">-1000</color>. This number is also assigned to those projects
that have a <tt>project-info.xml</tt> file but do not have the sections
listed above defined. Finally, this can also occur to those projects that
have not reported bugs in the last 6 months. More information about how
liveness is calculated can be found <a href="#liveness">here</a>.
<div align="center">
<img src="dash1.jpg">
<br><br>
Figure 1. The Live Dashboard
<br><br>
</div>
As can be seen in Figure 1 the liveness will display different numbers
according to the information obtained from the resources specified inside
the project's <tt>project-info.xml</tt> file. Also, the dashboard lights
will display different colors depending on this same information.
</p>
<br><br>
<p><b>Bug fix rate.</b><br>
The difference in the number of closed (resolved, closed, and verified) bugs
and enhancements to the number of open and active (P1, P2, P3) bugs. The goal is
to keep the number positive because then the project is fixing bugs and
implementing features faster than bugs are being reported. The number below the
gauge is the numeric difference.&nbsp; The gauge itself shows the number as a
percent of the number of new bugs reported.</p>
<a name="news"></a><p><b>Newsgroups statistics.</b><br>
The collection of statistics includes the number of posts, average number of
posts, average time for a post to be answered, number of unanswered posts and
number of posts made by insiders. All statistics are collected for different
time periods.</p>
<p>
<ul>
<li><b>Number of posts.</b> Total number of posts made in the last <i>N</i> days. The number of posts will be <i><b>N/A</b></i> when the newsgroup for a project does not exist and it is not possible to compute the statistics. When the group for the project exists but it is currently empty (no posts) or there are no posts for the last <i>N</i> days then the field will show as <i><b>no posts</b></i>.<br>
<br>
<table border=0>
<tr>
<td style="text-align: center; border-bottom-style: dotted; border-bottom-width: 1">Light</td>
<td>&nbsp;</td>
<td colspan=2 style="text-align: center; border-bottom-style: dotted; border-bottom-width: 1">Occurs when</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><center><b>7 days</b></center></td>
<td><center><b>30 days</b></center></td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/white.gif"></center></td>
<td>&nbsp;</td>
<td>The field contains <tt>N/A</tt></td>
<td>The field contains <tt>N/A</tt></td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/red.gif"></center></td>
<td>&nbsp;</td>
<td>The number of posts is <tt>&lt;= 1</tt></td>
<td>The number of posts is <tt>&lt;= 10</tt></td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/green.gif"></center></td>
<td>&nbsp;</td>
<td>The number of posts is <tt>=&gt; 10</tt></td>
<td>The number of posts is <tt>=&gt; 40</tt></td>
</tr>
</table>
<br>
<li><b>Posts per day.</b> Average number of posts per day for the last <i>N</i> days. If the number of posts is 0 or the newsgroup for that project does not exist then the value will be <i><b>N/A</b></i>.<br>
<br>
Note: the values for this field are rounded. For example, if a newsgroup has only one post in the last 30 days the rounding will make it appear as 0 posts per day since <tt>1 / 30 =~ 0.03</tt>.<br>
<br>
<li><b>Time to answer a post.</b> Average time it takes for a post that was answered to be answered in the last <i>N</i> days.
The Time To Reply (TTR) is computed as the difference between the time of the original post and the time of the reply using the NNTP-Posting-Date. If there were no answers for the specified period then the field will display <b><i>no answers</i></b>. If the newsgroup does not exist then it will display <i><b>N/A</b></i>.<br>
<br>
In order to get better results the <i>mean (&micro;)</i> and <i>standard deviation</i> are calculated for all posts from the last two months. If a post's TTR in the last <i>N</i> days is outside the <i>&micro; &plusmn; (2 * std. dev.)</i> window then the post is ignored for computation purposes.<br>
<br>
The maximum window to search for a reply is two months. If the post to which the current one is replying is not found within this time period then it is discarded regardless of it's TTR.<br>
<br>
<table border=0>
<tr>
<td style="text-align: center; border-bottom-style: dotted; border-bottom-width: 1">Light</td>
<td>&nbsp;</td>
<td style="text-align: center; border-bottom-style: dotted; border-bottom-width: 1">Occurs when</td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/white.gif"></center></td>
<td>&nbsp;</td>
<td>The field contains <tt>N/A</tt></td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/red.gif"></center></td>
<td>&nbsp;</td>
<td>The time to answer <tt>&lt;= 1 day</tt></td>
</tr>
<tr>
<td><center><img alt="white light" src="lights/green.gif"></center></td>
<td>&nbsp;</td>
<td>The time to answer is <tt>=&gt; 2 days</tt></td>
</tr>
</table>
<br>
Note for CSV logs: Posts in the log are identified by a stripped down version
of their Message ID (<a href="http://www.ietf.org/rfc/rfc977.txt">RFC 977</a>).
The stripping consists of removing all characters after and including the
<tt>'@'</tt> symbol. For example, if a message is identified by
<tt>dj45t$1vr$1@eclipse.org</tt> the stripped down version on the log file
would be stored as <tt>dj45t$1vr$1</tt>.<br>
<br>
Note for CSV downloads: The time difference is stored in seconds. To obtain the number of days & hours from this field (time_difference):<br>
<br>
<pre>
reminder = time_difference % 86400 // There are 86400 seconds
days = (time_difference - reminder) / 86400 // in a day: 24h * 60m * 60s
reminder2 = reminder % 3600;
hours = (reminder - reminder2) / 3600;
</pre>
<br>
<li><b>Number of unanswered posts.</b> Total number of posts that have not been replied to in the last <i>N</i> days. This is only the number of top-level posts: those not having a <i>references:</i> field in the post's header. If the newsgroup does not exist the field will display <b><i>N/A</i></b>
</ul>
</p>
<a name="liveness"></a><p><b>Liveness.</b><br>
Liveness is:<br>
<pre>
1 * log(last week change in number of bugs) +
1 * log(last week bug fix rate percentage) +
2 * log(last month bug fix rate percentage) +
1 * log(last six months bug fix rate percentage) +
2 * log(last week number of newsgroup postings) +
2 * 1/(last week newsgroup answers times) +
3 * log(last month number of newsgroup postings) +
3 * 1/(last month newsgroup answers times) +
2 * log(number of articles available for the project).
</pre>
The sum will be the number appearing in the dashboard. Note that if the sum
comes to 0 dashboard will display -1000 as the liveness.
</p>
<p><b>Mailing lists statistics.</b><br>
Computed daily from all mailing lists associated with a particular project. If the project does not have any listed mailing lists all stats will contain <b><i>N/A</i></b>.
</p>
<p>
<ul>
<li><b>Number of posts.</b> The number of posts made to all the project's mailing lists in the last <i>N</i> days.
<li><b>Average # of posts.</b> Average number of posts per day.
<li><b>Average # of subscribers.</b> Average number of subscribers over the last <i>N</i> days.
</ul>
</p>
<hr>
<p>Note about caching: the
Dashboard data is computed once a day around midnight EDT.</p>
</div></div>
<?php
# Paste your HTML content between the EOHTML markers!
$html = ob_get_contents();
ob_end_clean();
# Generate the web page
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>