You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2017/09/11 17:17:43 UTC

nifi git commit: NIFI-4341 - add provenance repository storage usage in UI - addressing review comments - This closes #2119

Repository: nifi
Updated Branches:
  refs/heads/master 897b8ab60 -> 5957f6ee9


NIFI-4341 - add provenance repository storage usage in UI
- addressing review comments
- This closes #2119


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/5957f6ee
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/5957f6ee
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/5957f6ee

Branch: refs/heads/master
Commit: 5957f6ee95052a2d97377f422900087dade67470
Parents: 897b8ab
Author: Pierre Villard <pi...@gmail.com>
Authored: Fri Sep 1 11:16:29 2017 +0200
Committer: Matt Gilman <ma...@gmail.com>
Committed: Mon Sep 11 13:16:53 2017 -0400

----------------------------------------------------------------------
 .../org/apache/nifi/util/file/FileUtils.java    |  18 +++
 .../nifi/provenance/ProvenanceRepository.java   |  27 +++++
 .../provenance/MockProvenanceRepository.java    |  17 +++
 .../api/dto/SystemDiagnosticsSnapshotDTO.java   |  30 ++++-
 .../nifi/cluster/manager/StatusMerger.java      |   1 +
 .../apache/nifi/controller/FlowController.java  |   2 +-
 .../repository/FileSystemRepository.java        |  12 +-
 .../nifi/diagnostics/SystemDiagnostics.java     |  16 +++
 .../diagnostics/SystemDiagnosticsFactory.java   |  29 ++++-
 .../org/apache/nifi/web/api/dto/DtoFactory.java |   7 ++
 .../partials/cluster/cluster-content.jsp        |   3 +
 .../summary/system-diagnostics-dialog.jsp       | 106 +++++++++--------
 .../nifi-web-ui/src/main/webapp/css/summary.css |  17 ++-
 .../webapp/js/nf/cluster/nf-cluster-table.js    | 118 ++++++++++++++++++-
 .../webapp/js/nf/summary/nf-summary-table.js    |  13 ++
 .../PersistentProvenanceRepository.java         |  35 ++++++
 .../WriteAheadProvenanceRepository.java         |  47 +++++++-
 .../VolatileProvenanceRepository.java           |  24 +++-
 18 files changed, 451 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/file/FileUtils.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/file/FileUtils.java b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/file/FileUtils.java
index 960bc40..13b6a4b 100644
--- a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/file/FileUtils.java
+++ b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/file/FileUtils.java
@@ -592,4 +592,22 @@ public class FileUtils {
         return digest.digest();
     }
 
+    /**
+     * Returns the capacity for a given path
+     * @param path path
+     * @return total space
+     */
+    public static long getContainerCapacity(final Path path) {
+        return path.toFile().getTotalSpace();
+    }
+
+    /**
+     * Returns the free capacity for a given path
+     * @param path path
+     * @return usable space
+     */
+    public static long getContainerUsableSpace(final Path path) {
+        return path.toFile().getUsableSpace();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-framework-api/src/main/java/org/apache/nifi/provenance/ProvenanceRepository.java
----------------------------------------------------------------------
diff --git a/nifi-framework-api/src/main/java/org/apache/nifi/provenance/ProvenanceRepository.java b/nifi-framework-api/src/main/java/org/apache/nifi/provenance/ProvenanceRepository.java
index 516a36d..6d15d85 100644
--- a/nifi-framework-api/src/main/java/org/apache/nifi/provenance/ProvenanceRepository.java
+++ b/nifi-framework-api/src/main/java/org/apache/nifi/provenance/ProvenanceRepository.java
@@ -27,6 +27,7 @@ import org.apache.nifi.provenance.search.SearchableField;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
 public interface ProvenanceRepository extends ProvenanceEventRepository {
 
@@ -181,4 +182,30 @@ public interface ProvenanceRepository extends ProvenanceEventRepository {
      * {@link ProvenanceRepository#submitQuery(Query, NiFiUser)} method
      */
     List<SearchableField> getSearchableAttributes();
+
+    /**
+     * @return the names of all Containers that exist for this Provenance
+     * Repository
+     */
+    Set<String> getContainerNames();
+
+    /**
+     * @param containerName name of container to check capacity on
+     * @return the maximum number of bytes that can be stored in the storage
+     * mechanism that backs the container with the given name
+     * @throws java.io.IOException if unable to check capacity
+     * @throws IllegalArgumentException if no container exists with the given
+     * name
+     */
+    long getContainerCapacity(String containerName) throws IOException;
+
+    /**
+     * @param containerName to check space on
+     * @return the number of bytes available to be used used by the storage
+     * mechanism that backs the container with the given name
+     * @throws java.io.IOException if unable to check space
+     * @throws IllegalArgumentException if no container exists with the given
+     * name
+     */
+    long getContainerUsableSpace(String containerName) throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-mock/src/main/java/org/apache/nifi/provenance/MockProvenanceRepository.java
----------------------------------------------------------------------
diff --git a/nifi-mock/src/main/java/org/apache/nifi/provenance/MockProvenanceRepository.java b/nifi-mock/src/main/java/org/apache/nifi/provenance/MockProvenanceRepository.java
index 53c3c2e..0b4afcd 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/provenance/MockProvenanceRepository.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/provenance/MockProvenanceRepository.java
@@ -19,7 +19,9 @@ package org.apache.nifi.provenance;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.nifi.authorization.Authorizer;
@@ -151,4 +153,19 @@ public class MockProvenanceRepository implements ProvenanceRepository {
     public ProvenanceEventRepository getProvenanceEventRepository() {
         return this;
     }
+
+    @Override
+    public long getContainerCapacity(String containerName) throws IOException {
+        return 0;
+    }
+
+    @Override
+    public Set<String> getContainerNames() {
+        return new HashSet<String>();
+    }
+
+    @Override
+    public long getContainerUsableSpace(String containerName) throws IOException {
+        return 0;
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/SystemDiagnosticsSnapshotDTO.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/SystemDiagnosticsSnapshotDTO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/SystemDiagnosticsSnapshotDTO.java
index 47c58f6..2949776 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/SystemDiagnosticsSnapshotDTO.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/SystemDiagnosticsSnapshotDTO.java
@@ -62,6 +62,7 @@ public class SystemDiagnosticsSnapshotDTO implements Cloneable {
 
     private StorageUsageDTO flowFileRepositoryStorageUsage;
     private Set<StorageUsageDTO> contentRepositoryStorageUsage;
+    private Set<StorageUsageDTO> provenanceRepositoryStorageUsage;
     private Set<GarbageCollectionDTO> garbageCollection;
 
     private Date statsLastRefreshed;
@@ -204,6 +205,15 @@ public class SystemDiagnosticsSnapshotDTO implements Cloneable {
         this.contentRepositoryStorageUsage = contentRepositoryStorageUsage;
     }
 
+    @ApiModelProperty("The provenance repository storage usage.")
+    public Set<StorageUsageDTO> getProvenanceRepositoryStorageUsage() {
+        return provenanceRepositoryStorageUsage;
+    }
+
+    public void setProvenanceRepositoryStorageUsage(Set<StorageUsageDTO> provenanceRepositoryStorageUsage) {
+        this.provenanceRepositoryStorageUsage = provenanceRepositoryStorageUsage;
+    }
+
     @ApiModelProperty("The flowfile repository storage usage.")
     public StorageUsageDTO getFlowFileRepositoryStorageUsage() {
         return flowFileRepositoryStorageUsage;
@@ -357,14 +367,26 @@ public class SystemDiagnosticsSnapshotDTO implements Cloneable {
 
         final Set<StorageUsageDTO> contentRepoStorageUsage = new LinkedHashSet<>();
         other.setContentRepositoryStorageUsage(contentRepoStorageUsage);
-        for (final StorageUsageDTO usage : getContentRepositoryStorageUsage()) {
-            contentRepoStorageUsage.add(usage.clone());
+        if (getContentRepositoryStorageUsage() != null) {
+            for (final StorageUsageDTO usage : getContentRepositoryStorageUsage()) {
+                contentRepoStorageUsage.add(usage.clone());
+            }
+        }
+
+        final Set<StorageUsageDTO> provenanceRepoStorageUsage = new LinkedHashSet<>();
+        other.setProvenanceRepositoryStorageUsage(provenanceRepoStorageUsage);
+        if (getProvenanceRepositoryStorageUsage() != null) {
+            for (final StorageUsageDTO usage : getProvenanceRepositoryStorageUsage()) {
+                provenanceRepoStorageUsage.add(usage.clone());
+            }
         }
 
         final Set<GarbageCollectionDTO> gcUsage = new LinkedHashSet<>();
         other.setGarbageCollection(gcUsage);
-        for (final GarbageCollectionDTO gcDto : getGarbageCollection()) {
-            gcUsage.add(gcDto.clone());
+        if (getGarbageCollection() != null) {
+            for (final GarbageCollectionDTO gcDto : getGarbageCollection()) {
+                gcUsage.add(gcDto.clone());
+            }
         }
 
         other.setVersionInfo(getVersionInfo().clone());

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/StatusMerger.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/StatusMerger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/StatusMerger.java
index 9cceaf7..962ab2c 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/StatusMerger.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/manager/StatusMerger.java
@@ -608,6 +608,7 @@ public class StatusMerger {
         target.setUsedNonHeapBytes(target.getUsedNonHeapBytes() + toMerge.getUsedNonHeapBytes());
 
         merge(target.getContentRepositoryStorageUsage(), toMerge.getContentRepositoryStorageUsage());
+        merge(target.getProvenanceRepositoryStorageUsage(), toMerge.getProvenanceRepositoryStorageUsage());
         merge(target.getFlowFileRepositoryStorageUsage(), toMerge.getFlowFileRepositoryStorageUsage());
         mergeGarbageCollection(target.getGarbageCollection(), toMerge.getGarbageCollection());
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
index 94645cf..9c181ff 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
@@ -1684,7 +1684,7 @@ public class FlowController implements EventAccess, ControllerServiceProvider, R
 
     public SystemDiagnostics getSystemDiagnostics() {
         final SystemDiagnosticsFactory factory = new SystemDiagnosticsFactory();
-        return factory.create(flowFileRepository, contentRepository);
+        return factory.create(flowFileRepository, contentRepository, provenanceRepository);
     }
 
     //

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/FileSystemRepository.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/FileSystemRepository.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/FileSystemRepository.java
index 0bfe6a1..6a8d314 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/FileSystemRepository.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/FileSystemRepository.java
@@ -404,12 +404,16 @@ public class FileSystemRepository implements ContentRepository {
     @Override
     public long getContainerCapacity(final String containerName) throws IOException {
         final Path path = containers.get(containerName);
+
         if (path == null) {
             throw new IllegalArgumentException("No container exists with name " + containerName);
         }
-        long capacity = path.toFile().getTotalSpace();
+
+        long capacity = FileUtils.getContainerCapacity(path);
+
         if(capacity==0) {
-            throw new IOException("System returned total space of the partition for " + containerName + " is zero byte. Nifi can not create a zero sized FileSystemRepository");
+            throw new IOException("System returned total space of the partition for " + containerName + " is zero byte. "
+                    + "Nifi can not create a zero sized FileSystemRepository.");
         }
 
         return capacity;
@@ -418,10 +422,12 @@ public class FileSystemRepository implements ContentRepository {
     @Override
     public long getContainerUsableSpace(String containerName) throws IOException {
         final Path path = containers.get(containerName);
+
         if (path == null) {
             throw new IllegalArgumentException("No container exists with name " + containerName);
         }
-        return path.toFile().getUsableSpace();
+
+        return FileUtils.getContainerUsableSpace(path);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnostics.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnostics.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnostics.java
index e599e1f..b5d1597 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnostics.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnostics.java
@@ -43,6 +43,7 @@ public class SystemDiagnostics implements Cloneable {
 
     private StorageUsage flowFileRepositoryStorageUsage;
     private Map<String, StorageUsage> contentRepositoryStorageUsage;
+    private Map<String, StorageUsage> provenanceRepositoryStorageUsage;
     private Map<String, GarbageCollection> garbageCollection;
 
     private long creationTimestamp;
@@ -95,6 +96,10 @@ public class SystemDiagnostics implements Cloneable {
         this.contentRepositoryStorageUsage = contentRepositoryStorageUsage;
     }
 
+    public void setProvenanceRepositoryStorageUsage(final Map<String, StorageUsage> provenanceRepositoryStorageUsage) {
+        this.provenanceRepositoryStorageUsage = provenanceRepositoryStorageUsage;
+    }
+
     public long getTotalNonHeap() {
         return totalNonHeap;
     }
@@ -143,6 +148,10 @@ public class SystemDiagnostics implements Cloneable {
         return contentRepositoryStorageUsage;
     }
 
+    public Map<String, StorageUsage> getProvenanceRepositoryStorageUsage() {
+        return provenanceRepositoryStorageUsage;
+    }
+
     public long getFreeNonHeap() {
         return totalNonHeap - usedNonHeap;
     }
@@ -206,6 +215,13 @@ public class SystemDiagnostics implements Cloneable {
                 clonedMap.put(entry.getKey(), entry.getValue().clone());
             }
         }
+        if(provenanceRepositoryStorageUsage != null) {
+            final Map<String, StorageUsage> clonedMap = new LinkedHashMap<>();
+            clonedObj.setProvenanceRepositoryStorageUsage(clonedMap);
+            for (final Map.Entry<String, StorageUsage> entry : provenanceRepositoryStorageUsage.entrySet()) {
+                clonedMap.put(entry.getKey(), entry.getValue().clone());
+            }
+        }
         if (garbageCollection != null) {
             final Map<String, GarbageCollection> clonedMap = new LinkedHashMap<>();
             clonedObj.setGarbageCollection(clonedMap);

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnosticsFactory.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnosticsFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnosticsFactory.java
index 86a772a..45a8af7 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnosticsFactory.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/diagnostics/SystemDiagnosticsFactory.java
@@ -32,7 +32,7 @@ import java.util.Set;
 
 import org.apache.nifi.controller.repository.ContentRepository;
 import org.apache.nifi.controller.repository.FlowFileRepository;
-
+import org.apache.nifi.provenance.ProvenanceRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +44,7 @@ public class SystemDiagnosticsFactory {
 
     private final Logger logger = LoggerFactory.getLogger(SystemDiagnosticsFactory.class);
 
-    public SystemDiagnostics create(final FlowFileRepository flowFileRepo, final ContentRepository contentRepo) {
+    public SystemDiagnostics create(final FlowFileRepository flowFileRepo, final ContentRepository contentRepo, ProvenanceRepository provenanceRepository) {
         final SystemDiagnostics systemDiagnostics = new SystemDiagnostics();
 
         final MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
@@ -119,6 +119,31 @@ public class SystemDiagnosticsFactory {
         }
         systemDiagnostics.setContentRepositoryStorageUsage(fileRepositoryUsage);
 
+        // get provenance repository disk usage
+        final Set<String> provContainerNames = provenanceRepository.getContainerNames();
+        final Map<String, StorageUsage> provRepositoryUsage = new LinkedHashMap<>(provContainerNames.size());
+        for (final String containerName : provContainerNames) {
+            long containerCapacity = -1L;
+            long containerFree = 0L;
+
+            try {
+                containerFree = provenanceRepository.getContainerUsableSpace(containerName);
+                containerCapacity = provenanceRepository.getContainerCapacity(containerName);
+            } catch (final IOException ioe) {
+                logger.warn("Unable to determine Provenance Repository usage for container {} due to {}", containerName, ioe.toString());
+                if (logger.isDebugEnabled()) {
+                    logger.warn("", ioe);
+                }
+            }
+
+            final StorageUsage storageUsage = new StorageUsage();
+            storageUsage.setIdentifier(containerName);
+            storageUsage.setFreeSpace(containerFree);
+            storageUsage.setTotalSpace(containerCapacity);
+            provRepositoryUsage.put(containerName, storageUsage);
+        }
+        systemDiagnostics.setProvenanceRepositoryStorageUsage(provRepositoryUsage);
+
         // get the garbage collection statistics
         final Map<String, GarbageCollection> garbageCollection = new LinkedHashMap<>(garbageCollectors.size());
         for (final GarbageCollectorMXBean garbageCollector : garbageCollectors) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index a445e49..ed42e9f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -2706,6 +2706,13 @@ public final class DtoFactory {
             contentRepositoryStorageUsageDtos.add(createStorageUsageDTO(entry.getKey(), entry.getValue()));
         }
 
+        // provenance disk usage
+        final Set<SystemDiagnosticsSnapshotDTO.StorageUsageDTO> provenanceRepositoryStorageUsageDtos = new LinkedHashSet<>();
+        snapshot.setProvenanceRepositoryStorageUsage(provenanceRepositoryStorageUsageDtos);
+        for (final Map.Entry<String, StorageUsage> entry : sysDiagnostics.getProvenanceRepositoryStorageUsage().entrySet()) {
+            provenanceRepositoryStorageUsageDtos.add(createStorageUsageDTO(entry.getKey(), entry.getValue()));
+        }
+
         // garbage collection
         final Set<SystemDiagnosticsSnapshotDTO.GarbageCollectionDTO> garbageCollectionDtos = new LinkedHashSet<>();
         snapshot.setGarbageCollection(garbageCollectionDtos);

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/cluster/cluster-content.jsp
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/cluster/cluster-content.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/cluster/cluster-content.jsp
index 2b68060..75a43c5 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/cluster/cluster-content.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/cluster/cluster-content.jsp
@@ -45,6 +45,9 @@
         <div id="cluster-content-tab-content" class="configuration-tab">
             <div id="cluster-content-table" class="cluster-tabbed-table"></div>
         </div>
+        <div id="cluster-provenance-tab-content" class="configuration-tab">
+            <div id="cluster-provenance-table" class="cluster-tabbed-table"></div>
+        </div>
         <div id="cluster-version-tab-content" class="configuration-tab">
             <div id="cluster-version-table" class="cluster-tabbed-table"></div>
         </div>

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/summary/system-diagnostics-dialog.jsp
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/summary/system-diagnostics-dialog.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/summary/system-diagnostics-dialog.jsp
index 15d5310..4ad62a9 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/summary/system-diagnostics-dialog.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/summary/system-diagnostics-dialog.jsp
@@ -74,7 +74,7 @@
                     <div class="setting">
                         <div class="setting-header">Non-heap <span id="utilization-non-heap"></span></div>
                         <div class="setting-field">
-                            <table id="heap-table">
+                            <table id="non-heap-table">
                                 <tbody>
                                 <tr>
                                     <td class="memory-header setting-name">Max:</td>
@@ -147,70 +147,74 @@
                 </div>
             </div>
             <div id="system-tab-content"class="configuration-tab">
-            <div class="settings-left">
+                <div class="settings-left">
+                    <div class="setting">
+                        <div class="setting-name">Available Processors:</div>
+                        <div class="setting-field">
+                            <div id="available-processors"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="spacer"></div>
+                <div class="settings-right">
+                    <div class="setting">
+                        <div class="setting-name">
+                            Processor Load Average:
+                            <div class="fa fa-question-circle" alt="Info" title="Processor load average for the last minute. Not available on all platforms."></div>
+                        </div>
+                        <div class="setting-field">
+                            <div id="processor-load-average"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="clear"></div>
                 <div class="setting">
-                    <div class="setting-name">Available Processors:</div>
+                    <div class="setting-header">FlowFile Repository Storage</div>
                     <div class="setting-field">
-                        <div id="available-processors"></div>
+                        <div id="flow-file-repository-storage-usage-container"></div>
                     </div>
                 </div>
-            </div>
-            <div class="spacer"></div>
-            <div class="settings-right">
                 <div class="setting">
-                    <div class="setting-name">
-                        Processor Load Average:
-                        <div class="fa fa-question-circle" alt="Info" title="Processor load average for the last minute. Not available on all platforms."></div>
+                    <div class="setting-header">Content Repository Storage</div>
+                    <div class="setting-field">
+                        <div id="content-repository-storage-usage-container"></div>
                     </div>
+                </div>
+                <div class="setting">
+                    <div class="setting-header">Provenance Repository Storage</div>
                     <div class="setting-field">
-                        <div id="processor-load-average"></div>
+                        <div id="provenance-repository-storage-usage-container"></div>
                     </div>
                 </div>
             </div>
-            <div class="clear"></div>
-            <div class="setting">
-                <div class="setting-header">FlowFile Repository Storage</div>
-                <div class="setting-field">
-                    <div id="flow-file-repository-storage-usage-container"></div>
+            <div id="version-tab-content" class="configuration-tab">
+                <div class="setting">
+                    <div class="setting-header">NiFi</div>
+                    <dl class="setting-attributes-list">
+                        <dt>NiFi Version</dt><dd><span id="version-nifi"></span></dd>
+                        <dt>Tag</dt><dd><span id="version-build-tag"></span></dd>
+                        <dt>Build Date/Time</dt><dd><span id="version-build-timestamp"></span></dd>
+                        <dt>Branch</dt><dd><span id="version-build-branch"></span></dd>
+                        <dt>Revision</dt><dd><span id="version-build-revision"></span></dd>
+                    </dl>
                 </div>
-            </div>
-            <div class="setting">
-                <div class="setting-header">Content Repository Storage</div>
-                <div class="setting-field">
-                    <div id="content-repository-storage-usage-container"></div>
+                <div class="setting">
+                    <div class="setting-header">Java</div>
+                    <dl class="setting-attributes-list">
+                        <dt>Version</dt><dd><span id="version-java-version"></span></dd>
+                        <dt>Vendor</dt><dd><span id="version-java-vendor"></span></dd>
+                    </dl>
+                </div>
+                <div class="setting">
+                    <div class="setting-header">Operating System</div>
+                    <dl class="setting-attributes-list">
+                        <dt>Name</dt><dd><span id="version-os-name"></span></dd>
+                        <dt>Version</dt><dd><span id="version-os-version"></span></dd>
+                        <dt>Architecture</dt><dd><span id="version-os-arch"></span></dd>
+                    </dl>
                 </div>
             </div>
         </div>
-
-        <div id="version-tab-content" class="configuration-tab">
-            <div class="setting">
-                <div class="setting-header">NiFi</div>
-                <dl class="setting-attributes-list">
-                    <dt>NiFi Version</dt><dd><span id="version-nifi"></span></dd>
-                    <dt>Tag</dt><dd><span id="version-build-tag"></span></dd>
-                    <dt>Build Date/Time</dt><dd><span id="version-build-timestamp"></span></dd>
-                    <dt>Branch</dt><dd><span id="version-build-branch"></span></dd>
-                    <dt>Revision</dt><dd><span id="version-build-revision"></span></dd>
-                </dl>
-            </div>
-            <div class="setting">
-                <div class="setting-header">Java</div>
-                <dl class="setting-attributes-list">
-                    <dt>Version</dt><dd><span id="version-java-version"></span></dd>
-                    <dt>Vendor</dt><dd><span id="version-java-vendor"></span></dd>
-                </dl>
-            </div>
-            <div class="setting">
-                <div class="setting-header">Operating System</div>
-                <dl class="setting-attributes-list">
-                    <dt>Name</dt><dd><span id="version-os-name"></span></dd>
-                    <dt>Version</dt><dd><span id="version-os-version"></span></dd>
-                    <dt>Architecture</dt><dd><span id="version-os-arch"></span></dd>
-                </dl>
-            </div>
-        </div>
-
-        </div>
         <div id="system-diagnostics-refresh-container">
             <button id="system-diagnostics-refresh-button" class="refresh-button pointer fa fa-refresh" title="Refresh"></button>
             <div id="system-diagnostics-last-refreshed-container" class="last-refreshed-container">

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/summary.css
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/summary.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/summary.css
index 07bffc2..4e0e3f9 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/summary.css
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/summary.css
@@ -152,15 +152,15 @@ input.search-nodes {
     margin-top: 8px;
 }
 
-#heap-table {
+#heap-table, #non-heap-table {
     border-collapse: collapse;
 }
 
-#heap-table tr{
+#heap-table tr, #non-heap-table tr {
     height: 20px;
 }
 
-#heap-table span {
+#heap-table span, #non-heap-table span {
     font-weight: bold;
 }
 
@@ -191,6 +191,17 @@ input.search-nodes {
     margin-bottom: 10px;
 }
 
+#provenance-repository-storage-usage-container {
+    height: 179px;
+    overflow-y: scroll;
+    border: 1px solid #ccc;
+    padding: 4px;
+}
+
+#provenance-repository-storage-usage-container div.storage-usage {
+    margin-bottom: 10px;
+}
+
 .storage-usage-details {
     padding-top: 4px;
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js
index ac66249..0c94b31 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js
@@ -352,6 +352,89 @@
         }]
     };
 
+    var provenanceTab = {
+        name: 'Provenance Storage',
+        data: {
+            dataSet: 'systemDiagnostics',
+            update: updateProvenanceTableData
+        },
+        tabContentId: 'cluster-provenance-tab-content',
+        tableId: 'cluster-provenance-table',
+        tableColumnModel: [
+            {
+                id: 'node',
+                field: 'node',
+                name: 'Node Address',
+                sortable: true,
+                resizable: true,
+                formatter: nfCommon.genericValueFormatter
+            },
+            {
+                id: 'provenanceRepoId',
+                field: 'provenanceRepoId',
+                name: 'Provenance Repository',
+                sortable: true,
+                resizable: true,
+                formatter: nfCommon.genericValueFormatter
+            },
+            {
+                id: 'provenanceRepoTotal',
+                field: 'provenanceRepoTotal',
+                name: 'Total Space',
+                sortable: true,
+                resizable: true,
+                cssClass: 'cell-right',
+                headerCssClass: 'header-right',
+                formatter: nfCommon.genericValueFormatter
+            },
+            {
+                id: 'provenanceRepoUsed',
+                field: 'provenanceRepoUsed',
+                name: 'Used Space',
+                sortable: true,
+                resizable: true,
+                cssClass: 'cell-right',
+                headerCssClass: 'header-right',
+                formatter: nfCommon.genericValueFormatter
+            },
+            {
+                id: 'provenanceRepoFree',
+                field: 'provenanceRepoFree',
+                name: 'Free Space',
+                sortable: true,
+                resizable: true,
+                cssClass: 'cell-right',
+                headerCssClass: 'header-right',
+                formatter: nfCommon.genericValueFormatter
+            },
+            {
+                id: 'provenanceRepoUtil',
+                field: 'provenanceRepoUtil',
+                name: 'Utilization',
+                sortable: true,
+                resizable: true,
+                cssClass: 'cell-right',
+                headerCssClass: 'header-right',
+                formatter: nfCommon.genericValueFormatter
+            }
+        ],
+        tableIdColumn: 'id',
+        tableOptions: commonTableOptions,
+        tableOnClick: null,
+        createTableOnEnter: null,
+        cleanUpTable: null,
+        init: commonTableInit,
+        onSort: sort,
+        onTabSelected: onSelectTab,
+        filterOptions: [{
+            text: 'by address',
+            value: 'node'
+        }, {
+            text: 'by repository',
+            value: 'contentRepoId'
+        }]
+    };
+
     var versionTab = {
         name: 'Versions',
         data: {
@@ -432,7 +515,7 @@
         }]
     };
 
-    var clusterTabs = [nodesTab, systemTab, jvmTab, flowFileTab, contentTab, versionTab];
+    var clusterTabs = [nodesTab, systemTab, jvmTab, flowFileTab, contentTab, provenanceTab, versionTab];
     var tabsByName = {};
     var dataSetHandlers = {};
 
@@ -1201,6 +1284,39 @@
     }
 
     /**
+     * Applies system diagnostics data to the Provenance Storage tab.
+     */
+    function updateProvenanceTableData(systemDiagnosticsResponse) {
+        if (nfCommon.isDefinedAndNotNull(systemDiagnosticsResponse.systemDiagnostics)
+            && nfCommon.isDefinedAndNotNull(systemDiagnosticsResponse.systemDiagnostics.nodeSnapshots)) {
+
+            var provenanceStorageTableRows = [];
+            systemDiagnosticsResponse.systemDiagnostics.nodeSnapshots.forEach(function (nodeSnapshot) {
+                var snapshot = nodeSnapshot.snapshot;
+                snapshot.provenanceRepositoryStorageUsage.forEach(function (provenanceRepoUsage) {
+                	provenanceStorageTableRows.push({
+                        id: nodeSnapshot.nodeId + ':' + provenanceRepoUsage.identifier,
+                        address: nodeSnapshot.address,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        provenanceRepoId: provenanceRepoUsage.identifier,
+                        provenanceRepoTotal: provenanceRepoUsage.totalSpace,
+                        provenanceRepoUsed: provenanceRepoUsage.usedSpace,
+                        provenanceRepoFree: provenanceRepoUsage.freeSpace,
+                        provenanceRepoUtil: provenanceRepoUsage.utilization
+                    });
+                });
+            });
+
+            provenanceTab.rowCount = provenanceStorageTableRows.length;
+            provenanceTab.dataView.setItems(provenanceStorageTableRows);
+            provenanceTab.dataView.reSort();
+            provenanceTab.grid.invalidate();
+        } else {
+        	provenanceTab.rowCount = 0;
+        }
+    }
+
+    /**
      * Applies system diagnostics data to the Versions tab.
      */
     function updateVersionTableData(systemDiagnosticsResponse) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
index 92b622b..4a1c954 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
@@ -2415,6 +2415,19 @@
                 });
             }
 
+            // provenance repo storage usage
+            var provenanceRepositoryUsageContainer = $('#provenance-repository-storage-usage-container').empty();
+            if (nfCommon.isDefinedAndNotNull(aggregateSnapshot.provenanceRepositoryStorageUsage)) {
+                // sort the provenance repos
+                var sortedProvenanceRepositoryStorageUsage = aggregateSnapshot.provenanceRepositoryStorageUsage.sort(function (a, b) {
+                    return a.identifier === b.identifier ? 0 : a.identifier > b.identifier ? 1 : -1;
+                });
+                // add each to the UI
+                $.each(sortedProvenanceRepositoryStorageUsage, function (_, provenanceRepository) {
+                    addStorageUsage(provenanceRepositoryUsageContainer, provenanceRepository);
+                });
+            }
+
             // Version
             var versionSpanSelectorToFieldMap = {
                 '#version-nifi': aggregateSnapshot.versionInfo.niFiVersion,

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/PersistentProvenanceRepository.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/PersistentProvenanceRepository.java b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/PersistentProvenanceRepository.java
index efe6140..604bb3f 100644
--- a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/PersistentProvenanceRepository.java
+++ b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/PersistentProvenanceRepository.java
@@ -68,6 +68,7 @@ import org.apache.nifi.util.FormatUtils;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.util.RingBuffer;
 import org.apache.nifi.util.RingBuffer.ForEachEvaluator;
+import org.apache.nifi.util.file.FileUtils;
 import org.apache.nifi.util.StopWatch;
 import org.apache.nifi.util.Tuple;
 import org.apache.nifi.util.timebuffer.CountSizeEntityAccess;
@@ -521,6 +522,40 @@ public class PersistentProvenanceRepository implements ProvenanceRepository {
         return configuration;
     }
 
+    @Override
+    public Set<String> getContainerNames() {
+        return new HashSet<>(configuration.getStorageDirectories().keySet());
+    }
+
+    @Override
+    public long getContainerCapacity(final String containerName) throws IOException {
+        Map<String, File> map = configuration.getStorageDirectories();
+
+        File container = map.get(containerName);
+        if(container != null) {
+            long capacity = FileUtils.getContainerCapacity(container.toPath());
+            if(capacity==0) {
+                throw new IOException("System returned total space of the partition for " + containerName + " is zero byte. "
+                        + "Nifi can not create a zero sized provenance repository.");
+            }
+            return capacity;
+        } else {
+            throw new IllegalArgumentException("There is no defined container with name " + containerName);
+        }
+    }
+
+    @Override
+    public long getContainerUsableSpace(String containerName) throws IOException {
+        Map<String, File> map = configuration.getStorageDirectories();
+
+        File container = map.get(containerName);
+        if(container != null) {
+            return FileUtils.getContainerUsableSpace(container.toPath());
+        } else {
+            throw new IllegalArgumentException("There is no defined container with name " + containerName);
+        }
+    }
+
     private void recover() throws IOException {
         long maxId = -1L;
         long maxIndexedId = -1L;

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/WriteAheadProvenanceRepository.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/WriteAheadProvenanceRepository.java b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/WriteAheadProvenanceRepository.java
index 4782dbe..e1299d0 100644
--- a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/WriteAheadProvenanceRepository.java
+++ b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/WriteAheadProvenanceRepository.java
@@ -17,10 +17,6 @@
 
 package org.apache.nifi.provenance;
 
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.RequestAction;
 import org.apache.nifi.authorization.resource.Authorizable;
@@ -50,9 +46,18 @@ import org.apache.nifi.provenance.toc.TocWriter;
 import org.apache.nifi.provenance.util.CloseableUtil;
 import org.apache.nifi.reporting.Severity;
 import org.apache.nifi.util.NiFiProperties;
+import org.apache.nifi.util.file.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 
 /**
  * <p>
@@ -293,4 +298,38 @@ public class WriteAheadProvenanceRepository implements ProvenanceRepository {
     RepositoryConfiguration getConfig() {
         return this.config;
     }
+
+    @Override
+    public Set<String> getContainerNames() {
+        return new HashSet<>(config.getStorageDirectories().keySet());
+    }
+
+    @Override
+    public long getContainerCapacity(final String containerName) throws IOException {
+        Map<String, File> map = config.getStorageDirectories();
+
+        File container = map.get(containerName);
+        if(container != null) {
+            long capacity = FileUtils.getContainerCapacity(container.toPath());
+            if(capacity==0) {
+                throw new IOException("System returned total space of the partition for " + containerName + " is zero byte. "
+                        + "Nifi can not create a zero sized provenance repository.");
+            }
+            return capacity;
+        } else {
+            throw new IllegalArgumentException("There is no defined container with name " + containerName);
+        }
+    }
+
+    @Override
+    public long getContainerUsableSpace(String containerName) throws IOException {
+        Map<String, File> map = config.getStorageDirectories();
+
+        File container = map.get(containerName);
+        if(container != null) {
+            return FileUtils.getContainerUsableSpace(container.toPath());
+        } else {
+            throw new IllegalArgumentException("There is no defined container with name " + containerName);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/5957f6ee/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java
index c8511be..dbac23a 100644
--- a/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java
+++ b/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java
@@ -50,6 +50,7 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
@@ -70,7 +71,10 @@ public class VolatileProvenanceRepository implements ProvenanceRepository {
     // default property values
     public static final int DEFAULT_BUFFER_SIZE = 10000;
 
+    public static String CONTAINER_NAME = "in-memory";
+
     private final RingBuffer<ProvenanceEventRecord> ringBuffer;
+    private final int maxSize;
     private final List<SearchableField> searchableFields;
     private final List<SearchableField> searchableAttributes;
     private final ExecutorService queryExecService;
@@ -95,12 +99,13 @@ public class VolatileProvenanceRepository implements ProvenanceRepository {
         scheduledExecService = null;
         authorizer = null;
         resourceFactory = null;
+        maxSize = DEFAULT_BUFFER_SIZE;
     }
 
     public VolatileProvenanceRepository(final NiFiProperties nifiProperties) {
 
-        final int bufferSize = nifiProperties.getIntegerProperty(BUFFER_SIZE, DEFAULT_BUFFER_SIZE);
-        ringBuffer = new RingBuffer<>(bufferSize);
+        maxSize = nifiProperties.getIntegerProperty(BUFFER_SIZE, DEFAULT_BUFFER_SIZE);
+        ringBuffer = new RingBuffer<>(maxSize);
 
         final String indexedFieldString = nifiProperties.getProperty(NiFiProperties.PROVENANCE_INDEXED_FIELDS);
         final String indexedAttrString = nifiProperties.getProperty(NiFiProperties.PROVENANCE_INDEXED_ATTRIBUTES);
@@ -593,6 +598,21 @@ public class VolatileProvenanceRepository implements ProvenanceRepository {
         }
     }
 
+    @Override
+    public long getContainerCapacity(final String containerName) throws IOException {
+        return maxSize;
+    }
+
+    @Override
+    public Set<String> getContainerNames() {
+        return Collections.singleton(CONTAINER_NAME);
+    }
+
+    @Override
+    public long getContainerUsableSpace(String containerName) throws IOException {
+        return maxSize - ringBuffer.getSize();
+    }
+
     private AsyncLineageSubmission submitLineageComputation(final Collection<String> flowFileUuids, final NiFiUser user, final LineageComputationType computationType, final Long eventId) {
         final String userId = user.getIdentity();
         final AsyncLineageSubmission result = new AsyncLineageSubmission(computationType, eventId, flowFileUuids, 1, userId);