/* * Licensed 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 com.facebook.presto.execution; import com.facebook.presto.operator.BlockedReason; import com.facebook.presto.operator.OperatorStats; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import io.airlift.stats.Distribution.DistributionSnapshot; import io.airlift.units.DataSize; import io.airlift.units.Duration; import org.joda.time.DateTime; import javax.annotation.concurrent.Immutable; import java.util.List; import java.util.Set; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @Immutable public class StageStats { private final DateTime schedulingComplete; private final DistributionSnapshot getSplitDistribution; private final DistributionSnapshot scheduleTaskDistribution; private final DistributionSnapshot addSplitDistribution; private final int totalTasks; private final int runningTasks; private final int completedTasks; private final int totalDrivers; private final int queuedDrivers; private final int runningDrivers; private final int completedDrivers; private final double cumulativeMemory; private final DataSize totalMemoryReservation; private final DataSize peakMemoryReservation; private final Duration totalScheduledTime; private final Duration totalCpuTime; private final Duration totalUserTime; private final Duration totalBlockedTime; private final boolean fullyBlocked; private final Set<BlockedReason> blockedReasons; private final DataSize rawInputDataSize; private final long rawInputPositions; private final DataSize processedInputDataSize; private final long processedInputPositions; private final DataSize bufferedDataSize; private final DataSize outputDataSize; private final long outputPositions; private final List<OperatorStats> operatorSummaries; @VisibleForTesting public StageStats() { this.schedulingComplete = null; this.getSplitDistribution = null; this.scheduleTaskDistribution = null; this.addSplitDistribution = null; this.totalTasks = 0; this.runningTasks = 0; this.completedTasks = 0; this.totalDrivers = 0; this.queuedDrivers = 0; this.runningDrivers = 0; this.completedDrivers = 0; this.cumulativeMemory = 0.0; this.totalMemoryReservation = null; this.peakMemoryReservation = null; this.totalScheduledTime = null; this.totalCpuTime = null; this.totalUserTime = null; this.totalBlockedTime = null; this.fullyBlocked = false; this.blockedReasons = ImmutableSet.of(); this.rawInputDataSize = null; this.rawInputPositions = 0; this.processedInputDataSize = null; this.processedInputPositions = 0; this.bufferedDataSize = null; this.outputDataSize = null; this.outputPositions = 0; this.operatorSummaries = null; } @JsonCreator public StageStats( @JsonProperty("schedulingComplete") DateTime schedulingComplete, @JsonProperty("getSplitDistribution") DistributionSnapshot getSplitDistribution, @JsonProperty("scheduleTaskDistribution") DistributionSnapshot scheduleTaskDistribution, @JsonProperty("addSplitDistribution") DistributionSnapshot addSplitDistribution, @JsonProperty("totalTasks") int totalTasks, @JsonProperty("runningTasks") int runningTasks, @JsonProperty("completedTasks") int completedTasks, @JsonProperty("totalDrivers") int totalDrivers, @JsonProperty("queuedDrivers") int queuedDrivers, @JsonProperty("runningDrivers") int runningDrivers, @JsonProperty("completedDrivers") int completedDrivers, @JsonProperty("cumulativeMemory") double cumulativeMemory, @JsonProperty("totalMemoryReservation") DataSize totalMemoryReservation, @JsonProperty("peakMemoryReservation") DataSize peakMemoryReservation, @JsonProperty("totalScheduledTime") Duration totalScheduledTime, @JsonProperty("totalCpuTime") Duration totalCpuTime, @JsonProperty("totalUserTime") Duration totalUserTime, @JsonProperty("totalBlockedTime") Duration totalBlockedTime, @JsonProperty("fullyBlocked") boolean fullyBlocked, @JsonProperty("blockedReasons") Set<BlockedReason> blockedReasons, @JsonProperty("rawInputDataSize") DataSize rawInputDataSize, @JsonProperty("rawInputPositions") long rawInputPositions, @JsonProperty("processedInputDataSize") DataSize processedInputDataSize, @JsonProperty("processedInputPositions") long processedInputPositions, @JsonProperty("bufferedDataSize") DataSize bufferedDataSize, @JsonProperty("outputDataSize") DataSize outputDataSize, @JsonProperty("outputPositions") long outputPositions, @JsonProperty("operatorSummaries") List<OperatorStats> operatorSummaries) { this.schedulingComplete = schedulingComplete; this.getSplitDistribution = requireNonNull(getSplitDistribution, "getSplitDistribution is null"); this.scheduleTaskDistribution = requireNonNull(scheduleTaskDistribution, "scheduleTaskDistribution is null"); this.addSplitDistribution = requireNonNull(addSplitDistribution, "addSplitDistribution is null"); checkArgument(totalTasks >= 0, "totalTasks is negative"); this.totalTasks = totalTasks; checkArgument(runningTasks >= 0, "runningTasks is negative"); this.runningTasks = runningTasks; checkArgument(completedTasks >= 0, "completedTasks is negative"); this.completedTasks = completedTasks; checkArgument(totalDrivers >= 0, "totalDrivers is negative"); this.totalDrivers = totalDrivers; checkArgument(queuedDrivers >= 0, "queuedDrivers is negative"); this.queuedDrivers = queuedDrivers; checkArgument(runningDrivers >= 0, "runningDrivers is negative"); this.runningDrivers = runningDrivers; checkArgument(completedDrivers >= 0, "completedDrivers is negative"); this.completedDrivers = completedDrivers; this.cumulativeMemory = requireNonNull(cumulativeMemory, "cumulativeMemory is null"); this.totalMemoryReservation = requireNonNull(totalMemoryReservation, "totalMemoryReservation is null"); this.peakMemoryReservation = requireNonNull(peakMemoryReservation, "peakMemoryReservation is null"); this.totalScheduledTime = requireNonNull(totalScheduledTime, "totalScheduledTime is null"); this.totalCpuTime = requireNonNull(totalCpuTime, "totalCpuTime is null"); this.totalUserTime = requireNonNull(totalUserTime, "totalUserTime is null"); this.totalBlockedTime = requireNonNull(totalBlockedTime, "totalBlockedTime is null"); this.fullyBlocked = fullyBlocked; this.blockedReasons = ImmutableSet.copyOf(requireNonNull(blockedReasons, "blockedReasons is null")); this.rawInputDataSize = requireNonNull(rawInputDataSize, "rawInputDataSize is null"); checkArgument(rawInputPositions >= 0, "rawInputPositions is negative"); this.rawInputPositions = rawInputPositions; this.processedInputDataSize = requireNonNull(processedInputDataSize, "processedInputDataSize is null"); checkArgument(processedInputPositions >= 0, "processedInputPositions is negative"); this.processedInputPositions = processedInputPositions; this.bufferedDataSize = requireNonNull(bufferedDataSize, "bufferedDataSize is null"); this.outputDataSize = requireNonNull(outputDataSize, "outputDataSize is null"); checkArgument(outputPositions >= 0, "outputPositions is negative"); this.outputPositions = outputPositions; this.operatorSummaries = ImmutableList.copyOf(requireNonNull(operatorSummaries, "operatorSummaries is null")); } @JsonProperty public DateTime getSchedulingComplete() { return schedulingComplete; } @JsonProperty public DistributionSnapshot getGetSplitDistribution() { return getSplitDistribution; } @JsonProperty public DistributionSnapshot getScheduleTaskDistribution() { return scheduleTaskDistribution; } @JsonProperty public DistributionSnapshot getAddSplitDistribution() { return addSplitDistribution; } @JsonProperty public int getTotalTasks() { return totalTasks; } @JsonProperty public int getRunningTasks() { return runningTasks; } @JsonProperty public int getCompletedTasks() { return completedTasks; } @JsonProperty public int getTotalDrivers() { return totalDrivers; } @JsonProperty public int getQueuedDrivers() { return queuedDrivers; } @JsonProperty public int getRunningDrivers() { return runningDrivers; } @JsonProperty public int getCompletedDrivers() { return completedDrivers; } @JsonProperty public double getCumulativeMemory() { return cumulativeMemory; } @JsonProperty public DataSize getTotalMemoryReservation() { return totalMemoryReservation; } @JsonProperty public DataSize getPeakMemoryReservation() { return peakMemoryReservation; } @JsonProperty public Duration getTotalScheduledTime() { return totalScheduledTime; } @JsonProperty public Duration getTotalCpuTime() { return totalCpuTime; } @JsonProperty public Duration getTotalUserTime() { return totalUserTime; } @JsonProperty public Duration getTotalBlockedTime() { return totalBlockedTime; } @JsonProperty public boolean isFullyBlocked() { return fullyBlocked; } @JsonProperty public Set<BlockedReason> getBlockedReasons() { return blockedReasons; } @JsonProperty public DataSize getRawInputDataSize() { return rawInputDataSize; } @JsonProperty public long getRawInputPositions() { return rawInputPositions; } @JsonProperty public DataSize getProcessedInputDataSize() { return processedInputDataSize; } @JsonProperty public long getProcessedInputPositions() { return processedInputPositions; } @JsonProperty public DataSize getBufferedDataSize() { return bufferedDataSize; } @JsonProperty public DataSize getOutputDataSize() { return outputDataSize; } @JsonProperty public long getOutputPositions() { return outputPositions; } @JsonProperty public List<OperatorStats> getOperatorSummaries() { return operatorSummaries; } }