blob: ad7851e7f0b29b68561e222a906ce03d5095dbbe [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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.buck.debug;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
/**
* Single event for a trace.
*/
class TraceEvent {
private final long id;
private final String comment;
private final String type;
private final long eventTime;
private final long startTime;
TraceEvent(long id, String comment, String type, long startTime) {
this.id = id;
this.comment = comment;
this.type = type;
this.eventTime = System.currentTimeMillis();
this.startTime = startTime;
}
public long getId() {
return id;
}
public String getComment() {
return comment;
}
public String getType() {
return type;
}
public long getEventTime() {
return eventTime;
}
/**
* Returns a formatted string for the event.
*
* @param traceStartTime the start time of the trace to generate relative times
* @param prevTime the completion time of the previous event or -1
* @param indent extra indent for the message if there was no previous event.
* @return the formatted tracer string
*/
String toTraceString(long traceStartTime, long prevTime, String indent) {
// TODO(user): move to ThreadTrace to split formatting from representation
StringBuilder sb = new StringBuilder();
if (prevTime == -1) {
sb.append("-----");
} else {
sb.append(longToPaddedString(this.eventTime - prevTime));
}
sb.append(" ");
sb.append(formatTime(this.eventTime - traceStartTime));
if (this instanceof TraceStart) {
sb.append(" Start ");
} else if (this instanceof TraceStop) {
sb.append(" Done ");
long delta = eventTime - startTime;
sb.append(longToPaddedString(delta));
sb.append(" ms ");
} else {
sb.append(" Comment ");
}
sb.append(indent);
sb.append(this.toString());
return sb.toString();
}
/**
* @return A string describing the tracer event.
*/
@Override
public String toString() {
if (this.type == null) {
return comment;
} else {
return String.format("[%s] %s", type, comment);
}
}
/**
* Converts {@code value} to a string and pads it with up to 4 spaces for improved alignment.
* @param value A nonnegative value.
* @return A padded string.
*/
static String longToPaddedString(long value) {
Preconditions.checkArgument(value >= 0, "value must be positive");
return Strings.padStart(String.valueOf(value), 5, '0');
}
/**
* Return the sec.ms part of time (if time = "20:06:11.566", "11.566")
*
* @param time The time in milliseconds.
* @return A formatted string as "sec.ms".
*/
static String formatTime(long time) {
String sec = String.valueOf(Math.max(0, (time / 1000) % 60));
String ms = String.valueOf(Math.max(time % 1000, 0));
return Strings.padStart(sec, 2, '0') + '.' + Strings.padStart(ms, 3, '0');
}
}