/**
   * Gets the system diagnostics for this NiFi instance.
   *
   * @return A systemDiagnosticsEntity.
   * @throws InterruptedException if interrupted
   */
  @GET
  @Consumes(MediaType.WILDCARD)
  @Produces(MediaType.APPLICATION_JSON)
  @ApiOperation(
      value = "Gets the diagnostics for the system NiFi is running on",
      response = SystemDiagnosticsEntity.class,
      authorizations = {@Authorization(value = "Read - /system", type = "")})
  @ApiResponses(
      value = {
        @ApiResponse(code = 401, message = "Client could not be authenticated."),
        @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
      })
  public Response getSystemDiagnostics(
      @ApiParam(
              value =
                  "Whether or not to include the breakdown per node. Optional, defaults to false",
              required = false)
          @QueryParam("nodewise")
          @DefaultValue(NODEWISE)
          final Boolean nodewise,
      @ApiParam(value = "The id of the node where to get the status.", required = false)
          @QueryParam("clusterNodeId")
          final String clusterNodeId)
      throws InterruptedException {

    authorizeSystem();

    // ensure a valid request
    if (Boolean.TRUE.equals(nodewise) && clusterNodeId != null) {
      throw new IllegalArgumentException(
          "Nodewise requests cannot be directed at a specific node.");
    }

    if (isReplicateRequest()) {
      // determine where this request should be sent
      if (clusterNodeId == null) {
        final NodeResponse nodeResponse;

        // Determine whether we should replicate only to the cluster coordinator, or if we should
        // replicate directly
        // to the cluster nodes themselves.
        if (getReplicationTarget() == ReplicationTarget.CLUSTER_NODES) {
          nodeResponse =
              getRequestReplicator()
                  .replicate(
                      HttpMethod.GET, getAbsolutePath(), getRequestParameters(), getHeaders())
                  .awaitMergedResponse();
        } else {
          nodeResponse =
              getRequestReplicator()
                  .forwardToCoordinator(
                      getClusterCoordinatorNode(),
                      HttpMethod.GET,
                      getAbsolutePath(),
                      getRequestParameters(),
                      getHeaders())
                  .awaitMergedResponse();
        }

        final SystemDiagnosticsEntity entity =
            (SystemDiagnosticsEntity) nodeResponse.getUpdatedEntity();

        // ensure there is an updated entity (result of merging) and prune the response as necessary
        if (entity != null && !nodewise) {
          entity.getSystemDiagnostics().setNodeSnapshots(null);
        }

        return nodeResponse.getResponse();
      } else {
        return replicate(HttpMethod.GET);
      }
    }

    final SystemDiagnosticsDTO systemDiagnosticsDto = serviceFacade.getSystemDiagnostics();

    // create the response
    final SystemDiagnosticsEntity entity = new SystemDiagnosticsEntity();
    entity.setSystemDiagnostics(systemDiagnosticsDto);

    // generate the response
    return clusterContext(generateOkResponse(entity)).build();
  }