You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2017/10/02 12:27:00 UTC

[jira] [Commented] (FLINK-7710) Port CheckpointStatsHandler to new REST endpoint

    [ https://issues.apache.org/jira/browse/FLINK-7710?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16187971#comment-16187971 ] 

ASF GitHub Bot commented on FLINK-7710:
---------------------------------------

Github user tillrohrmann commented on a diff in the pull request:

    https://github.com/apache/flink/pull/4750#discussion_r142124112
  
    --- Diff: flink-runtime/src/main/java/org/apache/flink/runtime/rest/messages/CheckpointStatistics.java ---
    @@ -0,0 +1,763 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +
    +package org.apache.flink.runtime.rest.messages;
    +
    +import org.apache.flink.runtime.checkpoint.CheckpointStatsStatus;
    +import org.apache.flink.runtime.rest.handler.job.checkpoints.CheckpointStatisticsHandler;
    +import org.apache.flink.util.Preconditions;
    +
    +import com.fasterxml.jackson.annotation.JsonCreator;
    +import com.fasterxml.jackson.annotation.JsonProperty;
    +import com.fasterxml.jackson.annotation.JsonSubTypes;
    +import com.fasterxml.jackson.annotation.JsonTypeInfo;
    +
    +import javax.annotation.Nullable;
    +
    +import java.util.List;
    +import java.util.Objects;
    +
    +/**
    + * Response of the {@link CheckpointStatisticsHandler}.
    + */
    +public class CheckpointStatistics implements ResponseBody {
    +
    +	public static final String FIELD_NAME_COUNTS = "counts";
    +
    +	public static final String FIELD_NAME_SUMMARY = "summary";
    +
    +	public static final String FIELD_NAME_LATEST_CHECKPOINTS = "latest";
    +
    +	public static final String FIELD_NAME_HISTORY = "history";
    +
    +	@JsonProperty(FIELD_NAME_COUNTS)
    +	private final Counts counts;
    +
    +	@JsonProperty(FIELD_NAME_SUMMARY)
    +	private final Summary summary;
    +
    +	@JsonProperty(FIELD_NAME_LATEST_CHECKPOINTS)
    +	private final LatestCheckpoints latestCheckpoints;
    +
    +	@JsonProperty(FIELD_NAME_HISTORY)
    +	private final List<BaseCheckpointStatistics> history;
    +
    +	@JsonCreator
    +	public CheckpointStatistics(
    +			@JsonProperty(FIELD_NAME_COUNTS) Counts counts,
    +			@JsonProperty(FIELD_NAME_SUMMARY) Summary summary,
    +			@JsonProperty(FIELD_NAME_LATEST_CHECKPOINTS) LatestCheckpoints latestCheckpoints,
    +			@JsonProperty(FIELD_NAME_HISTORY) List<BaseCheckpointStatistics> history) {
    +		this.counts = Preconditions.checkNotNull(counts);
    +		this.summary = Preconditions.checkNotNull(summary);
    +		this.latestCheckpoints = Preconditions.checkNotNull(latestCheckpoints);
    +		this.history = Preconditions.checkNotNull(history);
    +	}
    +
    +	public Counts getCounts() {
    +		return counts;
    +	}
    +
    +	public Summary getSummary() {
    +		return summary;
    +	}
    +
    +	public LatestCheckpoints getLatestCheckpoints() {
    +		return latestCheckpoints;
    +	}
    +
    +	public List<BaseCheckpointStatistics> getHistory() {
    +		return history;
    +	}
    +
    +	@Override
    +	public boolean equals(Object o) {
    +		if (this == o) {
    +			return true;
    +		}
    +		if (o == null || getClass() != o.getClass()) {
    +			return false;
    +		}
    +		CheckpointStatistics that = (CheckpointStatistics) o;
    +		return Objects.equals(counts, that.counts) &&
    +			Objects.equals(summary, that.summary) &&
    +			Objects.equals(latestCheckpoints, that.latestCheckpoints) &&
    +			Objects.equals(history, that.history);
    +	}
    +
    +	@Override
    +	public int hashCode() {
    +		return Objects.hash(counts, summary, latestCheckpoints, history);
    +	}
    +
    +	// ------------------------------------------------------------------
    +	// Inner classes
    +	// ------------------------------------------------------------------
    +
    +	/**
    +	 * Checkpoint counts.
    +	 */
    +	public static final class Counts {
    +
    +		public static final String FIELD_NAME_RESTORED_CHECKPOINTS = "restored";
    +
    +		public static final String FIELD_NAME_TOTAL_CHECKPOINTS = "total";
    +
    +		public static final String FIELD_NAME_IN_PROGRESS_CHECKPOINTS = "in_progress";
    +
    +		public static final String FIELD_NAME_COMPLETED_CHECKPOINTS = "completed";
    +
    +		public static final String FIELD_NAME_FAILED_CHECKPOINTS = "failed";
    +
    +		@JsonProperty(FIELD_NAME_RESTORED_CHECKPOINTS)
    +		private final long numberRestoredCheckpoints;
    +
    +		@JsonProperty(FIELD_NAME_TOTAL_CHECKPOINTS)
    +		private final long totalNumberCheckpoints;
    +
    +		@JsonProperty(FIELD_NAME_IN_PROGRESS_CHECKPOINTS)
    +		private final int numberInProgressCheckpoints;
    +
    +		@JsonProperty(FIELD_NAME_COMPLETED_CHECKPOINTS)
    +		private final long numberCompletedCheckpoints;
    +
    +		@JsonProperty(FIELD_NAME_FAILED_CHECKPOINTS)
    +		private final long numberFailedCheckpoints;
    +
    +		@JsonCreator
    +		public Counts(
    +				@JsonProperty(FIELD_NAME_RESTORED_CHECKPOINTS) long numberRestoredCheckpoints,
    +				@JsonProperty(FIELD_NAME_TOTAL_CHECKPOINTS) long totalNumberCheckpoints,
    +				@JsonProperty(FIELD_NAME_IN_PROGRESS_CHECKPOINTS) int numberInProgressCheckpoints,
    +				@JsonProperty(FIELD_NAME_COMPLETED_CHECKPOINTS) long numberCompletedCheckpoints,
    +				@JsonProperty(FIELD_NAME_FAILED_CHECKPOINTS) long numberFailedCheckpoints) {
    +			this.numberRestoredCheckpoints = numberRestoredCheckpoints;
    +			this.totalNumberCheckpoints = totalNumberCheckpoints;
    +			this.numberInProgressCheckpoints = numberInProgressCheckpoints;
    +			this.numberCompletedCheckpoints = numberCompletedCheckpoints;
    +			this.numberFailedCheckpoints = numberFailedCheckpoints;
    +		}
    +
    +		public long getNumberRestoredCheckpoints() {
    +			return numberRestoredCheckpoints;
    +		}
    +
    +		public long getTotalNumberCheckpoints() {
    +			return totalNumberCheckpoints;
    +		}
    +
    +		public int getNumberInProgressCheckpoints() {
    +			return numberInProgressCheckpoints;
    +		}
    +
    +		public long getNumberCompletedCheckpoints() {
    +			return numberCompletedCheckpoints;
    +		}
    +
    +		public long getNumberFailedCheckpoints() {
    +			return numberFailedCheckpoints;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			Counts counts = (Counts) o;
    +			return numberRestoredCheckpoints == counts.numberRestoredCheckpoints &&
    +				totalNumberCheckpoints == counts.totalNumberCheckpoints &&
    +				numberInProgressCheckpoints == counts.numberInProgressCheckpoints &&
    +				numberCompletedCheckpoints == counts.numberCompletedCheckpoints &&
    +				numberFailedCheckpoints == counts.numberFailedCheckpoints;
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(numberRestoredCheckpoints, totalNumberCheckpoints, numberInProgressCheckpoints, numberCompletedCheckpoints, numberFailedCheckpoints);
    +		}
    +	}
    +
    +	/**
    +	 * Checkpoint summary.
    +	 */
    +	public static final class Summary {
    +
    +		public static final String FIELD_NAME_STATE_SIZE = "state_size";
    +
    +		public static final String FIELD_NAME_DURATION = "end_to_end_duration";
    +
    +		public static final String FIELD_NAME_ALIGNMENT_BUFFERED = "alignment_buffered";
    +
    +		@JsonProperty(FIELD_NAME_STATE_SIZE)
    +		private final MinMaxAvgStatistics stateSize;
    +
    +		@JsonProperty(FIELD_NAME_DURATION)
    +		private final MinMaxAvgStatistics duration;
    +
    +		@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED)
    +		private final MinMaxAvgStatistics alignmentBuffered;
    +
    +		@JsonCreator
    +		public Summary(
    +				@JsonProperty(FIELD_NAME_STATE_SIZE) MinMaxAvgStatistics stateSize,
    +				@JsonProperty(FIELD_NAME_DURATION) MinMaxAvgStatistics duration,
    +				@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED) MinMaxAvgStatistics alignmentBuffered) {
    +			this.stateSize = stateSize;
    +			this.duration = duration;
    +			this.alignmentBuffered = alignmentBuffered;
    +		}
    +
    +		public MinMaxAvgStatistics getStateSize() {
    +			return stateSize;
    +		}
    +
    +		public MinMaxAvgStatistics getDuration() {
    +			return duration;
    +		}
    +
    +		public MinMaxAvgStatistics getAlignmentBuffered() {
    +			return alignmentBuffered;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			Summary summary = (Summary) o;
    +			return Objects.equals(stateSize, summary.stateSize) &&
    +				Objects.equals(duration, summary.duration) &&
    +				Objects.equals(alignmentBuffered, summary.alignmentBuffered);
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(stateSize, duration, alignmentBuffered);
    +		}
    +	}
    +
    +	/**
    +	 * Minimum, maximum and average statistics.
    +	 */
    +	public static final class MinMaxAvgStatistics {
    +
    +		public static final String FIELD_NAME_MINIMUM = "min";
    +
    +		public static final String FIELD_NAME_MAXIMUM = "max";
    +
    +		public static final String FIELD_NAME_AVERAGE = "avg";
    +
    +		@JsonProperty(FIELD_NAME_MINIMUM)
    +		private final long minimum;
    +
    +		@JsonProperty(FIELD_NAME_MAXIMUM)
    +		private final long maximum;
    +
    +		@JsonProperty(FIELD_NAME_AVERAGE)
    +		private final long average;
    +
    +		@JsonCreator
    +		public MinMaxAvgStatistics(
    +				@JsonProperty(FIELD_NAME_MINIMUM) long minimum,
    +				@JsonProperty(FIELD_NAME_MAXIMUM) long maximum,
    +				@JsonProperty(FIELD_NAME_AVERAGE) long average) {
    +			this.minimum = minimum;
    +			this.maximum = maximum;
    +			this.average = average;
    +		}
    +
    +		public long getMinimum() {
    +			return minimum;
    +		}
    +
    +		public long getMaximum() {
    +			return maximum;
    +		}
    +
    +		public long getAverage() {
    +			return average;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			MinMaxAvgStatistics that = (MinMaxAvgStatistics) o;
    +			return minimum == that.minimum &&
    +				maximum == that.maximum &&
    +				average == that.average;
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(minimum, maximum, average);
    +		}
    +	}
    +
    +	/**
    +	 * Statistics about the latest checkpoints.
    +	 */
    +	public static final class LatestCheckpoints {
    +
    +		public static final String FIELD_NAME_COMPLETED = "completed";
    +
    +		public static final String FIELD_NAME_SAVEPOINT = "savepoint";
    +
    +		public static final String FIELD_NAME_FAILED = "failed";
    +
    +		public static final String FIELD_NAME_RESTORED = "restored";
    +
    +		@JsonProperty(FIELD_NAME_COMPLETED)
    +		@Nullable
    +		private final CompletedCheckpointStatistics completedCheckpointStatistics;
    +
    +		@JsonProperty(FIELD_NAME_SAVEPOINT)
    +		@Nullable
    +		private final CompletedCheckpointStatistics savepointStatistics;
    +
    +		@JsonProperty(FIELD_NAME_FAILED)
    +		@Nullable
    +		private final FailedCheckpointStatistics failedCheckpointStatistics;
    +
    +		@JsonProperty(FIELD_NAME_RESTORED)
    +		@Nullable
    +		private final RestoredCheckpointStatistics restoredCheckpointStatistics;
    +
    +		@JsonCreator
    +		public LatestCheckpoints(
    +				@JsonProperty(FIELD_NAME_COMPLETED) @Nullable CompletedCheckpointStatistics completedCheckpointStatistics,
    +				@JsonProperty(FIELD_NAME_SAVEPOINT) @Nullable CompletedCheckpointStatistics savepointStatistics,
    +				@JsonProperty(FIELD_NAME_FAILED) @Nullable FailedCheckpointStatistics failedCheckpointStatistics,
    +				@JsonProperty(FIELD_NAME_RESTORED) @Nullable RestoredCheckpointStatistics restoredCheckpointStatistics) {
    +			this.completedCheckpointStatistics = completedCheckpointStatistics;
    +			this.savepointStatistics = savepointStatistics;
    +			this.failedCheckpointStatistics = failedCheckpointStatistics;
    +			this.restoredCheckpointStatistics = restoredCheckpointStatistics;
    +		}
    +
    +		@Nullable
    +		public CompletedCheckpointStatistics getCompletedCheckpointStatistics() {
    +			return completedCheckpointStatistics;
    +		}
    +
    +		@Nullable
    +		public CompletedCheckpointStatistics getSavepointStatistics() {
    +			return savepointStatistics;
    +		}
    +
    +		@Nullable
    +		public FailedCheckpointStatistics getFailedCheckpointStatistics() {
    +			return failedCheckpointStatistics;
    +		}
    +
    +		@Nullable
    +		public RestoredCheckpointStatistics getRestoredCheckpointStatistics() {
    +			return restoredCheckpointStatistics;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			LatestCheckpoints that = (LatestCheckpoints) o;
    +			return Objects.equals(completedCheckpointStatistics, that.completedCheckpointStatistics) &&
    +				Objects.equals(savepointStatistics, that.savepointStatistics) &&
    +				Objects.equals(failedCheckpointStatistics, that.failedCheckpointStatistics) &&
    +				Objects.equals(restoredCheckpointStatistics, that.restoredCheckpointStatistics);
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(completedCheckpointStatistics, savepointStatistics, failedCheckpointStatistics, restoredCheckpointStatistics);
    +		}
    +	}
    +
    +	/**
    +	 * Statistics for a checkpoint.
    +	 */
    +	@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class")
    +	@JsonSubTypes({
    +		@JsonSubTypes.Type(value = CompletedCheckpointStatistics.class, name = "completed"),
    +		@JsonSubTypes.Type(value = FailedCheckpointStatistics.class, name = "failed")})
    +	public static class BaseCheckpointStatistics {
    +
    +		public static final String FIELD_NAME_ID = "id";
    +
    +		public static final String FIELD_NAME_STATUS = "status";
    +
    +		public static final String FIELD_NAME_IS_SAVEPOINT = "is_savepoint";
    +
    +		public static final String FIELD_NAME_TRIGGER_TIMESTAMP = "trigger_timestamp";
    +
    +		public static final String FIELD_NAME_LATEST_ACK_TIMESTAMP = "latest_ack_timestamp";
    +
    +		public static final String FIELD_NAME_STATE_SIZE = "state_size";
    +
    +		public static final String FIELD_NAME_DURATION = "end_to_end_duration";
    +
    +		public static final String FIELD_NAME_ALIGNMENT_BUFFERED = "alignment_buffered";
    +
    +		public static final String FIELD_NAME_NUM_SUBTASKS = "num_subtasks";
    +
    +		public static final String FIELD_NAME_NUM_ACK_SUBTASKS = "num_acknowledged_subtasks";
    +
    +		@JsonProperty(FIELD_NAME_ID)
    +		private final long id;
    +
    +		@JsonProperty(FIELD_NAME_STATUS)
    +		private final CheckpointStatsStatus status;
    +
    +		@JsonProperty(FIELD_NAME_IS_SAVEPOINT)
    +		private final boolean savepoint;
    +
    +		@JsonProperty(FIELD_NAME_TRIGGER_TIMESTAMP)
    +		private final long triggerTimestamp;
    +
    +		@JsonProperty(FIELD_NAME_LATEST_ACK_TIMESTAMP)
    +		private final long latestAckTimestamp;
    +
    +		@JsonProperty(FIELD_NAME_STATE_SIZE)
    +		private final long stateSize;
    +
    +		@JsonProperty(FIELD_NAME_DURATION)
    +		private final long duration;
    +
    +		@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED)
    +		private final long alignmentBuffered;
    +
    +		@JsonProperty(FIELD_NAME_NUM_SUBTASKS)
    +		private final int numSubtasks;
    +
    +		@JsonProperty(FIELD_NAME_NUM_ACK_SUBTASKS)
    +		private final int numAckSubtasks;
    +
    +		@JsonCreator
    +		protected BaseCheckpointStatistics(
    +				@JsonProperty(FIELD_NAME_ID) long id,
    +				@JsonProperty(FIELD_NAME_STATUS) CheckpointStatsStatus status,
    +				@JsonProperty(FIELD_NAME_IS_SAVEPOINT) boolean savepoint,
    +				@JsonProperty(FIELD_NAME_TRIGGER_TIMESTAMP) long triggerTimestamp,
    +				@JsonProperty(FIELD_NAME_LATEST_ACK_TIMESTAMP) long latestAckTimestamp,
    +				@JsonProperty(FIELD_NAME_STATE_SIZE) long stateSize,
    +				@JsonProperty(FIELD_NAME_DURATION) long duration,
    +				@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED) long alignmentBuffered,
    +				@JsonProperty(FIELD_NAME_NUM_SUBTASKS) int numSubtasks,
    +				@JsonProperty(FIELD_NAME_NUM_ACK_SUBTASKS) int numAckSubtasks) {
    +			this.id = id;
    +			this.status = Preconditions.checkNotNull(status);
    +			this.savepoint = savepoint;
    +			this.triggerTimestamp = triggerTimestamp;
    +			this.latestAckTimestamp = latestAckTimestamp;
    +			this.stateSize = stateSize;
    +			this.duration = duration;
    +			this.alignmentBuffered = alignmentBuffered;
    +			this.numSubtasks = numSubtasks;
    +			this.numAckSubtasks = numAckSubtasks;
    +		}
    +
    +		public long getId() {
    +			return id;
    +		}
    +
    +		public CheckpointStatsStatus getStatus() {
    +			return status;
    +		}
    +
    +		public boolean isSavepoint() {
    +			return savepoint;
    +		}
    +
    +		public long getTriggerTimestamp() {
    +			return triggerTimestamp;
    +		}
    +
    +		public long getLatestAckTimestamp() {
    +			return latestAckTimestamp;
    +		}
    +
    +		public long getStateSize() {
    +			return stateSize;
    +		}
    +
    +		public long getDuration() {
    +			return duration;
    +		}
    +
    +		public long getAlignmentBuffered() {
    +			return alignmentBuffered;
    +		}
    +
    +		public int getNumSubtasks() {
    +			return numSubtasks;
    +		}
    +
    +		public int getNumAckSubtasks() {
    +			return numAckSubtasks;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			BaseCheckpointStatistics that = (BaseCheckpointStatistics) o;
    +			return id == that.id &&
    +				savepoint == that.savepoint &&
    +				triggerTimestamp == that.triggerTimestamp &&
    +				latestAckTimestamp == that.latestAckTimestamp &&
    +				stateSize == that.stateSize &&
    +				duration == that.duration &&
    +				alignmentBuffered == that.alignmentBuffered &&
    +				numSubtasks == that.numSubtasks &&
    +				numAckSubtasks == that.numAckSubtasks &&
    +				status == that.status;
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(id, status, savepoint, triggerTimestamp, latestAckTimestamp, stateSize, duration, alignmentBuffered, numSubtasks, numAckSubtasks);
    +		}
    +	}
    +
    +	/**
    +	 * Statistics for a completed checkpoint.
    +	 */
    +	public static final class CompletedCheckpointStatistics extends BaseCheckpointStatistics {
    +
    +		public static final String FIELD_NAME_EXTERNAL_PATH = "external_path";
    +
    +		public static final String FIELD_NAME_DISCARDED = "discarded";
    +
    +		@JsonProperty(FIELD_NAME_EXTERNAL_PATH)
    +		@Nullable
    +		private final String externalPath;
    +
    +		@JsonProperty(FIELD_NAME_DISCARDED)
    +		private final boolean discarded;
    +
    +		@JsonCreator
    +		public CompletedCheckpointStatistics(
    +				@JsonProperty(FIELD_NAME_ID) long id,
    +				@JsonProperty(FIELD_NAME_STATUS) CheckpointStatsStatus status,
    +				@JsonProperty(FIELD_NAME_IS_SAVEPOINT) boolean savepoint,
    +				@JsonProperty(FIELD_NAME_TRIGGER_TIMESTAMP) long triggerTimestamp,
    +				@JsonProperty(FIELD_NAME_LATEST_ACK_TIMESTAMP) long latestAckTimestamp,
    +				@JsonProperty(FIELD_NAME_STATE_SIZE) long stateSize,
    +				@JsonProperty(FIELD_NAME_DURATION) long duration,
    +				@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED) long alignmentBuffered,
    +				@JsonProperty(FIELD_NAME_NUM_SUBTASKS) int numSubtasks,
    +				@JsonProperty(FIELD_NAME_NUM_ACK_SUBTASKS) int numAckSubtasks,
    +				@JsonProperty(FIELD_NAME_EXTERNAL_PATH) @Nullable String externalPath,
    +				@JsonProperty(FIELD_NAME_DISCARDED) boolean discarded) {
    +			super(id, status, savepoint, triggerTimestamp, latestAckTimestamp, stateSize, duration, alignmentBuffered, numSubtasks, numAckSubtasks);
    +
    +			this.externalPath = externalPath;
    +			this.discarded = discarded;
    +		}
    +
    +		@Nullable
    +		public String getExternalPath() {
    +			return externalPath;
    +		}
    +
    +		public boolean isDiscarded() {
    +			return discarded;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			if (!super.equals(o)) {
    +				return false;
    +			}
    +			CompletedCheckpointStatistics that = (CompletedCheckpointStatistics) o;
    +			return discarded == that.discarded &&
    +				Objects.equals(externalPath, that.externalPath);
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(super.hashCode(), externalPath, discarded);
    +		}
    +	}
    +
    +	/**
    +	 * Statistics for a failed checkpoint.
    +	 */
    +	public static final class FailedCheckpointStatistics extends BaseCheckpointStatistics {
    +
    +		public static final String FIELD_NAME_FAILURE_TIMESTAMP = "failure_timestamp";
    +
    +		public static final String FIELD_NAME_FAILURE_MESSAGE = "failure_message";
    +
    +		@JsonProperty(FIELD_NAME_FAILURE_TIMESTAMP)
    +		private final long failureTimestamp;
    +
    +		@JsonProperty(FIELD_NAME_FAILURE_MESSAGE)
    +		@Nullable
    +		private final String failureMessage;
    +
    +		@JsonCreator
    +		public FailedCheckpointStatistics(
    +				@JsonProperty(FIELD_NAME_ID) long id,
    +				@JsonProperty(FIELD_NAME_STATUS) CheckpointStatsStatus status,
    +				@JsonProperty(FIELD_NAME_IS_SAVEPOINT) boolean savepoint,
    +				@JsonProperty(FIELD_NAME_TRIGGER_TIMESTAMP) long triggerTimestamp,
    +				@JsonProperty(FIELD_NAME_LATEST_ACK_TIMESTAMP) long latestAckTimestamp,
    +				@JsonProperty(FIELD_NAME_STATE_SIZE) long stateSize,
    +				@JsonProperty(FIELD_NAME_DURATION) long duration,
    +				@JsonProperty(FIELD_NAME_ALIGNMENT_BUFFERED) long alignmentBuffered,
    +				@JsonProperty(FIELD_NAME_NUM_SUBTASKS) int numSubtasks,
    +				@JsonProperty(FIELD_NAME_NUM_ACK_SUBTASKS) int numAckSubtasks,
    +				@JsonProperty(FIELD_NAME_FAILURE_TIMESTAMP) long failureTimestamp,
    +				@JsonProperty(FIELD_NAME_FAILURE_MESSAGE) @Nullable String failureMessage) {
    +			super(id, status, savepoint, triggerTimestamp, latestAckTimestamp, stateSize, duration, alignmentBuffered, numSubtasks, numAckSubtasks);
    +
    +			this.failureTimestamp = failureTimestamp;
    +			this.failureMessage = failureMessage;
    +		}
    +
    +		public long getFailureTimestamp() {
    +			return failureTimestamp;
    +		}
    +
    +		@Nullable
    +		public String getFailureMessage() {
    +			return failureMessage;
    +		}
    +
    +		@Override
    +		public boolean equals(Object o) {
    +			if (this == o) {
    +				return true;
    +			}
    +			if (o == null || getClass() != o.getClass()) {
    +				return false;
    +			}
    +			if (!super.equals(o)) {
    +				return false;
    +			}
    +			FailedCheckpointStatistics that = (FailedCheckpointStatistics) o;
    +			return failureTimestamp == that.failureTimestamp &&
    +				Objects.equals(failureMessage, that.failureMessage);
    +		}
    +
    +		@Override
    +		public int hashCode() {
    +			return Objects.hash(super.hashCode(), failureTimestamp, failureMessage);
    +		}
    +	}
    +
    +	/**
    +	 * Statistics for a restored checkpoint.
    +	 */
    +	public static final class RestoredCheckpointStatistics {
    +
    +		public static final String FIELD_NAME_ID = "id";
    +
    +		public static final String FIELD_NAME_RESTORE_TIMESTAMP = "restore_timestamp";
    +
    +		public static final String FIELD_NAME_IS_SAVEPOINT = "is_savepoint";
    +
    +		public static final String FIELD_NAME_EXTERNAL_PATH = "external_path";
    +
    +		@JsonProperty(FIELD_NAME_ID)
    +		private final long id;
    +
    +		@JsonProperty(FIELD_NAME_RESTORE_TIMESTAMP)
    +		private final long restoreTimestamp;
    +
    +		@JsonProperty(FIELD_NAME_IS_SAVEPOINT)
    +		private final boolean savepoint;
    +
    +		@JsonProperty(FIELD_NAME_EXTERNAL_PATH)
    +		@Nullable
    +		private final String externalPath;
    +
    +		@JsonCreator
    +		public RestoredCheckpointStatistics(
    +			@JsonProperty(FIELD_NAME_ID) long id,
    +			@JsonProperty(FIELD_NAME_RESTORE_TIMESTAMP) long restoreTimestamp,
    +			@JsonProperty(FIELD_NAME_IS_SAVEPOINT) boolean savepoint,
    +			@JsonProperty(FIELD_NAME_EXTERNAL_PATH) @Nullable String externalPath) {
    --- End diff --
    
    Thanks for catching this. Will fix it.


> Port CheckpointStatsHandler to new REST endpoint
> ------------------------------------------------
>
>                 Key: FLINK-7710
>                 URL: https://issues.apache.org/jira/browse/FLINK-7710
>             Project: Flink
>          Issue Type: Sub-task
>          Components: Distributed Coordination, REST, Webfrontend
>            Reporter: Tzu-Li (Gordon) Tai
>            Assignee: Till Rohrmann
>              Labels: flip-6
>             Fix For: 1.4.0
>
>
> Port existing {{CheckpointStatsHandler}} to new REST endpoint.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)