/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* 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 scouter.lang.pack;
import scouter.io.DataInputX;
import scouter.io.DataOutputX;
import scouter.util.DateUtil;
import scouter.util.Hexa32;
import java.io.IOException;
/**
* Object that contains one transaction information
*/
public class XLogPack implements Pack {
/**
* Transaction endtime
*/
public long endTime;
/**
* Object ID
*/
public int objHash;
/**
* Transaction name Hash
*/
public int service;
/**
* Transaction ID
*/
public long txid;
/**
* thread name hash
*/
public int threadNameHash;
/**
* Caller ID
*/
public long caller;
/**
* Global transaction ID
*/
public long gxid;
/**
* Elapsed time(ms)
*/
public int elapsed;
/**
* Error hash
*/
public int error;
/**
* Cpu time(ms)
*/
public int cpu;
/**
* SQL count
*/
public int sqlCount;
/**
* SQL time(ms)
*/
public int sqlTime;
/**
* Remote ip address
*/
public byte[] ipaddr;
/**
* Allocated memory(kilo byte)
*/
public int kbytes;
/**
* Http status
*/
@Deprecated
public int status;
/**
* User ID
*/
public long userid;
/**
* User-agent hash
*/
public int userAgent;
/**
* Referer hash
*/
public int referer;
/**
* Group hash
*/
public int group;
/**
* ApiCall count
*/
public int apicallCount;
/**
* ApiCall time(ms)
*/
public int apicallTime;
/**
* Country code
*/
public String countryCode; // CountryCode.getCountryName(countryCode);
/**
* City hash
*/
public int city;
/**
* XLog type. WebService:0, AppService:1, BackgroundThread:2
*/
public byte xType; // see XLogTypes
/**
* Login hash
*/
public int login;
/**
* Description hash
*/
public int desc;
/**
* WebServer object ID
*/
public int webHash; // WEB서버의 ObjectHash
/**
* WebServer -> WAS time(ms)
*/
public int webTime; // WEB서버 --> WAS 시작 시점까지의 시간
/**
* has Thread Dump ? No:0, Yes:1
*/
public byte hasDump;
/**
* any text (not use dic)
*/
public String text1;
public String text2;
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("XLOG ");
sb.append(DateUtil.timestamp(endTime));
sb.append(" objHash=").append(Hexa32.toString32(objHash));
sb.append(" service=").append(Hexa32.toString32(service));
sb.append(" txid=").append(Hexa32.toString32(txid));
sb.append(" caller=").append(Hexa32.toString32(caller));
sb.append(" gxid=").append(Hexa32.toString32(gxid));
sb.append(" elapsed=").append(elapsed);
sb.append(" error=").append(error);
return sb.toString();
}
public byte getPackType() {
return PackEnum.XLOG;
}
public void write(DataOutputX out) throws IOException {
DataOutputX o = new DataOutputX();
o.writeDecimal(endTime);
o.writeDecimal(objHash);
o.writeDecimal(service);
o.writeLong(txid);
o.writeLong(caller);
o.writeLong(gxid);
o.writeDecimal(elapsed);
o.writeDecimal(error);
o.writeDecimal(cpu);
o.writeDecimal(sqlCount);
o.writeDecimal(sqlTime);
o.writeBlob(ipaddr);
o.writeDecimal(kbytes);
o.writeDecimal(status);
o.writeDecimal(userid);
o.writeDecimal(userAgent);
o.writeDecimal(referer);
o.writeDecimal(group);
o.writeDecimal(apicallCount);
o.writeDecimal(apicallTime);
o.writeText(countryCode);
o.writeDecimal(city);
o.writeByte(xType);
o.writeDecimal(login);
o.writeDecimal(desc);
o.writeDecimal(webHash);
o.writeDecimal(webTime);
o.writeByte(hasDump);
o.writeDecimal(threadNameHash);
o.writeText(text1);
o.writeText(text2);
out.writeBlob(o.toByteArray());
}
public Pack read(DataInputX din) throws IOException {
DataInputX d = new DataInputX(din.readBlob());
this.endTime = d.readDecimal();
this.objHash = (int) d.readDecimal();
this.service = (int) d.readDecimal();
this.txid = d.readLong();
this.caller = d.readLong();
this.gxid = d.readLong();
this.elapsed = (int) d.readDecimal();
this.error = (int) d.readDecimal();
this.cpu = (int) d.readDecimal();
this.sqlCount = (int) d.readDecimal();
this.sqlTime = (int) d.readDecimal();
this.ipaddr = d.readBlob();
this.kbytes = (int) d.readDecimal();
this.status = (int) d.readDecimal();
this.userid = d.readDecimal();
this.userAgent = (int) d.readDecimal();
this.referer = (int) d.readDecimal();
this.group = (int) d.readDecimal();
this.apicallCount = (int) d.readDecimal();
this.apicallTime = (int) d.readDecimal();
if (d.available() > 0) {
this.countryCode = d.readText();
this.city = (int) d.readDecimal();
}
if (d.available() > 0) {
this.xType = d.readByte();
}
if (d.available() > 0) {
this.login = (int) d.readDecimal();
this.desc = (int) d.readDecimal();
}
if (d.available() > 0) {
this.webHash = (int) d.readDecimal();
this.webTime = (int) d.readDecimal();
}
if (d.available() >0) {
this.hasDump = d.readByte();
}
if (d.available() >0) {
this.threadNameHash = (int)d.readDecimal();
}
if (d.available() >0) {
this.text1 = d.readText();
this.text2 = d.readText();
}
return this;
}
}