blob: 9e78116f42569219c27a86dbc978686a511d9824 [file] [log] [blame]
---
active_crumb: Metrics <span class="amp">&amp;</span> Tracing
layout: documentation
id: metrics
---
<!--
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.
-->
<div id="metrics-and-tracing" class="col-md-8 second-column">
<section id="overview">
<h2 class="section-title">Overview</h2>
<p>
Both REST server and data probe come with <a target=_ href="https://opencensus.io">OpenCensus</a>
instrumentation. NLPCraft bundles several built-in exporters for various OpenCensus trace and stats
backends:
</p>
<table class="gradient-table checks">
<thead>
<tr>
<th>Backend</th>
<th>Built-In Exporters</th>
<th>Stats or Trace?</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a target=_ href="https://www.jaegertracing.io/">
<img alt="" style="width: 48px" src="/images/jaeger-logo-x.png">
<div class="exporter-name">Jaeger</div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCJaegerExporter</code><br>
Probe:
<a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCJaegerExporter.html">org.apache.nlpcraft.model.opencensus.NCJaegerExporter</a>
</td>
<td><center>Trace</center></td>
</tr>
<tr>
<td>
<a target=_ href="https://zipkin.io/">
<img alt="" style="width: 48px" src="/images/zipkin-logo.jpg">
<div class="exporter-name">Zipkin</div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCZipkinExporter</code><br>
Probe: <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCZipkinExporter.html">org.apache.nlpcraft.model.opencensus.NCZipkinExporter</a>
</td>
<td><center>Trace</center></td>
</tr>
<tr>
<td>
<a target=_ href="https://prometheus.io/">
<img alt="" style="width: 48px" src="/images/prometheus-logo-x.png">
<div class="exporter-name">Prometheus</div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCPrometheusExporter</code><br>
Probe: <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCPrometheusExporter.html">org.apache.nlpcraft.model.opencensus.NCPrometheusExporter</a>
</td>
<td><center>Stats</center></td>
</tr>
<tr>
<td>
<a target=_ href="https://grafana.com/">
<img alt="" style="width: 48px" src="/images/grafana-logo-x.png">
<div class="exporter-name">Grafana<sup>*</sup></div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCPrometheusExporter</code><br>
Probe: <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCPrometheusExporter.html">org.apache.nlpcraft.model.opencensus.NCPrometheusExporter</a>
</td>
<td><center>Stats</center></td>
</tr>
<tr>
<td>
<a target=_ href="https://cloud.google.com/stackdriver/">
<img alt="" style="width: 48px" src="/images/stackdriver-stats-x.png">
<div class="exporter-name">Stackdriver</div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCStackdriverStatsExporter</code><br>
Probe: <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCStackdriverStatsExporter.html">org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter</a>
</td>
<td><center>Stats</center></td>
</tr>
<tr>
<td>
<a target=_ href="https://cloud.google.com/stackdriver/">
<img alt="" style="width: 48px" src="/images/stackdriver-trace-x.png">
<div class="exporter-name">Stackdriver</div>
</a>
</td>
<td>
Server: <code>org.apache.nlpcraft.server.lifecycle.opencensus.NCStackdriverTraceExporter</code><br>
Probe: <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCStackdriverTraceExporter.html">org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter</a>
</td>
<td><center>Trace</center></td>
</tr>
</tbody>
</table>
<p>
<sup><b>NOTE:</b> (*) Grafana works through Prometheus integration.</sup>
</p>
<p>
All built-in exporters are a simple adaptation of the standard OpenCensus <a target=_ href="https://opencensus.io/exporters/supported-exporters/java/">exporters</a>
to life cycle components for the
REST server or the data probe. Each exporter has just a few lines of code and you can easily create your own
exporters for other backends.
</p>
</section>
<section id="server">
<h2 class="section-title">Configuring Server</h2>
<p>
OpenCensus exporters for the REST server are lifecycle components. Server lifecycle components are the implementations
of <code>NCServerLifecycle</code> trait. Lifecycle components get callbacks for various stages of the server
lifecycle and thus can register and unregister "primordial" components such as OpenCensus exporters.
</p>
<p>
REST server lifecycle components are specified in <code>nlpcraft.server.lifecycle</code>
<a href="server-and-probe.html">configuration</a> property. For example, for file based configuration:
</p>
<pre class="brush: js, highlight: [17, 18]">
nlpcraft {
server {
...
lifecycle = [
"org.apache.nlpcraft.server.lifecycle.opencensus.NCPrometheusExporter",
"org.apache.nlpcraft.server.lifecycle.opencensus.NCJaegerExporter"
]
...
}
}
</pre>
<p>
Note that each server exporter has default configuration that can be overridden via
<a href="server-and-probe.html">configuration</a> properties or environment variables. Note also that all
built-in <b>trace exporters</b> use "always" sampling by default that is suitable
only for demo or development purposes. For production usage you will need to modify the exporter
to provide more effective <a target=_ href="https://opencensus.io/tracing/sampling/">sampling strategy</a>.
</p>
</section>
<section id="probe">
<h2 class="section-title">Configuring Probe</h2>
<p>
Just like on the REST server OpenCensus exporters for the data probe are lifecycle components. Probe lifecycle
components are the implementations
of <a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/NCProbeLifecycle.html">org.apache.nlpcraft.model.NCLifecycle</a>
interface. Lifecycle components get callbacks for various stages of the data probe
lifecycle and thus can register and unregister "primordial" components such as OpenCensus exporters. For example, using
file based configuration:
</p>
<pre class="brush: js, highlight: [14, 15]">
nlpcraft {
probe {
...
lifecycle = [
"org.apache.nlpcraft.model.opencensus.NCPrometheusExporter",
"org.apache.nlpcraft.model.opencensus.NCJaegerExporter"
]
...
}
}
</pre>
<p>
Just like with server exporters, each probe exporter has default configuration that can be overridden via
<a href="server-and-probe.html">configuration</a> properties or environment variables. Note also that all
built-in <b>trace exporters</b> use "always" sampling by default that is suitable
only for demo or development purposes. For production usage you will need to modify the exporter
to provide more effective <a target=_ href="https://opencensus.io/tracing/sampling/">sampling strategy</a>.
Please consult individual exporter classes:
</p>
<ul>
<li><a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCJaegerExporter.html">NCJaegerExporter</a></li>
<li><a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCZipkinExporter.html">NCZipkinExporter</a></li>
<li><a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCPrometheusExporter.html">NCPrometheusExporter</a></li>
<li><a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCStackdriverStatsExporter.html">NCStackdriverStatsExporter</a></li>
<li><a target="javadoc" href="/apis/latest/org/apache/nlpcraft/model/opencensus/NCStackdriverTraceExporter.html">NCStackdriverTraceExporter</a></li>
</ul>
</section>
<section id="traces">
<h2 class="section-title">Traces</h2>
<p>
When traces are exporter, there are two service names used for NLPCraft traces that will appear on UI backends:
</p>
<ul>
<li><code>nlpcraft-server</code> for traces from REST server.</li>
<li><code>nlpcraft-probe</code> for traces from data probes.</li>
</ul>
<p>
All traces are extensively tagged with various information. Specifically, watch out for <code>srvReqId</code>,
<code>modelId</code> and <code>userId</code> tags that will help you navigate across traces pertaining to specific
request, models or users.
</p>
</section>
<section id="metrics">
<h2 class="section-title">Metrics</h2>
<p>
When it comes to metrics each exporter has different set of configuration for either a namespace or
name prefix on how these metrics will be available on the UI backends:
</p>
<ul>
<li>
<a target=_ href="https://prometheus.io/">Prometheus</a> and <a target=_ href="https://grafana.com">Grafana</a>
stats exporters by default use <code>nlpcraft-server</code> and <code>nlpcraft-probe</code> namespaces.
</li>
<li>
<a target=_ href="https://cloud.google.com/stackdriver/">Stackdriver</a> stats exporters use default
<code>custom.googleapis.com/nlpcraft/server</code> and <code>custom.googleapis.com/nlpcraft/probe</code> metric
name prefixes.
</li>
</ul>
<p>
<b>NOTE:</b> default namespaces and service prefixes can be changed via <a href="server-and-probe.html">configuration</a>
properties or environment variables
</p>
<p>
The following metrics are generated by the REST server:
</p>
<table class="gradient-table checks">
<thead>
<tr>
<th>Name <sub>without prefix or namespace</sub></th>
<th>Description</th>
</tr>
</thead>
<tbody>
{% for api in site.data.metrics.server %}
<tr>
<td>
<code>{{api.name}}_latdist_bucket</code><br>
<code>{{api.name}}_latdist_count</code><br>
<code>{{api.name}}_latdist_sum</code>
</td>
<td>Histogram, count and sum of values for the <b>{{api.description}}</b> latencies.</td>
</tr>
{% endfor %}
<tr>
<td>
<code>roundtrip_latdist_bucket</code><br>
<code>roundtrip_latdist_count</code><br>
<code>roundtrip_latdist_sum</code>
</td>
<td>Histogram, count and sum of values for the full server-probe-server round trip latencies.</td>
</tr>
</tbody>
</table>
<p>
The following metrics are generated by the data probe:
</p>
<table class="gradient-table checks">
<thead>
<tr>
<th>Name <sub>without prefix or namespace</sub></th>
<th>Description</th>
</tr>
</thead>
<tbody>
{% for api in site.data.metrics.probe %}
<tr>
<td>
<code>{{api.name}}_latdist_bucket</code><br>
<code>{{api.name}}_latdist_count</code><br>
<code>{{api.name}}_latdist_sum</code>
</td>
<td>Histogram, count and sum of values for the <b>{{api.description}}</b> latencies.</td>
</tr>
{% endfor %}
</tbody>
</table>
</section>
</div>
<div class="col-md-2 third-column">
<ul class="side-nav">
<li class="side-nav-title">On This Page</li>
<li><a href="#overview">Overview</a></li>
<li><a href="#server">Configuring Server</a></li>
<li><a href="#probe">Configuring Probe</a></li>
<li><a href="#traces">Traces</a></li>
<li><a href="#metrics">Metrics</a></li>
{% include quick-links.html %}
</ul>
</div>