blob: 59645c1c1cff5c6c92dd03cf6be752bc901dfe71 [file] [log] [blame]
---
layout: default
# Top navigation
top-nav-group: admin-guide
top-nav-pos: 4
top-nav-title: Monitoring
# Sub-level navigation
sub-nav-group: admin-guide
sub-nav-parent: admin-guide
sub-nav-id: monitoring
sub-nav-pos: 4
sub-nav-title: Monitoring
---
.. contents:: Monitoring
Monitoring
==========
DistributedLog uses the stats library provided by Apache BookKeeper for reporting metrics in
both the server and the client. This can be configured to report stats using pluggable stats
provider to integrate with your monitoring system.
Stats Provider
~~~~~~~~~~~~~~
`StatsProvider` is a provider that provides different kinds of stats logger for different scopes.
The provider is also responsible for reporting its managed metrics.
::
// Create the stats provider
StatsProvider statsProvider = ...;
// Start the stats provider
statsProvider.start(conf);
// Stop the stats provider
statsProvider.stop();
Stats Logger
____________
A scoped `StatsLogger` is a stats logger that records 3 kinds of statistics
under a given `scope`.
A `StatsLogger` could be either created by obtaining from stats provider with
the scope name:
::
StatsProvider statsProvider = ...;
StatsLogger statsLogger = statsProvider.scope("test-scope");
Or created by obtaining from a stats logger with a sub scope name:
::
StatsLogger rootStatsLogger = ...;
StatsLogger subStatsLogger = rootStatsLogger.scope("sub-scope");
All the metrics in a stats provider are managed in a hierarchical of scopes.
::
// all stats recorded by `rootStatsLogger` are under 'root'
StatsLogger rootStatsLogger = statsProvider.scope("root");
// all stats recorded by 'subStatsLogger1` are under 'root/scope1'
StatsLogger subStatsLogger1 = statsProvider.scope("scope1");
// all stats recorded by 'subStatsLogger2` are under 'root/scope2'
StatsLogger subStatsLogger2 = statsProvider.scope("scope2");
Counters
++++++++
A `Counter` is a cumulative metric that represents a single numerical value. A **counter**
is typically used to count requests served, tasks completed, errors occurred, etc. Counters
should not be used to expose current counts of items whose number can also go down, e.g.
the number of currently running tasks. Use `Gauges` for this use case.
To change a counter, use:
::
StatsLogger statsLogger = ...;
Counter births = statsLogger.getCounter("births");
// increment the counter
births.inc();
// decrement the counter
births.dec();
// change the counter by delta
births.add(-10);
// reset the counter
births.reset();
Gauges
++++++
A `Gauge` is a metric that represents a single numerical value that can arbitrarily go up and down.
Gauges are typically used for measured values like temperatures or current memory usage, but also
"counts" that can go up and down, like the number of running tasks.
To define a gauge, stick the following code somewhere in the initialization:
::
final AtomicLong numPendingRequests = new AtomicLong(0L);
StatsLogger statsLogger = ...;
statsLogger.registerGauge(
"num_pending_requests",
new Gauge<Number>() {
@Override
public Number getDefaultValue() {
return 0;
}
@Override
public Number getSample() {
return numPendingRequests.get();
}
});
The gauge must always return a numerical value when sampling.
Metrics (OpStats)
+++++++++++++++++
A `OpStats` is a set of metrics that represents the statistics of an `operation`. Those metrics
include `success` or `failure` of the operations and its distribution (also known as `Histogram`).
It is usually used for timing.
::
StatsLogger statsLogger = ...;
OpStatsLogger writeStats = statsLogger.getOpStatsLogger("writes");
long writeLatency = ...;
// register success op
writeStats.registerSuccessfulEvent(writeLatency);
// register failure op
writeStats.registerFailedEvent(writeLatency);
Available Stats Providers
~~~~~~~~~~~~~~~~~~~~~~~~~
All the available stats providers are listed as below:
* Twitter Science Stats (deprecated)
* Twitter Ostrich Stats (deprecated)
* Twitter Finagle Stats
* Codahale Stats
Twitter Science Stats
_____________________
Use following dependency to enable Twitter science stats provider.
::
<dependency>
<groupId>org.apache.bookkeeper.stats</groupId>
<artifactId>twitter-science-provider</artifactId>
<version>${bookkeeper.version}</version>
</dependency>
Construct the stats provider for clients.
::
StatsProvider statsProvider = new TwitterStatsProvider();
DistributedLogConfiguration conf = ...;
// starts the stats provider (optional)
statsProvider.start(conf);
// all the dl related stats are exposed under "dlog"
StatsLogger statsLogger = statsProvider.getStatsLogger("dlog");
DistributedLogNamespace namespace = DistributedLogNamespaceBuilder.newBuilder()
.uri(...)
.conf(conf)
.statsLogger(statsLogger)
.build();
...
// stop the stats provider (optional)
statsProvider.stop();
Expose the stats collected by the stats provider by configuring following settings:
::
// enable exporting the stats
statsExport=true
// exporting the stats at port 8080
statsHttpPort=8080
If exporting stats is enabled, all the stats are exported by the http endpoint.
You could curl the http endpoint to check the stats.
::
curl -s <host>:8080/vars
check ScienceStats_ for more details.
.. _ScienceStats: https://github.com/twitter/commons/tree/master/src/java/com/twitter/common/stats
Twitter Ostrich Stats
_____________________
Use following dependency to enable Twitter ostrich stats provider.
::
<dependency>
<groupId>org.apache.bookkeeper.stats</groupId>
<artifactId>twitter-ostrich-provider</artifactId>
<version>${bookkeeper.version}</version>
</dependency>
Construct the stats provider for clients.
::
StatsProvider statsProvider = new TwitterOstrichProvider();
DistributedLogConfiguration conf = ...;
// starts the stats provider (optional)
statsProvider.start(conf);
// all the dl related stats are exposed under "dlog"
StatsLogger statsLogger = statsProvider.getStatsLogger("dlog");
DistributedLogNamespace namespace = DistributedLogNamespaceBuilder.newBuilder()
.uri(...)
.conf(conf)
.statsLogger(statsLogger)
.build();
...
// stop the stats provider (optional)
statsProvider.stop();
Expose the stats collected by the stats provider by configuring following settings:
::
// enable exporting the stats
statsExport=true
// exporting the stats at port 8080
statsHttpPort=8080
If exporting stats is enabled, all the stats are exported by the http endpoint.
You could curl the http endpoint to check the stats.
::
curl -s <host>:8080/stats.txt
check Ostrich_ for more details.
.. _Ostrich: https://github.com/twitter/ostrich
Twitter Finagle Metrics
_______________________
Use following dependency to enable bridging finagle stats receiver to bookkeeper's stats provider.
All the stats exposed by the stats provider will be collected by finagle stats receiver and exposed
by Twitter's admin service.
::
<dependency>
<groupId>org.apache.bookkeeper.stats</groupId>
<artifactId>twitter-finagle-provider</artifactId>
<version>${bookkeeper.version}</version>
</dependency>
Construct the stats provider for clients.
::
StatsReceiver statsReceiver = ...; // finagle stats receiver
StatsProvider statsProvider = new FinagleStatsProvider(statsReceiver);
DistributedLogConfiguration conf = ...;
// the stats provider does nothing on start.
statsProvider.start(conf);
// all the dl related stats are exposed under "dlog"
StatsLogger statsLogger = statsProvider.getStatsLogger("dlog");
DistributedLogNamespace namespace = DistributedLogNamespaceBuilder.newBuilder()
.uri(...)
.conf(conf)
.statsLogger(statsLogger)
.build();
...
// the stats provider does nothing on stop.
statsProvider.stop();
check `finagle metrics library`__ for more details on how to expose the stats.
.. _TwitterServer: https://twitter.github.io/twitter-server/Migration.html
__ TwitterServer_
Codahale Metrics
________________
Use following dependency to enable Twitter ostrich stats provider.
::
<dependency>
<groupId>org.apache.bookkeeper.stats</groupId>
<artifactId>codahale-metrics-provider</artifactId>
<version>${bookkeeper.version}</version>
</dependency>
Construct the stats provider for clients.
::
StatsProvider statsProvider = new CodahaleMetricsProvider();
DistributedLogConfiguration conf = ...;
// starts the stats provider (optional)
statsProvider.start(conf);
// all the dl related stats are exposed under "dlog"
StatsLogger statsLogger = statsProvider.getStatsLogger("dlog");
DistributedLogNamespace namespace = DistributedLogNamespaceBuilder.newBuilder()
.uri(...)
.conf(conf)
.statsLogger(statsLogger)
.build();
...
// stop the stats provider (optional)
statsProvider.stop();
Expose the stats collected by the stats provider in different ways by configuring following settings.
Check Codehale_ on how to configuring report endpoints.
::
// How frequent report the stats
codahaleStatsOutputFrequencySeconds=...
// The prefix string of codahale stats
codahaleStatsPrefix=...
//
// Report Endpoints
//
// expose the stats to Graphite
codahaleStatsGraphiteEndpoint=...
// expose the stats to CSV files
codahaleStatsCSVEndpoint=...
// expose the stats to Slf4j logging
codahaleStatsSlf4jEndpoint=...
// expose the stats to JMX endpoint
codahaleStatsJmxEndpoint=...
check Codehale_ for more details.
.. _Codehale: https://dropwizard.github.io/metrics/3.1.0/
Enable Stats Provider on Bookie Servers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The stats provider used by *Bookie Servers* is configured by setting the following option.
::
// class of stats provider
statsProviderClass="org.apache.bookkeeper.stats.CodahaleMetricsProvider"
Metrics
~~~~~~~
Check the Metrics_ reference page for the metrics exposed by DistributedLog.
.. _Metrics: ../user_guide/references/metrics