/*
* Copyright 2014-2015 JKOOL, LLC.
*
* 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.jkoolcloud.tnt4j.format;
import java.util.Collection;
import java.util.Set;
import java.util.TimeZone;
import com.jkoolcloud.tnt4j.core.Property;
import com.jkoolcloud.tnt4j.core.Snapshot;
import com.jkoolcloud.tnt4j.source.Source;
import com.jkoolcloud.tnt4j.core.OpLevel;
import com.jkoolcloud.tnt4j.core.UsecTimestamp;
import com.jkoolcloud.tnt4j.tracker.TrackingActivity;
import com.jkoolcloud.tnt4j.tracker.TrackingEvent;
import com.jkoolcloud.tnt4j.utils.Utils;
/**
* <p>
* Simple implementation of {@link Formatter} interface provides simple/minimal formatting of
* {@link TrackingActivity} and {@code TrackingEvent} as well as any object passed to {@code format()}
* method call. Event entries are formatted as follows:
* {@code event-text-msg {event-tracking-info}}
* where {@code event-tracking-info} consists of {@code "name: value"} pairs.
* </p>
*
*
* @version $Revision: 1 $
*
* @see DefaultFormatter
* @see TrackingActivity
* @see TrackingEvent
*/
public class SimpleFormatter extends DefaultFormatter {
/**
* Create a simple event formatter with default setting.
* Format: "{2} | {1} | {0}", TimeZone: UTC.
*
*/
public SimpleFormatter() {
}
/**
* Create a simple event formatter instance with a given format
*
* @param format string (e.g. "{2} | {1} | {0}")
*/
public SimpleFormatter(String format) {
super(format);
}
/**
* Create a simple event formatter instance with a given format, timezone
*
* @param format string (e.g. "{2} | {1} | {0}")
* @param tz time zone
*/
public SimpleFormatter(String format, TimeZone tz) {
super(format, tz);
}
@Override
public String format(TrackingEvent event) {
StringBuilder msg = new StringBuilder(1024);
msg.append(event.getMessage()).append(" ");
msg.append("{name: '").append(event.getOperation().getResolvedName()).append("'");
if (event.getOperation().getPropertyCount() > 0) {
msg.append(separator);
msg.append("prop-count: '").append(event.getOperation().getPropertyCount()).append("'");
}
if (event.getOperation().getSnapshotCount() > 0) {
msg.append(separator);
msg.append("snap-count: '").append(event.getOperation().getSnapshotCount()).append("'");
}
if (event.getOperation().getResource() != null) {
msg.append(separator);
msg.append("resource: '").append(event.getOperation().getResource()).append("'");
}
if (event.getOperation().getReasonCode() != 0) {
msg.append(separator);
msg.append("rcode: '").append(event.getOperation().getReasonCode()).append("'");
}
if (event.getOperation().getElapsedTimeUsec() != 0) {
msg.append(separator);
msg.append("usec: '").append(event.getOperation().getElapsedTimeUsec()).append("'");
}
if (event.getMessageAge() != 0) {
msg.append(separator);
msg.append("age.usec: '").append(event.getMessageAge()).append("'");
}
if (event.getOperation().getWaitTimeUsec() != 0) {
msg.append(separator);
msg.append("wait.usec: '").append(event.getOperation().getWaitTimeUsec()).append("'");
}
if (!event.getTag().isEmpty()) {
msg.append(separator);
msg.append("tag: '").append(event.getTag()).append("'");
}
if (!event.getOperation().getCorrelator().isEmpty()) {
msg.append(separator);
msg.append("corr-id: '").append(event.getOperation().getCorrelator()).append("'");
}
if (event.getOperation().getLocation() != null) {
msg.append(separator);
msg.append("location: '").append(event.getOperation().getLocation()).append("'");
}
if (event.getSource() != null) {
msg.append(separator);
msg.append("source: '").append(event.getSource().getName()).append("'");
}
if (event.getParentId() != null) {
msg.append(separator);
msg.append("parent-id: '").append(event.getParentId()).append("'");
}
if (event.getTrackingId() != null) {
msg.append(separator);
msg.append("track-id: '").append(event.getTrackingId()).append("'");
}
if (event.getOperation().getPropertyCount() > 0) {
Collection<Property> list = event.getOperation().getProperties();
msg.append("\n\t").append("Properties {");
for (Property prop : list) {
msg.append("\n\t\t").append(prop.getKey()).append(": '").append(prop.getValue()).append(":").append(prop.getDataType()).append(":").append(prop.getValueType()).append("'");
}
msg.append("\n\t}");
}
if (event.getOperation().getSnapshotCount() > 0) {
Collection<Snapshot> snapshots = event.getOperation().getSnapshots();
for (Snapshot snap : snapshots) {
msg.append("\n\t");
format(msg, snap);
}
}
if (event.getOperation().getThrowable() != null) {
msg.append("\nThrowable {\n").append(Utils.printThrowable(event.getOperation().getThrowable())).append("}");
}
msg.append("}");
return msg.toString();
}
@Override
public String format(TrackingActivity activity) {
StringBuilder msg = new StringBuilder(1024);
msg.append("{status: '").append(activity.getStatus()).append("'").append(separator);
msg.append("time: '").append(UsecTimestamp.getTimeStamp(timeZone)).append("'").append(separator);
msg.append("sev: '").append(activity.getSeverity()).append("'").append(separator);
msg.append("type: '").append(activity.getType()).append("'").append(separator);
if (!Utils.isEmpty(activity.getResolvedName())) {
msg.append("name: '").append(activity.getResolvedName()).append("'");
}
if (!Utils.isEmpty(activity.getResource())) {
msg.append(separator);
msg.append("resource: '").append(activity.getResource()).append("'");
}
if (activity.getElapsedTimeUsec() != 0) {
msg.append(separator);
msg.append("usec: '").append(activity.getElapsedTimeUsec()).append("'");
}
if (activity.getWaitTimeUsec() != 0) {
msg.append(separator);
msg.append("wait.usec: '").append(activity.getWaitTimeUsec()).append("'");
}
if (activity.getStartTime() != null) {
msg.append(separator);
msg.append("start.time: '").append(activity.getStartTime()).append("'");
}
if (activity.getEndTime() != null) {
msg.append(separator);
msg.append("end.time: '").append(activity.getEndTime()).append("'");
}
if (!Utils.isEmpty(activity.getLocation())) {
msg.append(separator);
msg.append("location: '").append(activity.getLocation()).append("'");
}
if (activity.getIdCount() > 0) {
msg.append(separator);
msg.append("id-count: '").append(activity.getIdCount()).append("'");
}
if (activity.getSnapshotCount() > 0) {
msg.append(separator);
msg.append("snap-count: '").append(activity.getSnapshotCount()).append("'");
}
if (activity.getSource() != null) {
msg.append(separator);
msg.append("source: '").append(activity.getSource().getName()).append("'");
}
if (!Utils.isEmpty(activity.getParentId())) {
msg.append(separator);
msg.append("parent-id: '").append(activity.getParentId()).append("'");
}
if (!Utils.isEmpty(activity.getTrackingId())) {
msg.append(separator);
msg.append("track-id: '").append(activity.getTrackingId()).append("'");
}
if (activity.getSnapshotCount() > 0) {
msg.append(separator);
Collection<Snapshot> snapshots = activity.getSnapshots();
for (Snapshot snap : snapshots) {
msg.append("\n\t");
format(msg, snap);
}
}
if (activity.getThrowable() != null) {
msg.append(separator);
msg.append("\nThrowable {\n").append(Utils.printThrowable(activity.getThrowable())).append("}");
}
msg.append("}");
return msg.toString();
}
@Override
public String format(Snapshot snap) {
StringBuilder msg = new StringBuilder(1024);
return format(msg, snap).toString();
}
@Override
public String format(long ttl, Source src, OpLevel level, String msg, Object...args) {
String formatted = super.format(ttl, src, level, msg, args);
Throwable error = Utils.getThrowable(args);
if (error != null) {
formatted += "\nThrowable {\n" + Utils.printThrowable(error) + "}";
}
return formatted;
}
protected StringBuilder format(StringBuilder msg, Snapshot snap) {
msg.append("Snapshot(fqn: '").append(snap.getId()).append("'");
String pid = snap.getParentId();
String tid = snap.getTrackingId();
Set<String> cid = snap.getCorrelator();
if (pid != null) {
msg.append(separator);
msg.append("parent-id: '").append(pid).append("'");
}
if (tid != null) {
msg.append(separator);
msg.append("track-id: '").append(tid).append("'");
}
if (!cid.isEmpty()) {
msg.append(separator);
msg.append("corr-id: '").append(cid).append("'");
}
msg.append(") {");
for (Property prop : snap.getSnapshot()) {
msg.append("\n\t\t").append(prop.getKey()).append(": '").append(prop.getValue()).append(":").append(prop.getDataType()).append(":").append(prop.getValueType()).append("'");
}
msg.append("\n\t}");
return msg;
}
}