blob: 96890ac38561c3ec6e6b11113ce3a5b9c37de3b9 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>Apache BookKeeper&trade; - BP-36: Stats documentation annotation</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/tippy.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/img/favicon.ico">
<script src="/js/tippy.min.js"></script>
<script type="text/javascript">
var shiftWindow = function() { scrollBy(0, -25); };
window.addEventListener("hashchange", shiftWindow);
window.addEventListener("pageshow", shiftWindow);
function load() { if (window.location.hash) shiftWindow(); }
</script>
</head>
<body class="body">
<main class="main">
<nav class="navbar bk-topnav">
<div class="navbar-brand">
<a class="navbar-item bk-brand" href="/">
Apache BookKeeper&trade;
</a>
<div class="navbar-burger burger" data-target="bkNav">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div id="bkNav" class="navbar-menu">
<div class="navbar-start">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Documentation</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/docs/latest/overview/overview">
Version 4.14.0-SNAPSHOT
<span class="tag is-warning">Development</span>
</a>
<a class="navbar-item" href="/docs/latest/api/javadoc">
<span class="icon bk-javadoc-icon">
<img src="/img/java-icon.svg">
</span>
Javadoc
</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/docs/4.13.0/overview/overview">
Release 4.13.0
</a>
<a class="navbar-item" href="/docs/4.12.1/overview/overview">
Release 4.12.1
</a>
<a class="navbar-item" href="/docs/4.12.0/overview/overview">
Release 4.12.0
</a>
<a class="navbar-item" href="/docs/4.11.1/overview/overview">
Release 4.11.1
<span class="tag is-success">Stable</span>
</a>
<a class="navbar-item" href="/docs/4.11.0/overview/overview">
Release 4.11.0
</a>
<a class="navbar-item" href="/docs/4.10.0/overview/overview">
Release 4.10.0
</a>
<a class="navbar-item" href="/archives/docs/r4.9.2">
Release 4.9.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.1">
Release 4.9.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.0">
Release 4.9.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.2">
Release 4.8.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.1">
Release 4.8.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.0">
Release 4.8.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.3">
Release 4.7.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.2">
Release 4.7.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.1">
Release 4.7.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.0">
Release 4.7.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.2">
Release 4.6.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.1">
Release 4.6.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.0">
Release 4.6.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.1">
Release 4.5.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.0">
Release 4.5.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.4.0">
Release 4.4.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.2">
Release 4.3.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.1">
Release 4.3.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.0">
Release 4.3.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.4">
Release 4.2.4
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.3">
Release 4.2.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.2">
Release 4.2.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.1">
Release 4.2.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.0">
Release 4.2.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.1.0">
Release 4.1.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.0.0">
Release 4.0.0
<span class="tag is-warning">EOL</span>
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Community</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/community/mailing-lists">Mailing lists</a>
<a class="navbar-item" href="/community/slack">Slack</a>
<a class="navbar-item" href="https://github.com/apache/bookkeeper/issues">Github Issues</a>
<a class="navbar-item" href="/community/releases">Release Management</a>
<a class="navbar-item" href="/community/meeting">Community Meetings</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/contributing">Contribution Guide</a>
<a class="navbar-item" href="/community/coding_guide">Coding Guide</a>
<a class="navbar-item" href="/community/testing">Testing Guide</a>
<a class="navbar-item" href="/community/issue-report">Issue Report Guide</a>
<a class="navbar-item" href="/community/release_guide">Release Guide</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/presentations">Presentations</a>
<a class="navbar-item" href="/community/bookkeeper_proposals">BookKeeper Proposals</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Project</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/project/who">Who are we?</a>
<a class="navbar-item" href="/project/bylaws">Bylaws</a>
<a class="navbar-item" href="http://www.apache.org/licenses/">License</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/project/privacy">Privacy policy</a>
<a class="navbar-item" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="navbar-item" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</div>
</div>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="field is-grouped">
<p class="control">
<a class="button bk-twitter" href="https://twitter.com/asfbookkeeper">
<span class="icon">
<i class="fa fa-twitter"></i>
</span>
<span>Twitter</span>
</a>
</p>
<p class="control">
<a class="button" href="https://github.com/apache/bookkeeper">
<span class="icon">
<i class="fa fa-github"></i>
</span>
<span>GitHub</span>
</a>
</p>
<p class="control">
<a class="button is-primary" href="/releases">
<span class="icon">
<i class="fa fa-download"></i>
</span>
<span>Download</span>
</a>
</p>
</div>
</div>
</div>
</div>
</nav>
<div class="bk-community-container">
<div class="columns">
<div class="column is-12">
<header class="docs-title">
<nav class="level">
<div class="level-left">
<div class="level-item">
<h1 class="title">BP-36: Stats documentation annotation</h1>
</div>
</div>
</nav>
</header>
<hr />
<div class="content is-medium">
<section class="bk-community-content">
<h3 id="motivation">Motivation</h3>
<p>A common ask from people using bookkeeper is how they can monitor bookies and bookkeeper clients, what kind of metrics that bookkeeper exposes
and what are the important metrics. Currently bookkeeper doesn’t provide any metrics page for guiding people on monitoring bookkeeper services.</p>
<p>In order to help people on this, we need to provide a few documentation pages about metrics. However if we just write such pages, those pages
can quickly get out-of-dated when code is changed. The proposal here is to seek a programming way for generating metrics related pages.</p>
<h3 id="public-interfaces">Public Interfaces</h3>
<p>Introduced a <code class="highlighter-rouge">StatsDoc</code> annotation.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/<span class="k">**</span>
<span class="k">*</span> Documenting the stats.
<span class="k">*</span>/
@Retention<span class="o">(</span>RetentionPolicy.RUNTIME<span class="o">)</span>
@Documented
public @interface StatsDoc <span class="o">{</span>
/<span class="k">**</span>
<span class="k">*</span> The name of the category to group stats together.
<span class="k">*</span>
<span class="k">*</span> @return name of the stats category.
<span class="k">*</span>/
String category<span class="o">()</span> default <span class="s2">""</span><span class="p">;</span>
/<span class="k">**</span>
<span class="k">*</span> The scope of this stats.
<span class="k">*</span>
<span class="k">*</span> @return scope of this stats
<span class="k">*</span>/
String scope<span class="o">()</span> default <span class="s2">""</span><span class="p">;</span>
/<span class="k">**</span>
<span class="k">*</span> The name of this stats
<span class="k">*</span>
<span class="k">*</span> @return name of this stats
<span class="k">*</span>/
String name<span class="o">()</span><span class="p">;</span>
/<span class="k">**</span>
<span class="k">*</span> The <span class="nb">help </span>message of this stats
<span class="k">*</span>
<span class="k">*</span> @return <span class="nb">help </span>message of this stats
<span class="k">*</span>/
String <span class="nb">help</span><span class="o">()</span><span class="p">;</span>
/<span class="k">**</span>
<span class="k">*</span> The parent metric name.
<span class="k">*</span>
<span class="k">*</span> &lt;p&gt;It can used <span class="k">for </span>analyzing the relationships
<span class="k">*</span> between the metrics, especially <span class="k">for </span>the latency metrics.
<span class="k">*</span>
<span class="k">*</span> @return the parent metric name
<span class="k">*</span>/
default String parent<span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="s2">""</span><span class="p">;</span> <span class="o">}</span>
/<span class="k">**</span>
<span class="k">*</span> The metric name of an operation that happens
<span class="k">*</span> after the operation of this metric.
<span class="k">*</span>
<span class="k">*</span> &lt;p&gt;similar as <span class="o">{</span>@link <span class="c">#parent()}, it can be used for analyzing</span>
<span class="k">*</span> the dependencies between metrics.
<span class="k">*</span>
<span class="k">*</span> @return the metric name of an operation that happens after the operation of this metric.
<span class="k">*</span>/
default String happensAfter<span class="o">()</span> <span class="o">{</span> <span class="k">return</span> <span class="s2">""</span><span class="p">;</span> <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>The <code class="highlighter-rouge">StatsDoc</code> annotation provides a way to annotate metrics we added to bookkeeper.</p>
<ul>
<li>category: which category that the metric belongs to. e.g. server, or client.</li>
<li>scope: the scope of the metric. e.g. <code class="highlighter-rouge">bookie</code> scope.</li>
<li>name: the name of the metric.</li>
<li>help: the description of the metric.</li>
</ul>
<h3 id="proposed-changes">Proposed Changes</h3>
<p>In addition to the <code class="highlighter-rouge">StatsDoc</code> annotation, bookkeeper should provide a tool for generating the metrics yaml file
for documenting all annotated metrics.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bin/stats-doc-gen
</code></pre></div></div>
<p>Example output:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"</span><span class="s">server"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_READ_ENTRY_BYTES"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">bytes stats of ReadEntry on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">OPSTATS</span>
<span class="s2">"</span><span class="s">bookie_WRITE_BYTES"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">total bytes written to a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">COUNTER</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_ADD_ENTRY"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">operations stats of AddEntry on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">OPSTATS</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_RECOVERY_ADD_ENTRY"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">operation stats of RecoveryAddEntry on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">OPSTATS</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_ADD_ENTRY_BYTES"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">bytes stats of AddEntry on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">OPSTATS</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_FORCE_LEDGER"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">total force operations occurred on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">COUNTER</span>
<span class="s2">"</span><span class="s">bookie_READ_BYTES"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">total bytes read from a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">COUNTER</span>
<span class="s2">"</span><span class="s">bookie_BOOKIE_READ_ENTRY"</span><span class="pi">:</span>
<span class="s2">"</span><span class="s">description"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">operation stats of ReadEntry on a bookie</span>
<span class="s2">"</span><span class="s">type"</span><span class="pi">:</span> <span class="pi">|-</span>
<span class="s">OPSTATS</span>
</code></pre></div></div>
<h3 id="compatibility-deprecation-and-migration-plan">Compatibility, Deprecation, and Migration Plan</h3>
<p>It is a new feature, which doesn’t have any compatibility impacts.</p>
<p>There is nothing deprecated.</p>
<p>There is nothing to migrate.</p>
<h3 id="test-plan">Test Plan</h3>
<p>Existing testing is good enough to cover code changes. No new tests are needed.</p>
<h3 id="rejected-alternatives">Rejected Alternatives</h3>
<p>Alternatively, we have to manually maintain the metrics page and update each time when a new metric is added.</p>
</section>
</div>
</div>
</div>
</div>
</main>
<footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
Copyright &copy; 2016 - 2021 <a href="https://www.apache.org/">The Apache Software Foundation</a>,<br /> licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
</p>
<p>
Apache BookKeeper, BookKeeper®, Apache®, the Apache feature logo, and the Apache BookKeeper logo are either registered trademarks or trademarks of The Apache Software Foundation.
</p>
</div>
</div>
</footer>
</body>
<script src="/js/app.js"></script>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-104419626-1', 'auto');
ga('send', 'pageview');
</script>
</html>