You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ai...@apache.org on 2019/08/28 20:21:17 UTC

[nifi] 24/24: NIFI-6586 - documentation and comments

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

commit 9e35e4caf426ac690ee464509b4e0de73df60674
Author: Yolanda Davis <yo...@gmail.com>
AuthorDate: Tue Aug 27 14:46:24 2019 -0400

    NIFI-6586 - documentation and comments
    
    This closes NIFI-6586
    
    Signed-off-by: Andrew I. Christianson <an...@andyic.org>
---
 .../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);