This is an automated email from the ASF dual-hosted git repository.
aichrist pushed a commit to branch analytics-framework
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/analytics-framework by this
push:
new daad09c NIFI-6586 - documentation and comments
daad09c is described below
commit daad09cc60d3c860724385214ee474681b6fa620
Author: Yolanda Davis <[email protected]>
AuthorDate: Tue Aug 27 14:46:24 2019 -0400
NIFI-6586 - documentation and comments
This closes NIFI-6586
Signed-off-by: Andrew I. Christianson <[email protected]>
---
.../controller/status/analytics/QueryWindow.java | 3 ++
.../status/analytics/StatusAnalytics.java | 17 ++++++++-
.../status/analytics/StatusAnalyticsEngine.java | 5 +++
.../status/analytics/StatusAnalyticsModel.java | 33 ++++++++++++++++
.../src/main/asciidoc/administration-guide.adoc | 15 +++++++-
nifi-docs/src/main/asciidoc/user-guide.adoc | 2 +
.../CachingConnectionStatusAnalyticsEngine.java | 12 +++++-
.../analytics/ConnectionStatusAnalytics.java | 44 +++++++++++++++++++++-
.../analytics/ConnectionStatusAnalyticsEngine.java | 10 +++++
.../analytics/StatusAnalyticsModelMapFactory.java | 22 ++++++++++-
.../analytics/StatusMetricExtractFunction.java | 6 +++
.../models/BivariateStatusAnalyticsModel.java | 6 ++-
.../analytics/models/OrdinaryLeastSquares.java | 6 +++
.../status/analytics/models/SimpleRegression.java | 8 ++++
14 files changed, 182 insertions(+), 7 deletions(-)
diff --git
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/QueryWindow.java
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/QueryWindow.java
index c477872..b404d19 100644
---
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/QueryWindow.java
+++
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/QueryWindow.java
@@ -18,6 +18,9 @@ package org.apache.nifi.controller.status.analytics;
import java.util.Date;
+/**
+ * QueryWindow is used to track time intervals for querying for observations
+ */
public class QueryWindow {
private long startTimeMillis;
diff --git
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalytics.java
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalytics.java
index a65629f..d8247b0 100644
---
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalytics.java
+++
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalytics.java
@@ -19,12 +19,27 @@ package org.apache.nifi.controller.status.analytics;
import java.util.Map;
/**
- * The StatusAnalytics interface offers methods for accessing predicted and
other values for a single component (Connection instance, e.g.)
+ * The StatusAnalytics interface offers methods for accessing predicted and
other values for a single component (Connection instance, e.g.).
*/
public interface StatusAnalytics {
+ /**
+ * Get the Query Window used by the analytics instance
+ * @return queryWindow
+ */
QueryWindow getQueryWindow();
+
+ /**
+ * Get available predictions where the key (String) in the map is the name
of the prediction and value (Long)
+ * is the value for the prediction
+ * @return map
+ */
Map<String,Long> getPredictions();
+
+ /**
+ * Return if analytics object supports online learning
+ * @return boolean
+ */
boolean supportsOnlineLearning();
diff --git
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsEngine.java
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsEngine.java
index 01021c2..57c13e6 100644
---
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsEngine.java
+++
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsEngine.java
@@ -18,6 +18,11 @@ package org.apache.nifi.controller.status.analytics;
public interface StatusAnalyticsEngine {
+ /**
+ * Retrieve status analytics object for given component
+ * @param componentId identifier for component
+ * @return componenet specific status analytics object
+ */
StatusAnalytics getStatusAnalytics(String componentId);
}
diff --git
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModel.java
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModel.java
index 8d601e6..3674b1f 100644
---
a/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModel.java
+++
b/nifi-api/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModel.java
@@ -21,11 +21,44 @@ import java.util.stream.Stream;
public interface StatusAnalyticsModel {
+ /**
+ * Train model with provided observations (features, labels/targets)
+ * @param features Stream of feature observation values
+ * @param labels target observation values
+ */
void learn(Stream<Double[]> features, Stream<Double> labels);
+
+ /**
+ * Return a prediction given observation values
+ * @param feature feature observation values values
+ * @return prediction of target/label
+ */
Double predict(Double[] feature);
+
+ /**
+ * Predict a feature given a known target and known predictor values (if
multiple predictors are included with model)
+ * @param predictVariableIndex index of feature that we would like to
predict (index should align with order provided in model learn method)
+ * @param knownVariablesWithIndex a map of known predictor values with
their indexes if available
+ * @param label known target value
+ * @return prediction for variable
+ */
Double predictVariable(Integer predictVariableIndex, Map<Integer,Double>
knownVariablesWithIndex, Double label);
+
+ /**
+ * Indicate if model supports online learning (e.g. can learn new
observation samples to create a model)
+ * @return boolean indicating online learning support
+ */
Boolean supportsOnlineLearning();
+
+ /**
+ * Returns a map of scores relevant to model (e.g. rSquared, Confidence
Intervals, etc.)
+ * @return Map of score names with values
+ */
Map<String,Double> getScores();
+
+ /**
+ * Resets a model by clearing observations and other calculations
+ */
void clear();
}
diff --git a/nifi-docs/src/main/asciidoc/administration-guide.adoc
b/nifi-docs/src/main/asciidoc/administration-guide.adoc
index 0b2fd8c..085083d 100644
--- a/nifi-docs/src/main/asciidoc/administration-guide.adoc
+++ b/nifi-docs/src/main/asciidoc/administration-guide.adoc
@@ -2379,6 +2379,17 @@ root@kdc:~# ll /http*
root@kdc:~#
....
+[[analytics_framework]]
+== Analytics Framework
+NiFi has an internal analytics framework which is currently used to predict
back pressure occurrence, given the configured settings for threshold on a
queue. The model used by default for prediction is an ordinary least squares
linear regression with multiple predictors which uses recent observations from
a queue to determine the next value or percentage of total threshold that will
be reached within a given interval.
+
+In order to generate predictions, snapshot history is reviewed on a regular
basis to obtain enough data to generate a model. By default snapshots are
captured every minute. Models may need at least 2 or more observation in order
to develop a reasonable prediction, therefore it may take up to 2 or more
minutes for predictions to be available by default. If predictions are needed
sooner than what is provided by default the timing of snapshots can be adjusted
using the `nifi.components.s [...]
+
+The prediction interval can also be configured to to project out further when
back pressure will occur. Prediction that are further out in time require
enough observations stored locally and may require tuning of the model's
scoring threshold to allow NiFi to use a model within reasonable accuracy.
Currently the R-Squared score is calculated and used to evaluate the generated
model (which compares the model's performance against simply predicting with
the average queue count/ byte size).
+
+See <<analytics_properties>> for complete information on configuring analytic
properties.
+
+
[[system_properties]]
== System Properties
The _nifi.properties_ file in the `conf` directory is the main configuration
file for controlling how NiFi runs. This section provides an overview of the
properties in this file and includes some notes on how to configure it in a way
that will make upgrading easier. *After making changes to this file, restart
NiFi in order
@@ -3320,14 +3331,14 @@ that is specified.
[[analytics_properties]]
=== Analytics Properties
-These properties determine the behavior of the internal NiFi Analytics
capability, such as backpressure prediction, and should be configured the same
way on all nodes.
+These properties determine the behavior of the internal NiFi predictive
analytics capability, such as backpressure prediction, and should be configured
the same way on all nodes.
|====
|*Property*|*Description*
|`nifi.analytics.predict.interval`|This indicates a time interval for which
analytical predictions (queue saturation, e.g.) should be made. The default
value is `3 mins`.
|`nifi.analytics.connection.model.implementation`|This is the implementation
class for the status analytics model used to make connection predictions. The
default value is
`org.apache.nifi.controller.status.analytics.models.OrdinaryLeastSquares`.
|`nifi.analytics.connection.model.score.name`|This is the name of the scoring
type that should be used to evaluate model. The default value is `rSquared`.
-|`nifi.analytics.connection.model.score.threshold`|This is the threshold for
the scoring value (where score should be above given threshold). The default
value is `.9`.
+|`nifi.analytics.connection.model.score.threshold`|This is the threshold for
the scoring value (where model score should be above given threshold). The
default value is `.9`.
|====
diff --git a/nifi-docs/src/main/asciidoc/user-guide.adoc
b/nifi-docs/src/main/asciidoc/user-guide.adoc
index 2a3a7b8..6e18563 100644
--- a/nifi-docs/src/main/asciidoc/user-guide.adoc
+++ b/nifi-docs/src/main/asciidoc/user-guide.adoc
@@ -1685,6 +1685,8 @@ The FlowFiles enqueued in a Connection can also be
deleted when necessary. The r
via `Empty queue` in the Connection's context menu. This action can also be
performed if the source and destination
are actively running.
+Hovering over the queue will also reveal predicted statistics on when the
queue may encounter back pressure, either due to the object count or content
size meeting the current threshold
+settings. Predictions will only be available when NiFi has enough data in
it's internal repository and if it's model is accurate enough to broadcast a
prediction.
[[Summary_Page]]
=== Summary Page
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/CachingConnectionStatusAnalyticsEngine.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/CachingConnectionStatusAnalyticsEngine.java
index 0cda68c..3588ed5 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/CachingConnectionStatusAnalyticsEngine.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/CachingConnectionStatusAnalyticsEngine.java
@@ -28,7 +28,12 @@ import org.slf4j.LoggerFactory;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
-
+/**
+ * <p>
+ * An implementation of {@link StatusAnalyticsEngine} that supports caching of
ConnectionStatusAnalytics objects.
+ * Caching engine in use is an in-memory cache where the caching policy is to
expire 30 minutes after initial write to cache.
+ * </p>
+ */
public class CachingConnectionStatusAnalyticsEngine extends
ConnectionStatusAnalyticsEngine{
private volatile Cache<String, StatusAnalytics> cache;
private static final Logger LOG =
LoggerFactory.getLogger(CachingConnectionStatusAnalyticsEngine.class);
@@ -43,6 +48,11 @@ public class CachingConnectionStatusAnalyticsEngine extends
ConnectionStatusAnal
.build();
}
+ /**
+ * Return a connection status analytics instance
+ * @param identifier connection identifier
+ * @return StatusAnalytics analytics object for given connection with id
+ */
@Override
public StatusAnalytics getStatusAnalytics(String identifier) {
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalytics.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalytics.java
index 68c472e..4bf1948 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalytics.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalytics.java
@@ -39,7 +39,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.primitives.Doubles;
-
+/**
+ * <p>
+ * An implementation of {@link StatusAnalytics} that is provides Connection
related analysis/prediction for a given connection instance
+ * </p>
+ */
public class ConnectionStatusAnalytics implements StatusAnalytics {
private static final Logger LOG =
LoggerFactory.getLogger(ConnectionStatusAnalytics.class);
@@ -65,6 +69,9 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
this.supportOnlineLearning = supportOnlineLearning;
}
+ /**
+ * Retrieve observations and train available model(s)
+ */
public void refresh() {
if (supportOnlineLearning && this.queryWindow != null) {
@@ -206,6 +213,11 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
}
+ /**
+ * Returns the predicted object count percentage in queue when compared to
threshold (maximum value allowed) at the next configured interval
+ *
+ * @return percentage of bytes used at next interval
+ */
public Long getNextIntervalPercentageUseCount() {
final Connection connection = getConnection();
@@ -223,6 +235,12 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
}
+ /**
+ * Returns the predicted bytes percentage in queue when compared to
threshold (maximum value allowed) at the next configured interval
+ *
+ * @return percentage of bytes used at next interval
+ */
+
public Long getNextIntervalPercentageUseBytes() {
final Connection connection = getConnection();
@@ -307,6 +325,13 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
return statusReport.getReportEntry(this.connectionIdentifier);
}
+ /**
+ * Convert time into valid prediction value (-1 indicates no prediction
available).
+ * Valid time translates to prediction equal to current time or in the
future
+ * @param prediction prediction value
+ * @param timeMillis time in milliseconds
+ * @return valid model boolean
+ */
private Long convertTimePrediction(Double prediction, Long timeMillis) {
if (Double.isNaN(prediction) || Double.isInfinite(prediction) ||
prediction < timeMillis) {
return -1L;
@@ -315,6 +340,11 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
}
}
+ /**
+ * Convert count into valid prediction value (-1 indicates no prediction
available)
+ * @param prediction prediction value
+ * @return prediction prediction value converted into valid value for
consumption
+ */
private Long convertCountPrediction(Double prediction) {
if (Double.isNaN(prediction) || Double.isInfinite(prediction) ||
prediction < 0) {
return -1L;
@@ -323,6 +353,12 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
}
}
+ /**
+ * Check if model is valid for prediction based on score
+ * @param model StatusAnalyticsModel object
+ * @return valid model boolean
+ */
+
private boolean validModel(StatusAnalyticsModel model) {
Double score = getScore(model);
@@ -337,6 +373,12 @@ public class ConnectionStatusAnalytics implements
StatusAnalytics {
}
}
+ /**
+ * Get specific score from trained model
+ * @param model StatusAnalyticsModel object
+ * @return scoreValue
+ */
+
private Double getScore(StatusAnalyticsModel model) {
if (model != null && model.getScores() != null) {
return model.getScores().get(scoreName);
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalyticsEngine.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalyticsEngine.java
index de815fa..17a2704 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalyticsEngine.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/ConnectionStatusAnalyticsEngine.java
@@ -25,6 +25,11 @@ import org.apache.nifi.util.Tuple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+/**
+ * <p>
+ * An implementation of {@link StatusAnalyticsEngine} that supports creation
of ConnectionStatusAnalytics objects
+ * </p>
+ */
public class ConnectionStatusAnalyticsEngine implements StatusAnalyticsEngine {
private static final Logger LOG =
LoggerFactory.getLogger(ConnectionStatusAnalyticsEngine.class);
protected final ComponentStatusRepository statusRepository;
@@ -46,6 +51,11 @@ public class ConnectionStatusAnalyticsEngine implements
StatusAnalyticsEngine {
this.scoreThreshold = scoreThreshold;
}
+ /**
+ * Return a connection status analytics instance
+ * @param identifier connection identifier
+ * @return status analytics object
+ */
@Override
public StatusAnalytics getStatusAnalytics(String identifier) {
ConnectionStatusAnalytics connectionStatusAnalytics = new
ConnectionStatusAnalytics(statusRepository, flowManager,
flowFileEventRepository, modelMap, identifier, false);
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModelMapFactory.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModelMapFactory.java
index b8e6775..a1e82b2 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModelMapFactory.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusAnalyticsModelMapFactory.java
@@ -30,6 +30,11 @@ import org.apache.nifi.util.Tuple;
import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
import org.apache.nifi.web.api.dto.status.StatusSnapshotDTO;
+/**
+ * <p>
+ * This factory supports the creation of models and their associated
extraction functions
+ * </p>
+ */
public class StatusAnalyticsModelMapFactory {
private final static String QUEUED_COUNT_METRIC = "queuedCount";
@@ -39,7 +44,12 @@ public class StatusAnalyticsModelMapFactory {
private final static String OUTPUT_COUNT_METRIC = "outputCount";
private final static String OUTPUT_BYTES_METRIC = "outputBytes";
-
+ /**
+ * Return mapping of models and extraction functions for connection status
analytics prediction instances
+ * @param extensionManager Extension Manager object for instantiating
classes
+ * @param niFiProperties NiFi Properties object
+ * @return
+ */
public static Map<String, Tuple<StatusAnalyticsModel,
StatusMetricExtractFunction>> getConnectionStatusModelMap(ExtensionManager
extensionManager, NiFiProperties niFiProperties){
Map<String, Tuple<StatusAnalyticsModel,
StatusMetricExtractFunction>> modelMap = new HashMap<>();
StatusMetricExtractFunction extract =
getConnectionStatusExtractFunction();
@@ -50,6 +60,12 @@ public class StatusAnalyticsModelMapFactory {
return modelMap;
}
+ /**
+ * Create a connection model instance using configurations set in NiFi
properties
+ * @param extensionManager Extension Manager object for instantiating
classes
+ * @param nifiProperties NiFi Properties object
+ * @return statusAnalyticsModel
+ */
private static StatusAnalyticsModel createModelInstance(ExtensionManager
extensionManager, NiFiProperties nifiProperties) {
final String implementationClassName =
nifiProperties.getProperty(NiFiProperties.ANALYTICS_CONNECTION_MODEL_IMPLEMENTATION,
NiFiProperties.DEFAULT_ANALYTICS_CONNECTION_MODEL_IMPLEMENTATION);
if (implementationClassName == null) {
@@ -63,6 +79,10 @@ public class StatusAnalyticsModelMapFactory {
}
}
+ /**
+ * Get a connection status extract function instance
+ * @return StatusMetricExtractFunction
+ */
private static StatusMetricExtractFunction
getConnectionStatusExtractFunction() {
return (metric, statusHistory) -> {
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusMetricExtractFunction.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusMetricExtractFunction.java
index 38d2c86..5a9f705 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusMetricExtractFunction.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/StatusMetricExtractFunction.java
@@ -23,5 +23,11 @@ import org.apache.nifi.util.Tuple;
public interface StatusMetricExtractFunction {
+ /**
+ * Searches through status history to extract observations for a given
metric
+ * @param metric metric value that should be extracted
+ * @param statusHistory StatusHistory object used to search metrics
+ * @return a Tuple with extracted observations (features and
targets/labels)
+ */
Tuple<Stream<Double[]>, Stream<Double>> extractMetric(String metric,
StatusHistory statusHistory);
}
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/BivariateStatusAnalyticsModel.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/BivariateStatusAnalyticsModel.java
index 9dcc45b..2745bf1 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/BivariateStatusAnalyticsModel.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/BivariateStatusAnalyticsModel.java
@@ -20,7 +20,11 @@ import java.util.Map;
import java.util.stream.Stream;
import org.apache.nifi.controller.status.analytics.StatusAnalyticsModel;
-
+/**
+ * <p>
+ * An abstract class for implementations of {@link StatusAnalyticsModel} which
makes bivariate models compatible with analytics interface
+ * </p>
+ */
public abstract class BivariateStatusAnalyticsModel implements
StatusAnalyticsModel {
@Override
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/OrdinaryLeastSquares.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/OrdinaryLeastSquares.java
index 74aa8f8..9ee5e03 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/OrdinaryLeastSquares.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/OrdinaryLeastSquares.java
@@ -27,6 +27,12 @@ import
org.apache.nifi.controller.status.analytics.StatusAnalyticsModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+/**
+ * <p>
+ * An implementation of the {@link StatusAnalyticsModel} that uses Ordinary
Least Squares computation for regression.
+ * This model support multiple regression
+ * </p>
+ */
public class OrdinaryLeastSquares implements StatusAnalyticsModel {
private static final Logger LOG =
LoggerFactory.getLogger(OrdinaryLeastSquares.class);
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/SimpleRegression.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/SimpleRegression.java
index a6f1455..1b6e40e 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/SimpleRegression.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/status/analytics/models/SimpleRegression.java
@@ -23,9 +23,17 @@ import java.util.stream.Stream;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.math3.stat.regression.RegressionResults;
+import org.apache.nifi.controller.status.analytics.StatusAnalyticsModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+/**
+ * <p>
+ * An implementation of the {@link StatusAnalyticsModel} that uses the
SimpleRegression class from math for computation of regression. It only
supports Bivariates
+ * for x,y (multiple predictors are not supported by SimpleRegression). Online
learning is supported for collecting multiple samples at different points in
time
+ *
+ * </p>
+ */
public class SimpleRegression extends BivariateStatusAnalyticsModel {
private static final Logger LOG =
LoggerFactory.getLogger(SimpleRegression.class);