/* * 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.operator; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import io.airlift.units.DataSize; import io.airlift.units.Duration; import org.joda.time.DateTime; import javax.annotation.Nullable; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkArgument; import static io.airlift.units.DataSize.Unit.BYTE; import static java.util.Objects.requireNonNull; import static java.util.concurrent.TimeUnit.MILLISECONDS; public class TaskStats { private final DateTime createTime; private final DateTime firstStartTime; private final DateTime lastStartTime; private final DateTime lastEndTime; private final DateTime endTime; private final Duration elapsedTime; private final Duration queuedTime; private final int totalDrivers; private final int queuedDrivers; private final int queuedPartitionedDrivers; private final int runningDrivers; private final int runningPartitionedDrivers; private final int completedDrivers; private final double cumulativeMemory; private final DataSize memoryReservation; private final DataSize systemMemoryReservation; 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 outputDataSize; private final long outputPositions; private final List<PipelineStats> pipelines; public TaskStats(DateTime createTime, DateTime endTime) { this(createTime, null, null, null, endTime, new Duration(0, MILLISECONDS), new Duration(0, MILLISECONDS), 0, 0, 0, 0, 0, 0, 0.0, new DataSize(0, BYTE), new DataSize(0, BYTE), new Duration(0, MILLISECONDS), new Duration(0, MILLISECONDS), new Duration(0, MILLISECONDS), new Duration(0, MILLISECONDS), false, ImmutableSet.of(), new DataSize(0, BYTE), 0, new DataSize(0, BYTE), 0, new DataSize(0, BYTE), 0, ImmutableList.of()); } @JsonCreator public TaskStats( @JsonProperty("createTime") DateTime createTime, @JsonProperty("firstStartTime") DateTime firstStartTime, @JsonProperty("lastStartTime") DateTime lastStartTime, @JsonProperty("lastEndTime") DateTime lastEndTime, @JsonProperty("endTime") DateTime endTime, @JsonProperty("elapsedTime") Duration elapsedTime, @JsonProperty("queuedTime") Duration queuedTime, @JsonProperty("totalDrivers") int totalDrivers, @JsonProperty("queuedDrivers") int queuedDrivers, @JsonProperty("queuedPartitionedDrivers") int queuedPartitionedDrivers, @JsonProperty("runningDrivers") int runningDrivers, @JsonProperty("runningPartitionedDrivers") int runningPartitionedDrivers, @JsonProperty("completedDrivers") int completedDrivers, @JsonProperty("cumulativeMemory") double cumulativeMemory, @JsonProperty("memoryReservation") DataSize memoryReservation, @JsonProperty("systemMemoryReservation") DataSize systemMemoryReservation, @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("outputDataSize") DataSize outputDataSize, @JsonProperty("outputPositions") long outputPositions, @JsonProperty("pipelines") List<PipelineStats> pipelines) { this.createTime = requireNonNull(createTime, "createTime is null"); this.firstStartTime = firstStartTime; this.lastStartTime = lastStartTime; this.lastEndTime = lastEndTime; this.endTime = endTime; this.elapsedTime = requireNonNull(elapsedTime, "elapsedTime is null"); this.queuedTime = requireNonNull(queuedTime, "queuedTime is null"); checkArgument(totalDrivers >= 0, "totalDrivers is negative"); this.totalDrivers = totalDrivers; checkArgument(queuedDrivers >= 0, "queuedDrivers is negative"); this.queuedDrivers = queuedDrivers; checkArgument(queuedPartitionedDrivers >= 0, "queuedPartitionedDrivers is negative"); this.queuedPartitionedDrivers = queuedPartitionedDrivers; checkArgument(runningDrivers >= 0, "runningDrivers is negative"); this.runningDrivers = runningDrivers; checkArgument(runningPartitionedDrivers >= 0, "runningPartitionedDrivers is negative"); this.runningPartitionedDrivers = runningPartitionedDrivers; checkArgument(completedDrivers >= 0, "completedDrivers is negative"); this.completedDrivers = completedDrivers; this.cumulativeMemory = requireNonNull(cumulativeMemory, "cumulativeMemory is null"); this.memoryReservation = requireNonNull(memoryReservation, "memoryReservation is null"); this.systemMemoryReservation = requireNonNull(systemMemoryReservation, "systemMemoryReservation 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.outputDataSize = requireNonNull(outputDataSize, "outputDataSize is null"); checkArgument(outputPositions >= 0, "outputPositions is negative"); this.outputPositions = outputPositions; this.pipelines = ImmutableList.copyOf(requireNonNull(pipelines, "pipelines is null")); } @JsonProperty public DateTime getCreateTime() { return createTime; } @Nullable @JsonProperty public DateTime getFirstStartTime() { return firstStartTime; } @Nullable @JsonProperty public DateTime getLastStartTime() { return lastStartTime; } @Nullable @JsonProperty public DateTime getLastEndTime() { return lastEndTime; } @Nullable @JsonProperty public DateTime getEndTime() { return endTime; } @JsonProperty public Duration getElapsedTime() { return elapsedTime; } @JsonProperty public Duration getQueuedTime() { return queuedTime; } @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 getMemoryReservation() { return memoryReservation; } @JsonProperty public DataSize getSystemMemoryReservation() { return systemMemoryReservation; } @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 getOutputDataSize() { return outputDataSize; } @JsonProperty public long getOutputPositions() { return outputPositions; } @JsonProperty public List<PipelineStats> getPipelines() { return pipelines; } @JsonProperty public int getQueuedPartitionedDrivers() { return queuedPartitionedDrivers; } @JsonProperty public int getRunningPartitionedDrivers() { return runningPartitionedDrivers; } public TaskStats summarize() { return new TaskStats( createTime, firstStartTime, lastStartTime, lastEndTime, endTime, elapsedTime, queuedTime, totalDrivers, queuedDrivers, queuedPartitionedDrivers, runningDrivers, runningPartitionedDrivers, completedDrivers, cumulativeMemory, memoryReservation, systemMemoryReservation, totalScheduledTime, totalCpuTime, totalUserTime, totalBlockedTime, fullyBlocked, blockedReasons, rawInputDataSize, rawInputPositions, processedInputDataSize, processedInputPositions, outputDataSize, outputPositions, ImmutableList.of()); } public TaskStats summarizeFinal() { return new TaskStats( createTime, firstStartTime, lastStartTime, lastEndTime, endTime, elapsedTime, queuedTime, totalDrivers, queuedDrivers, queuedPartitionedDrivers, runningDrivers, runningPartitionedDrivers, completedDrivers, cumulativeMemory, memoryReservation, systemMemoryReservation, totalScheduledTime, totalCpuTime, totalUserTime, totalBlockedTime, fullyBlocked, blockedReasons, rawInputDataSize, rawInputPositions, processedInputDataSize, processedInputPositions, outputDataSize, outputPositions, pipelines.stream() .map(PipelineStats::summarize) .collect(Collectors.toList())); } }