/*
* Copyright 2016 the original author or authors.
*
* 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 org.glowroot.common.repo;
import javax.annotation.Nullable;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.glowroot.common.util.NotAvailableAware;
import org.glowroot.common.util.UsedByJsonSerialization;
import org.glowroot.wire.api.model.AggregateOuterClass.Aggregate;
import org.glowroot.wire.api.model.Proto.OptionalDouble;
public class MutableThreadStats {
private double totalCpuNanos;
private double totalBlockedNanos;
private double totalWaitedNanos;
private double totalAllocatedBytes;
private boolean empty = true;
@UsedByJsonSerialization
public double getTotalCpuNanos() {
return totalCpuNanos;
}
@UsedByJsonSerialization
public double getTotalBlockedNanos() {
return totalBlockedNanos;
}
@UsedByJsonSerialization
public double getTotalWaitedNanos() {
return totalWaitedNanos;
}
@UsedByJsonSerialization
public double getTotalAllocatedBytes() {
return totalAllocatedBytes;
}
public void addTotalCpuNanos(@Nullable Double totalCpuNanos) {
if (totalCpuNanos != null) {
this.totalCpuNanos = NotAvailableAware.add(this.totalCpuNanos, totalCpuNanos);
} else {
this.totalCpuNanos = NotAvailableAware.NA;
}
}
public void addTotalBlockedNanos(@Nullable Double totalBlockedNanos) {
if (totalBlockedNanos != null) {
this.totalBlockedNanos =
NotAvailableAware.add(this.totalBlockedNanos, totalBlockedNanos);
} else {
this.totalBlockedNanos = NotAvailableAware.NA;
}
}
public void addTotalWaitedNanos(@Nullable Double totalWaitedNanos) {
if (totalWaitedNanos != null) {
this.totalWaitedNanos = NotAvailableAware.add(this.totalWaitedNanos, totalWaitedNanos);
} else {
this.totalWaitedNanos = NotAvailableAware.NA;
}
}
public void addTotalAllocatedBytes(@Nullable Double totalAllocatedBytes) {
if (totalAllocatedBytes != null) {
this.totalAllocatedBytes =
NotAvailableAware.add(this.totalAllocatedBytes, totalAllocatedBytes);
} else {
this.totalAllocatedBytes = NotAvailableAware.NA;
}
}
public void addThreadStats(@Nullable Aggregate.ThreadStats threadStats) {
if (threadStats == null) {
totalCpuNanos = NotAvailableAware.NA;
totalBlockedNanos = NotAvailableAware.NA;
totalWaitedNanos = NotAvailableAware.NA;
totalAllocatedBytes = NotAvailableAware.NA;
return;
}
if (threadStats.hasTotalCpuNanos()) {
totalCpuNanos =
NotAvailableAware.add(totalCpuNanos, threadStats.getTotalCpuNanos().getValue());
} else {
totalCpuNanos = NotAvailableAware.NA;
}
if (threadStats.hasTotalBlockedNanos()) {
totalBlockedNanos = NotAvailableAware.add(totalBlockedNanos,
threadStats.getTotalBlockedNanos().getValue());
} else {
totalCpuNanos = NotAvailableAware.NA;
}
if (threadStats.hasTotalWaitedNanos()) {
totalWaitedNanos = NotAvailableAware.add(totalWaitedNanos,
threadStats.getTotalWaitedNanos().getValue());
} else {
totalCpuNanos = NotAvailableAware.NA;
}
if (threadStats.hasTotalAllocatedBytes()) {
totalAllocatedBytes = NotAvailableAware.add(totalAllocatedBytes,
threadStats.getTotalAllocatedBytes().getValue());
} else {
totalCpuNanos = NotAvailableAware.NA;
}
empty = false;
}
@JsonIgnore
public boolean isNA() {
if (empty) {
return true;
}
return NotAvailableAware.isNA(totalCpuNanos)
&& NotAvailableAware.isNA(totalBlockedNanos)
&& NotAvailableAware.isNA(totalWaitedNanos)
&& NotAvailableAware.isNA(totalAllocatedBytes);
}
Aggregate.ThreadStats toProto() {
Aggregate.ThreadStats.Builder builder = Aggregate.ThreadStats.newBuilder();
if (!NotAvailableAware.isNA(totalCpuNanos)) {
builder.setTotalCpuNanos(toProto(totalCpuNanos));
}
if (!NotAvailableAware.isNA(totalBlockedNanos)) {
builder.setTotalBlockedNanos(toProto(totalBlockedNanos));
}
if (!NotAvailableAware.isNA(totalWaitedNanos)) {
builder.setTotalWaitedNanos(toProto(totalWaitedNanos));
}
if (!NotAvailableAware.isNA(totalAllocatedBytes)) {
builder.setTotalAllocatedBytes(toProto(totalAllocatedBytes));
}
return builder.build();
}
private static OptionalDouble toProto(double value) {
return OptionalDouble.newBuilder().setValue(value).build();
}
}