QueryProgressStats.java

/*
 * 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.server;

import com.facebook.drift.annotations.ThriftConstructor;
import com.facebook.drift.annotations.ThriftField;
import com.facebook.drift.annotations.ThriftStruct;
import com.facebook.presto.operator.BlockedReason;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableSet;

import java.util.Optional;
import java.util.OptionalDouble;
import java.util.Set;

import static java.util.Objects.requireNonNull;

@ThriftStruct
public class QueryProgressStats
{
    private final long elapsedTimeMillis;
    private final long queuedTimeMillis;
    private final long executionTimeMillis;
    private final long cpuTimeMillis;
    private final long scheduledTimeMillis;
    private final long currentMemoryBytes;
    private final long peakMemoryBytes;
    private final long peakTotalMemoryBytes;
    private final long peakTaskTotalMemoryBytes;
    private final double cumulativeUserMemory;
    private final double cumulativeTotalMemory;
    private final long inputRows;
    private final long inputBytes;
    private final OptionalDouble progressPercentage;
    private final boolean blocked;
    private final Optional<Set<BlockedReason>> blockedReasons;
    private final int queuedDrivers;
    private final int runningDrivers;
    private final int completedDrivers;

    private final int queuedNewDrivers;
    private final int runningNewDrivers;
    private final int completedNewDrivers;

    private final int queuedSplits;
    private final int runningSplits;
    private final int completedSplits;

    @JsonCreator
    @ThriftConstructor
    public QueryProgressStats(
            @JsonProperty("elapsedTimeMillis") long elapsedTimeMillis,
            @JsonProperty("queuedTimeMillis") long queuedTimeMillis,
            @JsonProperty("executionTimeMillis") long executionTimeMillis,
            @JsonProperty("cpuTimeMillis") long cpuTimeMillis,
            @JsonProperty("scheduledTimeMillis") long scheduledTimeMillis,
            @JsonProperty("currentMemoryBytes") long currentMemoryBytes,
            @JsonProperty("peakMemoryBytes") long peakMemoryBytes,
            @JsonProperty("peakTotalMemoryBytes") long peakTotalMemoryBytes,
            @JsonProperty("peakTaskTotalMemoryBytes") long peakTaskTotalMemoryBytes,
            @JsonProperty("cumulativeUserMemory") double cumulativeUserMemory,
            @JsonProperty("cumulativeTotalMemory") double cumulativeTotalMemory,
            @JsonProperty("inputRows") long inputRows,
            @JsonProperty("inputBytes") long inputBytes,
            @JsonProperty("blocked") boolean blocked,
            @JsonProperty("blockedReasons") Optional<Set<BlockedReason>> blockedReasons,
            @JsonProperty("progressPercentage") OptionalDouble progressPercentage,
            @JsonProperty("queuedDrivers") int queuedDrivers,
            @JsonProperty("runningDrivers") int runningDrivers,
            @JsonProperty("completedDrivers") int completedDrivers,
            @JsonProperty("queuedNewDrivers") int queuedNewDrivers,
            @JsonProperty("runningNewDrivers") int runningNewDrivers,
            @JsonProperty("completedNewDrivers") int completedNewDrivers,
            @JsonProperty("queuedSplits") int queuedSplits,
            @JsonProperty("runningSplits") int runningSplits,
            @JsonProperty("completedSplits") int completedSplits)

    {
        this.elapsedTimeMillis = elapsedTimeMillis;
        this.queuedTimeMillis = queuedTimeMillis;
        this.executionTimeMillis = executionTimeMillis;
        this.cpuTimeMillis = cpuTimeMillis;
        this.scheduledTimeMillis = scheduledTimeMillis;
        this.currentMemoryBytes = currentMemoryBytes;
        this.peakMemoryBytes = peakMemoryBytes;
        this.peakTotalMemoryBytes = peakTotalMemoryBytes;
        this.peakTaskTotalMemoryBytes = peakTaskTotalMemoryBytes;
        this.cumulativeUserMemory = cumulativeUserMemory;
        this.cumulativeTotalMemory = cumulativeTotalMemory;
        this.inputRows = inputRows;
        this.inputBytes = inputBytes;
        this.blocked = blocked;
        this.blockedReasons = requireNonNull(blockedReasons, "blockedReasons is null").map(ImmutableSet::copyOf);
        this.progressPercentage = requireNonNull(progressPercentage, "progressPercentage is null");
        this.queuedDrivers = queuedDrivers;
        this.runningDrivers = runningDrivers;
        this.completedDrivers = completedDrivers;
        this.queuedNewDrivers = queuedNewDrivers;
        this.runningNewDrivers = runningNewDrivers;
        this.completedNewDrivers = completedNewDrivers;
        this.queuedSplits = queuedSplits;
        this.runningSplits = runningSplits;
        this.completedSplits = completedSplits;
    }

    public static QueryProgressStats createQueryProgressStats(BasicQueryStats queryStats)
    {
        return new QueryProgressStats(
                queryStats.getElapsedTime().toMillis(),
                queryStats.getQueuedTime().toMillis(),
                queryStats.getExecutionTime().toMillis(),
                queryStats.getTotalCpuTime().toMillis(),
                queryStats.getTotalScheduledTime().toMillis(),
                queryStats.getUserMemoryReservation().toBytes(),
                queryStats.getPeakUserMemoryReservation().toBytes(),
                queryStats.getPeakTotalMemoryReservation().toBytes(),
                queryStats.getPeakTaskTotalMemoryReservation().toBytes(),
                queryStats.getCumulativeUserMemory(),
                queryStats.getCumulativeTotalMemory(),
                queryStats.getRawInputPositions(),
                queryStats.getRawInputDataSize().toBytes(),
                queryStats.isFullyBlocked(),
                queryStats.isFullyBlocked() ? Optional.of(queryStats.getBlockedReasons()) : Optional.empty(),
                queryStats.getProgressPercentage(),
                queryStats.getQueuedDrivers(),
                queryStats.getRunningDrivers(),
                queryStats.getCompletedDrivers(),
                queryStats.getQueuedNewDrivers(),
                queryStats.getRunningNewDrivers(),
                queryStats.getCompletedNewDrivers(),
                queryStats.getQueuedSplits(),
                queryStats.getRunningSplits(),
                queryStats.getCompletedSplits());
    }

    @ThriftField(1)
    @JsonProperty
    public long getElapsedTimeMillis()
    {
        return elapsedTimeMillis;
    }

    @ThriftField(2)
    @JsonProperty
    public long getQueuedTimeMillis()
    {
        return queuedTimeMillis;
    }

    @ThriftField(3)
    @JsonProperty
    public long getExecutionTimeMillis()
    {
        return executionTimeMillis;
    }

    @ThriftField(4)
    @JsonProperty
    public long getCpuTimeMillis()
    {
        return cpuTimeMillis;
    }

    @ThriftField(5)
    @JsonProperty
    public long getScheduledTimeMillis()
    {
        return scheduledTimeMillis;
    }

    @ThriftField(6)
    @JsonProperty
    public long getCurrentMemoryBytes()
    {
        return currentMemoryBytes;
    }

    @ThriftField(7)
    @JsonProperty
    public long getPeakMemoryBytes()
    {
        return peakMemoryBytes;
    }

    @ThriftField(8)
    @JsonProperty
    public long getPeakTotalMemoryBytes()
    {
        return peakTotalMemoryBytes;
    }

    @ThriftField(9)
    @JsonProperty
    public long getPeakTaskTotalMemoryBytes()
    {
        return peakTaskTotalMemoryBytes;
    }

    @ThriftField(10)
    @JsonProperty
    public double getCumulativeUserMemory()
    {
        return cumulativeUserMemory;
    }

    @ThriftField(11)
    @JsonProperty
    public double getCumulativeTotalMemory()
    {
        return cumulativeTotalMemory;
    }

    @ThriftField(12)
    @JsonProperty
    public long getInputRows()
    {
        return inputRows;
    }

    @ThriftField(13)
    @JsonProperty
    public long getInputBytes()
    {
        return inputBytes;
    }

    @ThriftField(14)
    @JsonProperty
    public boolean isBlocked()
    {
        return blocked;
    }

    @ThriftField(15)
    @JsonProperty
    public Optional<Set<BlockedReason>> getBlockedReasons()
    {
        return blockedReasons;
    }

    @ThriftField(16)
    @JsonProperty
    public OptionalDouble getProgressPercentage()
    {
        return progressPercentage;
    }

    @ThriftField(17)
    @JsonProperty
    public int getQueuedDrivers()
    {
        return queuedDrivers;
    }

    @ThriftField(18)
    @JsonProperty
    public int getRunningDrivers()
    {
        return runningDrivers;
    }

    @ThriftField(19)
    @JsonProperty
    public int getCompletedDrivers()
    {
        return completedDrivers;
    }

    @ThriftField(20)
    @JsonProperty
    public int getQueuedSplits()
    {
        return queuedSplits;
    }

    @ThriftField(21)
    @JsonProperty
    public int getRunningSplits()
    {
        return runningSplits;
    }

    @ThriftField(22)
    @JsonProperty
    public int getCompletedSplits()
    {
        return completedSplits;
    }

    @ThriftField(23)
    @JsonProperty
    public int getQueuedNewDrivers()
    {
        return queuedNewDrivers;
    }

    @ThriftField(24)
    @JsonProperty
    public int getRunningNewDrivers()
    {
        return runningNewDrivers;
    }

    @ThriftField(25)
    @JsonProperty
    public int getCompletedNewDrivers()
    {
        return completedNewDrivers;
    }
}