提交 b7f220ce 编写于 作者: Y youyong

modify the health report

上级 c6a52ce6
......@@ -47,7 +47,7 @@
<manifest>
${basedir}/src/main/resources/META-INF/dal/model/database-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/sql-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/month-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/health-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/common-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/cross-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml,
......
......@@ -90,7 +90,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(BucketManager.class, ReportDao.class));
all.add(C(CommonAnalyzer.class).is(PER_LOOKUP)//
.req(HostinfoDao.class)//
.req(HostinfoDao.class,TaskDao.class)//
.req(BucketManager.class));
all.add(C(TopIpAnalyzer.class).is(PER_LOOKUP) //
......
......@@ -9,9 +9,12 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.common.model.entity.CommonReport;
import com.dianping.cat.hadoop.dal.Hostinfo;
import com.dianping.cat.hadoop.dal.HostinfoDao;
import com.dianping.cat.hadoop.dal.Task;
import com.dianping.cat.hadoop.dal.TaskDao;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.storage.BucketManager;
......@@ -22,11 +25,14 @@ public class CommonAnalyzer extends AbstractMessageAnalyzer<CommonReport> implem
private Map<String, CommonReport> m_reports = new HashMap<String, CommonReport>();
@Inject
private BucketManager m_bucketManager;
@Inject
private HostinfoDao m_hostInfoDao;
@Inject
private BucketManager m_bucketManager;
private TaskDao m_taskDao;
@Override
public void doCheckpoint(boolean atEnd) {
......@@ -57,6 +63,24 @@ public class CommonAnalyzer extends AbstractMessageAnalyzer<CommonReport> implem
}
}
}
Date period = new Date(m_startTime);
String ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress();
//Create task for health report
for (String domain : m_reports.keySet()) {
try {
Task task = m_taskDao.createLocal();
task.setCreationDate(new Date());
task.setProducer(ip);
task.setReportDomain(domain);
task.setReportName("health");
task.setReportPeriod(period);
task.setStatus(1); // status todo
m_taskDao.insert(task);
} catch (Exception e) {
Cat.logError(e);
}
}
}
@Override
......
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="month-report" root="true">
<entity name="health-report" root="true">
<attribute name="domain" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
......@@ -17,18 +17,13 @@
</entity>
<entity name="problem-info">
<attribute name="exceptions" value-type="long" />
<attribute name="avg-exceptions" value-type="double" />
<attribute name="longSqls" value-type="long" />
<attribute name="avg-longSqls" value-type="double" />
<attribute name="long-sqlPercent" value-type="double" />
<attribute name="longUrls" value-type="long" />
<attribute name="avg-longUrls" value-type="double" />
<attribute name="long-urlPercent" value-type="double" />
<attribute name="longServices" value-type="long" />
<attribute name="avg-longServices" value-type="double" />
<attribute name="long-servicePercent" value-type="double" />
<attribute name="longCaches" value-type="long" />
<attribute name="avg-longCaches" value-type="double" />
<attribute name="long-cachePercent" value-type="double" />
</entity>
<entity name="url">
......@@ -36,10 +31,8 @@
</entity>
<entity name="base-info">
<attribute name="total" value-type="int" />
<attribute name="avg" value-type="double" />
<attribute name="response-time" value-type="double" />
<attribute name="error-total" value-type="int" />
<attribute name="error-avg" value-type="double" />
<attribute name="error-percent" value-type="double" />
</entity>
<entity name="service">
......@@ -56,7 +49,6 @@
</entity>
<entity name="base-cache-info">
<attribute name="total" value-type="int" />
<attribute name="avg" value-type="double" />
<attribute name="response-time" value-type="double" />
<attribute name="hit-percent" value-type="double" />
</entity>
......
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="month-report-codegen.xml" />
<file path="month-report-model.xml" />
<file path="health-report-codegen.xml" />
<file path="health-report-model.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.monthreport.model" enable-merger="true" enable-json-builder="true"
<model model-package="com.dianping.cat.consumer.health.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-sax-parser="true" enable-json-parser="true" enable-base-visitor="true"
enable-native-builder="true" enable-native-parser="true">
<entity name="month-report" root="true">
<attribute name="domain" value-type="String" />
<entity name="health-report" root="true">
<attribute name="domain" value-type="String" key="true"/>
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="day" value-type="int" primitive="true"/>
<element name="domain" value-type="String" type="list" names="domains" />
<element name="domain" value-type="String" type="set" names="domainNames" />
<entity-ref name="problem-info" />
<entity-ref name="url" />
<entity-ref name="service" />
<entity-ref name="clientService" />
<entity-ref name="call" />
<entity-ref name="sql" />
<entity-ref name="web-cache" />
<entity-ref name="kvdb-cache" />
<entity-ref name="mem-cache" />
<entity-ref name="machine-info" />
</entity>
<entity name="machine-info">
<attribute name="numbers" value-type="int" primitive="true" />
<attribute name="avg-load" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-load" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-load-machine" value-type="String"/>
<attribute name="avg-oldgc" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-oldgc" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-oldgc-machine" value-type="String"/>
<attribute name="avg-http" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-http" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-http-machine" value-type="String"/>
<attribute name="avg-pigeon" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-pigeon" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-pigeon-machine" value-type="String"/>
<attribute name="avg-memory-used" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-memory-used" value-type="double" primitive="true" format="0.000000"/>
<attribute name="avg-max-memory-used-machine" value-type="String"/>
</entity>
<entity name="problem-info">
<attribute name="exceptions" value-type="long" primitive="true"/>
<attribute name="avg-exceptions" value-type="double" primitive="true" format="0.00"/>
<attribute name="longSqls" value-type="long" primitive="true"/>
<attribute name="avg-longSqls" value-type="double" primitive="true" format="0.00"/>
<attribute name="long-sqlPercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longUrls" value-type="long" primitive="true"/>
<attribute name="avg-longUrls" value-type="double" primitive="true" format="0.00"/>
<attribute name="long-urlPercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longServices" value-type="long" primitive="true"/>
<attribute name="avg-longServices" value-type="double" primitive="true" format="0.00"/>
<attribute name="long-servicePercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="longCaches" value-type="long" primitive="true" />
<attribute name="avg-longCaches" value-type="double" primitive="true" format="0.00"/>
<attribute name="long-cachePercent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="exceptions-flag" value-type="int" primitive="true"/>
<attribute name="avg-exceptions-flag" value-type="int" primitive="true" />
<attribute name="longSqls-flag" value-type="int" primitive="true"/>
<attribute name="avg-longSqls-flag" value-type="int" primitive="true" />
<attribute name="long-sqlPercent-flag" value-type="int" primitive="true" />
<attribute name="longUrls-flag" value-type="int" primitive="true"/>
<attribute name="avg-longUrls-flag" value-type="int" primitive="true" />
<attribute name="long-urlPercent-flag" value-type="int" primitive="true" />
<attribute name="longServices-flag" value-type="int" primitive="true"/>
<attribute name="avg-longServices-flag" value-type="int" primitive="true" />
<attribute name="long-servicePercent-flag" value-type="int" primitive="true" />
<attribute name="longCaches-flag" value-type="int" primitive="true" />
<attribute name="avg-longCaches-flag" value-type="int" primitive="true" />
<attribute name="long-cachePercent-flag" value-type="int" primitive="true" />
</entity>
<entity name="url">
<entity-ref name="base-info" />
</entity>
<entity name="base-info">
<attribute name="total" value-type="long" primitive="true"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="response-time" value-type="double" primitive="true" format="0.00"/>
<attribute name="error-total" value-type="long" primitive="true"/>
<attribute name="error-avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="error-percent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="success-percent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="total-flag" value-type="int" primitive="true"/>
<attribute name="avg-flag" value-type="int" primitive="true" />
<attribute name="response-time-flag" value-type="int" primitive="true" />
<attribute name="error-total-flag" value-type="int" primitive="true"/>
<attribute name="error-avg-flag" value-type="int" primitive="true" />
<attribute name="error-percent-flag" value-type="int" primitive="true" />
<attribute name="success-percent-flag" value-type="int" primitive="true"/>
<attribute name="tps" value-type="double" primitive="true" format="0.00"/>
</entity>
<entity name="service">
<entity-ref name="base-info" />
</entity>
<entity name="clientService">
<entity-ref name="base-info" />
</entity>
<entity name="call">
<entity-ref name="base-info" />
</entity>
......@@ -83,14 +76,8 @@
</entity>
<entity name="base-cache-info">
<attribute name="total" value-type="long" primitive="true"/>
<attribute name="avg" value-type="double" primitive="true" format="0.00"/>
<attribute name="response-time" value-type="double" primitive="true" format="0.00"/>
<attribute name="hit-percent" value-type="double" primitive="true" format="0.000000"/>
<attribute name="total-flag" value-type="int" primitive="true"/>
<attribute name="avg-flag" value-type="int" primitive="true" />
<attribute name="response-time-flag" value-type="int" primitive="true" />
<attribute name="hit-percent-flag" value-type="int" primitive="true" />
</entity>
<entity name="kvdb-cache">
<entity-ref name="base-cache-info" />
......
......@@ -171,6 +171,9 @@
<requirement>
<role>com.dianping.cat.hadoop.dal.HostinfoDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
......
<month-report domain="GroupWeb" startTime="2012-07-20 13:00:00"
<daily-report domain="GroupWeb" startTime="2012-07-20 13:00:00"
endTime="2012-07-20 13:59:59" day="10">
<domain>Cat</domain>
<domain>MobileApi</domain>
......@@ -39,4 +39,4 @@
<mem-cache>
<base-cache-info total="199" avg="100.0" response-time="0.2" hit-percent="12.0"></base-cache-info>
</mem-cache>
</month-report>
\ No newline at end of file
</daily-report>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="config" type="ConfigType"/>
<xs:complexType name="ConfigType">
<xs:sequence>
<xs:element name="base-log-dir" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="servers" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="server" type="ServerType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="domain" type="DomainType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="bind" type="BindType" minOccurs="0" maxOccurs="1"/>
<xs:element name="properties" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="property" type="PropertyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="mode" type="xs:string" use="required"/>
<xs:attribute name="enabled" type="xs:boolean" default="true"/>
<xs:attribute name="dump-locked" type="xs:boolean"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:complexType name="ServerType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ip" type="xs:string" use="required"/>
<xs:attribute name="port" type="xs:int"/>
<xs:attribute name="enabled" type="xs:boolean" default="true"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DomainType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="ip" type="xs:string"/>
<xs:attribute name="max-threads" type="xs:int" default="500"/>
<xs:attribute name="enabled" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="BindType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ip" type="xs:string"/>
<xs:attribute name="port" type="xs:int" default="2280"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="PropertyType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="config" type="ConfigType"/>
<xs:complexType name="ConfigType">
<xs:sequence>
<xs:element name="base-log-dir" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="servers" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="server" type="ServerType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="domain" type="DomainType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="bind" type="BindType" minOccurs="0" maxOccurs="1"/>
<xs:element name="properties" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="property" type="PropertyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="mode" type="xs:string" use="required"/>
<xs:attribute name="enabled" type="xs:boolean" default="true"/>
<xs:attribute name="dump-locked" type="xs:boolean"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:complexType name="ServerType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ip" type="xs:string" use="required"/>
<xs:attribute name="port" type="xs:int"/>
<xs:attribute name="enabled" type="xs:boolean" default="true"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DomainType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="ip" type="xs:string"/>
<xs:attribute name="max-threads" type="xs:int" default="500"/>
<xs:attribute name="enabled" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="BindType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ip" type="xs:string"/>
<xs:attribute name="port" type="xs:int" default="2280"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="PropertyType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="status" type="StatusType"/>
<xs:complexType name="StatusType">
<xs:sequence>
<xs:element name="runtime" type="RuntimeType" minOccurs="0" maxOccurs="1"/>
<xs:element name="os" type="OsType" minOccurs="0" maxOccurs="1"/>
<xs:element name="disk" type="DiskType" minOccurs="0" maxOccurs="1"/>
<xs:element name="memory" type="MemoryType" minOccurs="0" maxOccurs="1"/>
<xs:element name="thread" type="ThreadType" minOccurs="0" maxOccurs="1"/>
<xs:element name="message" type="MessageType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="timestamp" type="xs:string"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:complexType name="RuntimeType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="start-time" type="xs:long"/>
<xs:attribute name="up-time" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="OsType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="arch" type="xs:string"/>
<xs:attribute name="version" type="xs:string"/>
<xs:attribute name="available-processors" type="xs:int"/>
<xs:attribute name="system-load-average" type="xs:double"/>
<xs:attribute name="process-time" type="xs:long"/>
<xs:attribute name="total-physical-memory" type="xs:long"/>
<xs:attribute name="free-physical-memory" type="xs:long"/>
<xs:attribute name="committed-virtual-memory" type="xs:long"/>
<xs:attribute name="total-swap-space" type="xs:long"/>
<xs:attribute name="free-swap-space" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DiskType">
<xs:sequence>
<xs:element name="disk-volume" type="DiskVolumeType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DiskVolumeType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="total" type="xs:long"/>
<xs:attribute name="free" type="xs:long"/>
<xs:attribute name="usable" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="MemoryType">
<xs:sequence>
<xs:element name="gc" type="GcType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="max" type="xs:long"/>
<xs:attribute name="total" type="xs:long"/>
<xs:attribute name="free" type="xs:long"/>
<xs:attribute name="heap-usage" type="xs:long"/>
<xs:attribute name="non-heap-usage" type="xs:long"/>
</xs:complexType>
<xs:complexType name="ThreadType">
<xs:sequence>
<xs:element name="dump" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="count" type="xs:int"/>
<xs:attribute name="daemon-count" type="xs:int"/>
<xs:attribute name="peek-count" type="xs:int"/>
<xs:attribute name="total-started-count" type="xs:int"/>
<xs:attribute name="cat-thread-count" type="xs:int"/>
<xs:attribute name="pigeon-thread-count" type="xs:int"/>
<xs:attribute name="http-thread-count" type="xs:int"/>
</xs:complexType>
<xs:complexType name="MessageType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="produced" type="xs:long"/>
<xs:attribute name="overflowed" type="xs:long"/>
<xs:attribute name="bytes" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="GcType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="count" type="xs:long"/>
<xs:attribute name="time" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="status" type="StatusType"/>
<xs:complexType name="StatusType">
<xs:sequence>
<xs:element name="runtime" type="RuntimeType" minOccurs="0" maxOccurs="1"/>
<xs:element name="os" type="OsType" minOccurs="0" maxOccurs="1"/>
<xs:element name="disk" type="DiskType" minOccurs="0" maxOccurs="1"/>
<xs:element name="memory" type="MemoryType" minOccurs="0" maxOccurs="1"/>
<xs:element name="thread" type="ThreadType" minOccurs="0" maxOccurs="1"/>
<xs:element name="message" type="MessageType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="timestamp" type="xs:string"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:complexType name="RuntimeType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="start-time" type="xs:long"/>
<xs:attribute name="up-time" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="OsType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="arch" type="xs:string"/>
<xs:attribute name="version" type="xs:string"/>
<xs:attribute name="available-processors" type="xs:int"/>
<xs:attribute name="system-load-average" type="xs:double"/>
<xs:attribute name="process-time" type="xs:long"/>
<xs:attribute name="total-physical-memory" type="xs:long"/>
<xs:attribute name="free-physical-memory" type="xs:long"/>
<xs:attribute name="committed-virtual-memory" type="xs:long"/>
<xs:attribute name="total-swap-space" type="xs:long"/>
<xs:attribute name="free-swap-space" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DiskType">
<xs:sequence>
<xs:element name="disk-volume" type="DiskVolumeType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DiskVolumeType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="total" type="xs:long"/>
<xs:attribute name="free" type="xs:long"/>
<xs:attribute name="usable" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="MemoryType">
<xs:sequence>
<xs:element name="gc" type="GcType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="max" type="xs:long"/>
<xs:attribute name="total" type="xs:long"/>
<xs:attribute name="free" type="xs:long"/>
<xs:attribute name="heap-usage" type="xs:long"/>
<xs:attribute name="non-heap-usage" type="xs:long"/>
</xs:complexType>
<xs:complexType name="ThreadType">
<xs:sequence>
<xs:element name="dump" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="count" type="xs:int"/>
<xs:attribute name="daemon-count" type="xs:int"/>
<xs:attribute name="peek-count" type="xs:int"/>
<xs:attribute name="total-started-count" type="xs:int"/>
<xs:attribute name="cat-thread-count" type="xs:int"/>
<xs:attribute name="pigeon-thread-count" type="xs:int"/>
<xs:attribute name="http-thread-count" type="xs:int"/>
</xs:complexType>
<xs:complexType name="MessageType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="produced" type="xs:long"/>
<xs:attribute name="overflowed" type="xs:long"/>
<xs:attribute name="bytes" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="GcType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="count" type="xs:long"/>
<xs:attribute name="time" type="xs:long"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
......@@ -11,7 +11,6 @@ import com.dianping.cat.message.spi.internal.DefaultMessageHandler;
import com.dianping.cat.report.page.ip.location.IPSeekerManager;
import com.dianping.cat.report.task.DailyTaskProducer;
import com.dianping.cat.report.task.TaskConsumer;
import com.dianping.cat.report.task.monthreport.MonthReportBuilderTask;
import com.site.helper.Threads;
import com.site.initialization.AbstractModule;
import com.site.initialization.Module;
......@@ -31,12 +30,10 @@ public class CatHomeModule extends AbstractModule {
TaskConsumer taskConsumer = ctx.lookup(TaskConsumer.class);
DailyTaskProducer dailyTaskProducer = ctx.lookup(DailyTaskProducer.class);
MonthReportBuilderTask monthReportBuilder = ctx.lookup(MonthReportBuilderTask.class);
if (serverConfigManager.isJobMachine() && !serverConfigManager.isLocalMode()) {
Threads.forGroup("Cat").start(dailyTaskProducer);
Threads.forGroup("Cat").start(taskConsumer);
Threads.forGroup("Cat").start(monthReportBuilder);
}
}
......
......@@ -8,7 +8,6 @@ import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.hadoop.dal.DailyreportDao;
import com.dianping.cat.hadoop.dal.GraphDao;
import com.dianping.cat.hadoop.dal.HostinfoDao;
import com.dianping.cat.hadoop.dal.MonthreportDao;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.TaskDao;
import com.dianping.cat.message.spi.MessageConsumer;
......@@ -21,7 +20,6 @@ import com.dianping.cat.report.graph.ValueTranslater;
import com.dianping.cat.report.page.cross.DomainManager;
import com.dianping.cat.report.task.DailyTaskProducer;
import com.dianping.cat.report.task.DefaultTaskConsumer;
import com.dianping.cat.report.task.ReportFacade;
import com.dianping.cat.report.task.TaskConsumer;
import com.dianping.cat.report.task.cross.CrossMerger;
import com.dianping.cat.report.task.cross.CrossReportBuilder;
......@@ -30,15 +28,17 @@ import com.dianping.cat.report.task.database.DatabaseReportBuilder;
import com.dianping.cat.report.task.event.EventGraphCreator;
import com.dianping.cat.report.task.event.EventMerger;
import com.dianping.cat.report.task.event.EventReportBuilder;
import com.dianping.cat.report.task.health.HealthReportBuilder;
import com.dianping.cat.report.task.health.HealthServiceCollector;
import com.dianping.cat.report.task.heartbeat.HeartbeatGraphCreator;
import com.dianping.cat.report.task.heartbeat.HeartbeatMerger;
import com.dianping.cat.report.task.heartbeat.HeartbeatReportBuilder;
import com.dianping.cat.report.task.matrix.MatrixMerger;
import com.dianping.cat.report.task.matrix.MatrixReportBuilder;
import com.dianping.cat.report.task.monthreport.MonthReportBuilderTask;
import com.dianping.cat.report.task.problem.ProblemGraphCreator;
import com.dianping.cat.report.task.problem.ProblemMerger;
import com.dianping.cat.report.task.problem.ProblemReportBuilder;
import com.dianping.cat.report.task.spi.ReportFacade;
import com.dianping.cat.report.task.sql.SqlMerger;
import com.dianping.cat.report.task.sql.SqlReportBuilder;
import com.dianping.cat.report.task.transaction.TransactionGraphCreator;
......@@ -66,9 +66,6 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(GraphBuilder.class, DefaultGraphBuilder.class) //
.req(ValueTranslater.class));
all.add(C(MonthReportBuilderTask.class)//
.req(MonthreportDao.class, DailyreportDao.class));
all.add(C(TaskConsumer.class, DefaultTaskConsumer.class) //
.req(TaskDao.class, ReportFacade.class));
......@@ -114,13 +111,20 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(DailyTaskProducer.class, DailyTaskProducer.class) //
.req(TaskDao.class, ReportDao.class, DailyreportDao.class));
all.add(C(HealthReportBuilder.class) //
.req(GraphDao.class, ReportDao.class, DailyreportDao.class,//
HealthServiceCollector.class));
all.add(C(ReportFacade.class)//
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class,
HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class,
DatabaseReportBuilder.class, SqlReportBuilder.class, TaskDao.class));
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class,//
HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class,//
DatabaseReportBuilder.class, SqlReportBuilder.class, HealthReportBuilder.class,//
TaskDao.class));
all.add(C(DomainManager.class, DomainManager.class).req(ServerConfigManager.class, HostinfoDao.class));
all.add(C(HealthServiceCollector.class).req(DomainManager.class, ReportDao.class));
all.addAll(new ServiceComponentConfigurator().defineComponents());
all.add(C(Module.class, CatHomeModule.ID, CatHomeModule.class));
......
......@@ -33,7 +33,7 @@ com.dianping.cat.report.page.task.Handler.class,
com.dianping.cat.report.page.matrix.Handler.class,
com.dianping.cat.report.page.monthreport.Handler.class,
com.dianping.cat.report.page.health.Handler.class,
com.dianping.cat.report.page.cross.Handler.class,
......
......@@ -21,6 +21,8 @@ public enum ReportPage implements Page {
MODEL("model", "model", "Model", "Service Model", false),
SQL("sql", "sql", "SQL", "SQL Report", true),
HEATMAP("heatmap", "heatmap", "Heatmap", "Heatmap", false),
DASHBOARD("dashboard", "dashboard", "Dashboard", "Dashboard", false),
......@@ -29,14 +31,12 @@ public enum ReportPage implements Page {
MATRIX("matrix", "matrix", "Matrix", "Matrix", true),
MONTHREPORT("monthreport", "monthreport", "Monthreport", "Monthreport", false),
HEALTH("health", "health", "Health", "Health", true),
CROSS("cross", "cross", "Cross", "Cross", true),
CACHE("cache", "cache", "Cache", "Cache", true),
SQL("sql", "sql", "SQL", "SQL Report", true),
DATABASE("database", "database", "Database", "Database", true);
private String m_name;
......
......@@ -258,12 +258,17 @@ public class Handler implements PageHandler<Context> {
request.setProperty("type", "Cache.kvdb");
ModelResponse<EventReport> kvdbResponse = m_eventService.invoke(request);
EventReport kvdbReport = kvdbResponse.getModel();
request.setProperty("type", "Cache.memcached-tuangou");
ModelResponse<EventReport> tuangouResponse = m_eventService.invoke(request);
EventReport tuangouReport = tuangouResponse.getModel();
EventReportMerger merger = new EventReportMerger(new EventReport(domain));
merger.visitEventReport(webCacheReport);
merger.visitEventReport(memcachedReport);
merger.visitEventReport(kvdbReport);
merger.visitEventReport(tuangouReport);
return merger.getEventReport();
} else {
......@@ -295,12 +300,17 @@ public class Handler implements PageHandler<Context> {
request.setProperty("type", "Cache.kvdb");
ModelResponse<TransactionReport> kvdbResponse = m_transactionService.invoke(request);
TransactionReport kvdbReport = kvdbResponse.getModel();
request.setProperty("type", "Cache.memcached-tuangou");
ModelResponse<TransactionReport> tuangouResponse = m_transactionService.invoke(request);
TransactionReport tuangouReport = tuangouResponse.getModel();
TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(domain));
merger.visitTransactionReport(webCacheReport);
merger.visitTransactionReport(memcachedReport);
merger.visitTransactionReport(kvdbReport);
merger.visitTransactionReport(tuangouReport);
return merger.getTransactionReport();
} else {
request.setProperty("type", type);
......
package com.dianping.cat.report.page.cache;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.dianping.cat.consumer.event.model.entity.EventName;
......@@ -18,8 +15,6 @@ public class TransactionReportVistor extends BaseVisitor {
private CacheReport m_cacheReport = new CacheReport();
private Set<String> m_cacheTypes = new HashSet<String>();
private String m_currentIp;
private String m_currentType;
......@@ -110,9 +105,6 @@ public class TransactionReportVistor extends BaseVisitor {
@Override
public void visitTransactionReport(TransactionReport transactionReport) {
m_cacheTypes.add("Cache.memcached");
m_cacheTypes.add("Cache.web");
m_cacheTypes.add("Cache.kvdb");
m_cacheReport.setSortBy(m_sortBy);
super.visitTransactionReport(transactionReport);
......@@ -126,7 +118,7 @@ public class TransactionReportVistor extends BaseVisitor {
@Override
public void visitType(TransactionType transactionType) {
String id = transactionType.getId();
if (m_cacheTypes.contains(id)) {
if (id.startsWith("Cache.")) {
if (StringUtils.isEmpty(m_type)) {
m_currentType = transactionType.getId();
com.dianping.cat.consumer.event.model.entity.Machine machine = m_eventReport
......
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
public enum Action implements com.site.web.mvc.Action {
ALL("all"),
HOURLY_REPORT("hourly"),
HISTORY_REPORT("history");
VIEW("view");
private String m_name;
private Action(String name) {
m_name = name;
}
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
......@@ -15,12 +21,6 @@ public enum Action implements com.site.web.mvc.Action {
return defaultAction;
}
private String m_name;
private Action(String name) {
m_name = name;
}
@Override
public String getName() {
return m_name;
......
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
import com.dianping.cat.report.ReportContext;
......
package com.dianping.cat.report.page.health;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.health.model.entity.HealthReport;
import com.dianping.cat.consumer.health.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.DailyreportDao;
import com.dianping.cat.hadoop.dal.DailyreportEntity;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.task.health.HealthReportMerger;
import com.site.lookup.annotation.Inject;
import com.site.lookup.util.StringUtils;
import com.site.web.mvc.PageHandler;
import com.site.web.mvc.annotation.InboundActionMeta;
import com.site.web.mvc.annotation.OutboundActionMeta;
import com.site.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
public static final long ONE_HOUR = 3600 * 1000L;
@Inject
private JspViewer m_jspViewer;
@Inject
private ServerConfigManager m_manager;
@Inject
private ReportDao m_reportDao;
@Inject
private DailyreportDao m_dailyReportDao;
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "health")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "health")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
normalize(model, payload);
switch (payload.getAction()) {
case HOURLY_REPORT:
HealthReport report = getHourlyReport(payload.getDate(), payload.getDomain());
model.setReport(report);
break;
case HISTORY_REPORT:
HealthReport historyReport = getHistoryReport(payload.getHistoryStartDate(), payload.getHistoryEndDate(),
payload.getDomain());
model.setReport(historyReport);
break;
}
m_jspViewer.view(ctx, model);
}
private HealthReport getHistoryReport(Date startDate, Date endDate, String domain) {
try {
List<Dailyreport> reports = m_dailyReportDao.findAllByDomainNameDuration(startDate, endDate, domain, "health",
DailyreportEntity.READSET_FULL);
HealthReportMerger merger = new HealthReportMerger(new HealthReport(domain));
HealthReport healthReport = merger.getHealthReport();
merger.setDuration(endDate.getTime() - startDate.getTime());
for (Dailyreport report : reports) {
String xml = report.getContent();
HealthReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
healthReport.getDomainNames().addAll(model.getDomainNames());
}
return healthReport;
} catch (Exception e) {
Cat.logError(e);
}
return new HealthReport(domain);
}
private HealthReport getHourlyReport(long date, String domain) {
try {
List<Report> reports = m_reportDao.findAllByPeriodDomainName(new Date(date), domain, "health",
ReportEntity.READSET_FULL);
HealthReportMerger merger = new HealthReportMerger(new HealthReport(domain));
HealthReport healthReport = merger.getHealthReport();
merger.setDuration(ONE_HOUR);
for (Report report : reports) {
String xml = report.getContent();
HealthReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
healthReport.getDomainNames().addAll(model.getDomainNames());
}
return healthReport;
} catch (Exception e) {
Cat.logError(e);
}
return new HealthReport(domain);
}
public void normalize(Model model, Payload payload) {
Action action = payload.getAction();
model.setAction(action);
model.setPage(ReportPage.HEALTH);
if (StringUtils.isEmpty(payload.getDomain())) {
payload.setDomain(m_manager.getConsoleDefaultDomain());
}
model.setDisplayDomain(payload.getDomain());
if (payload.getPeriod().isFuture()) {
model.setLongDate(payload.getCurrentDate());
} else {
model.setLongDate(payload.getDate());
}
if (action == Action.HISTORY_REPORT) {
String type = payload.getReportType();
if (type == null || type.length() == 0) {
payload.setReportType("day");
}
model.setReportType(payload.getReportType());
payload.computeStartDate();
if (!payload.isToday()) {
payload.setYesterdayDefault();
}
model.setLongDate(payload.getDate());
model.setCustomDate(payload.getHistoryStartDate(), payload.getHistoryEndDate());
}
}
}
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
public enum JspFile {
ALL("/jsp/report/monthreportAll.jsp"),
HOURLY("/jsp/report/health.jsp"),
VIEW("/jsp/report/monthreport.jsp"), ;
HISTORY("/jsp/report/healthHistory.jsp"),
;
private String m_path;
......
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
import com.dianping.cat.report.ReportPage;
import com.site.web.mvc.view.BaseJspViewer;
......@@ -9,10 +9,11 @@ public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model>
Action action = model.getAction();
switch (action) {
case VIEW:
return JspFile.VIEW.getPath();
case ALL:
return JspFile.ALL.getPath();
case HOURLY_REPORT:
return JspFile.HOURLY.getPath();
case HISTORY_REPORT:
return JspFile.HISTORY.getPath();
default:
}
throw new RuntimeException("Unknown action: " + action);
......
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.dianping.cat.consumer.monthreport.model.entity.MonthReport;
import com.dianping.cat.consumer.health.model.entity.HealthReport;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.view.StringSortHelper;
public class Model extends AbstractReportModel<Action, Context> {
private String m_domain;
private MonthReport m_report;
private MonthReport m_reportLast;
private MonthReport m_reportLastTwo;
private List<MonthReport> m_reports;
private HealthReport m_report;
public Model(Context ctx) {
super(ctx);
......@@ -25,63 +17,37 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public Action getDefaultAction() {
return Action.VIEW;
return Action.HOURLY_REPORT;
}
@Override
public String getDomain() {
return m_domain;
if (m_report != null) {
return m_report.getDomain();
}
return getDisplayDomain();
}
@Override
public Collection<String> getDomains() {
if (m_report != null) {
List<String> domains = m_report.getDomains();
if (m_report == null) {
ArrayList<String> arrayList = new ArrayList<String>();
StringSortHelper.sortDomain(domains);
return domains;
}
arrayList.add(getDomain());
return arrayList;
} else {
Set<String> domainNames = m_report.getDomainNames();
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add(getDomain());
return arrayList;
return StringSortHelper.sortDomain(domainNames);
}
}
public MonthReport getReport() {
public HealthReport getReport() {
return m_report;
}
public List<MonthReport> getReports() {
return m_reports;
}
public void setDomain(String domain) {
m_domain = domain;
}
public void setReport(MonthReport report) {
public void setReport(HealthReport report) {
m_report = report;
}
public void setReports(List<MonthReport> reports) {
m_reports = reports;
}
public MonthReport getReportLast() {
return m_reportLast;
}
public void setReportLast(MonthReport reportLast) {
m_reportLast = reportLast;
}
public MonthReport getReportLastTwo() {
return m_reportLastTwo;
}
public void setReportLastTwo(MonthReport reportLastTwo) {
m_reportLastTwo = reportLastTwo;
}
}
package com.dianping.cat.report.page.monthreport;
package com.dianping.cat.report.page.health;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
......@@ -6,17 +6,17 @@ import com.site.web.mvc.ActionContext;
import com.site.web.mvc.payload.annotation.FieldMeta;
public class Payload extends AbstractReportPayload<Action> {
public Payload() {
super(ReportPage.HEALTH);
}
private ReportPage m_page;
@FieldMeta("op")
private Action m_action;
@FieldMeta("domain")
private String m_domain;
private ReportPage m_page;
public Payload() {
super(ReportPage.MONTHREPORT);
public void setAction(String action) {
m_action = Action.getByName(action, Action.HOURLY_REPORT);
}
@Override
......@@ -24,32 +24,20 @@ public class Payload extends AbstractReportPayload<Action> {
return m_action;
}
public String getDomain() {
return m_domain;
}
@Override
public ReportPage getPage() {
return m_page;
}
public void setAction(String action) {
m_action = Action.getByName(action, Action.VIEW);
}
public void setDomain(String domain) {
m_domain = domain;
}
@Override
public void setPage(String page) {
m_page = ReportPage.getByName(page, ReportPage.MONTHREPORT);
m_page = ReportPage.getByName(page, ReportPage.HEALTH);
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.VIEW;
m_action = Action.HOURLY_REPORT;
}
}
}
......@@ -43,7 +43,7 @@ public class HistoricalDatabaseService extends BaseHistoricalModelService<Databa
}
private DatabaseReport getReportFromDatabase(long timestamp, String database) throws Exception {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(new Date(timestamp), database, 1, getName(),
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(new Date(timestamp), database, 2, getName(),
ReportEntity.READSET_FULL);
DatabaseReportMerger merger = new DatabaseReportMerger(new DatabaseReport(database));
......
package com.dianping.cat.report.page.monthreport;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import org.xml.sax.SAXException;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.monthreport.model.entity.MonthReport;
import com.dianping.cat.consumer.monthreport.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Monthreport;
import com.dianping.cat.hadoop.dal.MonthreportDao;
import com.dianping.cat.hadoop.dal.MonthreportEntity;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
import com.site.web.mvc.PageHandler;
import com.site.web.mvc.annotation.InboundActionMeta;
import com.site.web.mvc.annotation.OutboundActionMeta;
import com.site.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject
private MonthreportDao m_monthreportDao;
@Inject
private ServerConfigManager m_manager;
private MonthReport buildMonthReport(String domain, Date start) throws DalException, SAXException, IOException {
try {
Monthreport report = m_monthreportDao.findByDomainPeriod(domain, start, MonthreportEntity.READSET_FULL);
String content = report.getContent();
MonthReport monthreport = DefaultSaxParser.parse(content);
return monthreport;
} catch (Exception e) {
}
return new MonthReport();
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "monthreport")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "monthreport")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
normalize(payload, model);
try {
Action action = payload.getAction();
Date start = payload.getHistoryStartDate();
Date end = payload.getHistoryEndDate();
switch (action) {
case VIEW:
MonthReport report = buildMonthReport(payload.getDomain(), start);
MonthReport reportLast = buildMonthReport(payload.getDomain(), getLastMonthDate(start, -1));
MonthReport reportLastTwo = buildMonthReport(payload.getDomain(), getLastMonthDate(start, -2));
// MonthReportFlagBuilder lastBuilder = new MonthReportFlagBuilder();
// lastBuilder.setLastMonthReport(last);
// lastBuilder.visitMonthReport(report);
//
// MonthReportFlagBuilder lastTwoBuilder = new MonthReportFlagBuilder();
// lastTwoBuilder.setLastMonthReport(lastTwo);
// lastTwoBuilder.visitMonthReport(last);
model.setReport(report);
model.setReportLast(reportLast);
model.setReportLastTwo(reportLastTwo);
break;
case ALL:
List<MonthReport> reports = new ArrayList<MonthReport>();
List<String> domains = getAllDomains(start, end);
for (String domain : domains) {
MonthReport buildProblemReport = buildMonthReport(domain, start);
reports.add(buildProblemReport);
}
model.setReports(reports);
break;
}
} catch (Exception e) {
Cat.logError(e);
}
m_jspViewer.view(ctx, model);
}
private Date getLastMonthDate(Date date, int step) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, step);
return cal.getTime();
}
public MonthReport buildMonthReportFlag(MonthReport last, MonthReport current) {
if (last != null) {
MonthReportFlagBuilder flagBuilder = new MonthReportFlagBuilder();
flagBuilder.setLastMonthReport(last);
flagBuilder.visitMonthReport(current);
}
return current;
}
private List<String> getAllDomains(Date start, Date end) {
List<String> domains = new ArrayList<String>();
try {
List<Monthreport> reports = m_monthreportDao.findByPeriod(start, MonthreportEntity.READSET_DOMAIN_PERIOD);
for(Monthreport report:reports){
domains.add(report.getDomain());
}
} catch (Exception e) {
Cat.logError(e);
}
return domains;
}
private void normalize(Payload payload, Model model) {
String domain = payload.getDomain();
if (domain == null || domain.length() == 0) {
payload.setDomain(m_manager.getConsoleDefaultDomain());
}
model.setDomain(payload.getDomain());
model.setAction(payload.getAction());
payload.setReportType("month");
payload.computeStartDate();
model.setLongDate(payload.getDate());
}
}
package com.dianping.cat.report.page.monthreport;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.monthreport.model.entity.BaseCacheInfo;
import com.dianping.cat.consumer.monthreport.model.entity.BaseInfo;
import com.dianping.cat.consumer.monthreport.model.entity.Call;
import com.dianping.cat.consumer.monthreport.model.entity.KvdbCache;
import com.dianping.cat.consumer.monthreport.model.entity.MemCache;
import com.dianping.cat.consumer.monthreport.model.entity.MonthReport;
import com.dianping.cat.consumer.monthreport.model.entity.ProblemInfo;
import com.dianping.cat.consumer.monthreport.model.entity.Service;
import com.dianping.cat.consumer.monthreport.model.entity.Sql;
import com.dianping.cat.consumer.monthreport.model.entity.Url;
import com.dianping.cat.consumer.monthreport.model.entity.WebCache;
import com.dianping.cat.consumer.monthreport.model.transform.BaseVisitor;
public class MonthReportFlagBuilder extends BaseVisitor {
private MonthReport m_lastMonthReport;
private String m_currentCache;
private String m_currentType;
private static final int HIGH_GOOD = 1;
private static final int HIGH_BAD = 2;
private static final int LOW_GOOD = -1;
private static final int LOW_BAD = -2;
public MonthReportFlagBuilder setLastMonthReport(MonthReport report) {
m_lastMonthReport = report;
return this;
}
@Override
public void visitBaseCacheInfo(BaseCacheInfo baseCacheInfo) {
try {
BaseCacheInfo lastCache = null;
if (m_currentCache.equals("kvdbCache")) {
lastCache = m_lastMonthReport.getKvdbCache().getBaseCacheInfo();
} else if (m_currentCache.equals("memCache")) {
lastCache = m_lastMonthReport.getMemCache().getBaseCacheInfo();
} else if (m_currentCache.equals("webCache")) {
lastCache = m_lastMonthReport.getWebCache().getBaseCacheInfo();
} else {
throw new RuntimeException("inter error in build cache flag!");
}
if (baseCacheInfo.getTotal() > lastCache.getTotal()) {
baseCacheInfo.setTotalFlag(HIGH_GOOD);
} else if (baseCacheInfo.getTotal() < lastCache.getTotal()) {
baseCacheInfo.setTotalFlag(LOW_BAD);
}
if (baseCacheInfo.getAvg() > lastCache.getAvg()) {
baseCacheInfo.setAvgFlag(HIGH_GOOD);
} else if (baseCacheInfo.getAvg() < lastCache.getAvg()) {
baseCacheInfo.setAvgFlag(LOW_BAD);
}
if (baseCacheInfo.getResponseTime() > lastCache.getResponseTime()) {
baseCacheInfo.setResponseTimeFlag(HIGH_BAD);
} else if (baseCacheInfo.getResponseTime() < lastCache.getResponseTime()) {
baseCacheInfo.setResponseTimeFlag(LOW_GOOD);
}
if (baseCacheInfo.getHitPercent() > lastCache.getHitPercent()) {
baseCacheInfo.setHitPercentFlag(HIGH_GOOD);
} else if (baseCacheInfo.getHitPercent() < lastCache.getHitPercent()) {
baseCacheInfo.setHitPercentFlag(LOW_BAD);
}
} catch (Exception e) {
Cat.logError(e);
}
}
@Override
public void visitBaseInfo(BaseInfo baseInfo) {
try {
BaseInfo lastBaseInfo = null;
if (m_currentType.equals("Call")) {
lastBaseInfo = m_lastMonthReport.getCall().getBaseInfo();
} else if (m_currentType.equals("URL")) {
lastBaseInfo = m_lastMonthReport.getUrl().getBaseInfo();
} else if (m_currentType.equals("Sql")) {
lastBaseInfo = m_lastMonthReport.getSql().getBaseInfo();
} else if (m_currentType.equals("Service")) {
lastBaseInfo = m_lastMonthReport.getService().getBaseInfo();
} else {
throw new RuntimeException("inter error in build baseInfo flag!");
}
if (baseInfo.getAvg() > lastBaseInfo.getAvg()) {
baseInfo.setAvgFlag(HIGH_GOOD);
} else if (baseInfo.getAvg() < lastBaseInfo.getAvg()) {
baseInfo.setAvgFlag(LOW_BAD);
}
if (baseInfo.getTotal() > lastBaseInfo.getTotal()) {
baseInfo.setTotalFlag(HIGH_GOOD);
} else if (baseInfo.getTotal() < lastBaseInfo.getTotal()) {
baseInfo.setTotalFlag(LOW_BAD);
}
if (baseInfo.getErrorTotal() > lastBaseInfo.getErrorTotal()) {
baseInfo.setErrorTotalFlag(HIGH_BAD);
} else if (baseInfo.getErrorTotal() < lastBaseInfo.getErrorTotal()) {
baseInfo.setErrorTotalFlag(LOW_GOOD);
}
if (baseInfo.getErrorAvg() > lastBaseInfo.getErrorAvg()) {
baseInfo.setErrorAvgFlag(HIGH_BAD);
} else if (baseInfo.getErrorAvg() < lastBaseInfo.getErrorAvg()) {
baseInfo.setErrorAvgFlag(LOW_GOOD);
}
if (baseInfo.getResponseTime() > lastBaseInfo.getResponseTime()) {
baseInfo.setResponseTimeFlag(HIGH_BAD);
} else if (baseInfo.getResponseTime() < lastBaseInfo.getResponseTime()) {
baseInfo.setResponseTimeFlag(LOW_GOOD);
}
if (baseInfo.getErrorPercent() > lastBaseInfo.getErrorPercent()) {
baseInfo.setErrorPercentFlag(HIGH_BAD);
} else if (baseInfo.getErrorPercent() < lastBaseInfo.getErrorPercent()) {
baseInfo.setErrorPercentFlag(LOW_GOOD);
}
if (baseInfo.getSuccessPercent() > lastBaseInfo.getSuccessPercent()) {
baseInfo.setSuccessPercentFlag(HIGH_GOOD);
} else if (baseInfo.getSuccessPercent() < lastBaseInfo.getSuccessPercent()) {
baseInfo.setSuccessPercentFlag(LOW_BAD);
}
} catch (Exception e) {
Cat.logError(e);
}
}
@Override
public void visitCall(Call call) {
m_currentType = "Call";
super.visitCall(call);
}
@Override
public void visitKvdbCache(KvdbCache kvdbCache) {
m_currentCache = "kvdbCache";
super.visitKvdbCache(kvdbCache);
}
@Override
public void visitMemCache(MemCache memCache) {
m_currentCache = "memCache";
super.visitMemCache(memCache);
}
@Override
public void visitMonthReport(MonthReport monthReport) {
super.visitMonthReport(monthReport);
}
@Override
public void visitProblemInfo(ProblemInfo problemInfo) {
try {
ProblemInfo lastProblemInfo = m_lastMonthReport.getProblemInfo();
if (problemInfo.getExceptions() > lastProblemInfo.getExceptions()) {
problemInfo.setExceptionsFlag(HIGH_BAD);
} else if (problemInfo.getExceptions() < lastProblemInfo.getExceptions()) {
problemInfo.setExceptionsFlag(LOW_GOOD);
}
if (problemInfo.getAvgExceptions() > lastProblemInfo.getAvgExceptions()) {
problemInfo.setAvgExceptionsFlag(HIGH_GOOD);
} else if (problemInfo.getAvgExceptions() < lastProblemInfo.getAvgExceptions()) {
problemInfo.setAvgExceptionsFlag(LOW_BAD);
}
if (problemInfo.getLongSqls() > lastProblemInfo.getLongSqls()) {
problemInfo.setLongSqlsFlag(HIGH_BAD);
} else if (problemInfo.getLongSqls() < lastProblemInfo.getLongSqls()) {
problemInfo.setLongSqlsFlag(LOW_GOOD);
}
if (problemInfo.getAvgLongSqls() > lastProblemInfo.getAvgLongSqls()) {
problemInfo.setAvgLongSqlsFlag(HIGH_BAD);
} else if (problemInfo.getAvgLongSqls() < lastProblemInfo.getAvgLongSqls()) {
problemInfo.setAvgLongSqlsFlag(LOW_GOOD);
}
if (problemInfo.getLongSqlPercent() > lastProblemInfo.getLongSqlPercent()) {
problemInfo.setLongSqlPercentFlag(HIGH_BAD);
} else if (problemInfo.getLongSqlPercent() < lastProblemInfo.getLongSqlPercent()) {
problemInfo.setLongSqlPercentFlag(LOW_GOOD);
}
if (problemInfo.getLongUrls() > lastProblemInfo.getLongUrls()) {
problemInfo.setLongUrlsFlag(HIGH_BAD);
} else if (problemInfo.getLongUrls() < lastProblemInfo.getLongUrls()) {
problemInfo.setLongUrlsFlag(LOW_GOOD);
}
if (problemInfo.getAvgLongUrls() > lastProblemInfo.getAvgLongUrls()) {
problemInfo.setAvgLongUrlsFlag(HIGH_BAD);
} else if (problemInfo.getAvgLongUrls() < lastProblemInfo.getAvgLongUrls()) {
problemInfo.setAvgLongUrlsFlag(LOW_GOOD);
}
if (problemInfo.getLongUrlPercent() > lastProblemInfo.getLongUrlPercent()) {
problemInfo.setLongUrlPercentFlag(HIGH_BAD);
} else if (problemInfo.getLongUrlPercent() < lastProblemInfo.getLongUrlPercent()) {
problemInfo.setLongUrlPercentFlag(LOW_GOOD);
}
if (problemInfo.getLongCaches() > lastProblemInfo.getLongCaches()) {
problemInfo.setLongCachesFlag(HIGH_BAD);
} else if (problemInfo.getLongCaches() < lastProblemInfo.getLongCaches()) {
problemInfo.setLongCachesFlag(LOW_GOOD);
}
if (problemInfo.getAvgLongCaches() > lastProblemInfo.getAvgLongCaches()) {
problemInfo.setAvgLongCachesFlag(HIGH_BAD);
} else if (problemInfo.getAvgLongCaches() < lastProblemInfo.getAvgLongCaches()) {
problemInfo.setAvgLongCachesFlag(LOW_GOOD);
}
if (problemInfo.getLongCachePercent() > lastProblemInfo.getLongCachePercent()) {
problemInfo.setLongCachePercentFlag(HIGH_BAD);
} else if (problemInfo.getLongCachePercent() < lastProblemInfo.getLongCachePercent()) {
problemInfo.setLongCachePercentFlag(LOW_GOOD);
}
if (problemInfo.getLongServices() > lastProblemInfo.getLongServices()) {
problemInfo.setLongServicesFlag(HIGH_BAD);
} else if (problemInfo.getLongServices() < lastProblemInfo.getLongServices()) {
problemInfo.setLongServicesFlag(LOW_GOOD);
}
if (problemInfo.getAvgLongServices() > lastProblemInfo.getAvgLongServices()) {
problemInfo.setAvgLongServicesFlag(HIGH_BAD);
} else if (problemInfo.getAvgLongServices() < lastProblemInfo.getAvgLongServices()) {
problemInfo.setAvgLongServicesFlag(LOW_GOOD);
}
if (problemInfo.getLongServicePercent() > lastProblemInfo.getLongServicePercent()) {
problemInfo.setLongServicePercentFlag(HIGH_BAD);
} else if (problemInfo.getLongServicePercent() < lastProblemInfo.getLongServicePercent()) {
problemInfo.setLongServicePercentFlag(LOW_GOOD);
}
} catch (Exception e) {
Cat.logError(e);
}
}
@Override
public void visitService(Service service) {
m_currentType = "Service";
super.visitService(service);
}
@Override
public void visitSql(Sql sql) {
m_currentType = "Sql";
super.visitSql(sql);
}
@Override
public void visitUrl(Url url) {
m_currentType = "URL";
super.visitUrl(url);
}
@Override
public void visitWebCache(WebCache webCache) {
m_currentCache = "webCache";
super.visitWebCache(webCache);
}
}
......@@ -13,7 +13,7 @@ import com.dianping.cat.hadoop.dal.Task;
import com.dianping.cat.hadoop.dal.TaskDao;
import com.dianping.cat.hadoop.dal.TaskEntity;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.task.ReportFacade;
import com.dianping.cat.report.task.spi.ReportFacade;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
import com.site.web.mvc.PageHandler;
......
......@@ -198,6 +198,7 @@ public class DailyTaskProducer implements Runnable, Initializable {
m_dailyReportNameSet.add("matrix");
m_dailyReportNameSet.add("cross");
m_dailyReportNameSet.add("sql");
m_dailyReportNameSet.add("health");
}
@Override
......
......@@ -11,6 +11,7 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Task;
import com.dianping.cat.hadoop.dal.TaskDao;
import com.dianping.cat.hadoop.dal.TaskEntity;
import com.dianping.cat.report.task.spi.ReportFacade;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -9,8 +9,8 @@ import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.cross.CrossReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class CrossMerger implements ReportMerger<CrossReport> {
......
......@@ -10,9 +10,9 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -10,8 +10,8 @@ import com.dianping.cat.consumer.database.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.report.page.model.database.DatabaseReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class DatabaseMerger implements ReportMerger<DatabaseReport> {
......
......@@ -10,9 +10,9 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -17,8 +17,8 @@ import com.dianping.cat.consumer.event.model.entity.EventType;
import com.dianping.cat.consumer.event.model.entity.Range;
import com.dianping.cat.consumer.event.model.entity.Machine;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.report.task.GraphCreator;
import com.dianping.cat.report.task.GraphLine;
import com.dianping.cat.report.task.spi.GraphCreator;
import com.dianping.cat.report.task.spi.GraphLine;
public class EventGraphCreator implements GraphCreator<EventReport> {
......
......@@ -13,8 +13,8 @@ import com.dianping.cat.consumer.event.model.entity.Machine;
import com.dianping.cat.consumer.event.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.event.EventReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class EventMerger implements ReportMerger<EventReport> {
......
......@@ -13,9 +13,9 @@ import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
package com.dianping.cat.report.task.health;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.xml.sax.SAXException;
import com.dianping.cat.Cat;
import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.health.model.entity.HealthReport;
import com.dianping.cat.consumer.health.model.transform.DefaultXmlBuilder;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.page.model.event.EventReportMerger;
import com.dianping.cat.report.page.model.heartbeat.HeartbeatReportMerger;
import com.dianping.cat.report.page.model.problem.ProblemReportMerger;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.health.HealthServiceCollector.ServiceInfo;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
public class HealthReportBuilder extends AbstractReportBuilder implements ReportBuilder {
@Inject
private HealthServiceCollector m_serviceCollector;
@Override
public boolean buildDailyReport(String reportName, String reportDomain, Date reportPeriod) {
Date endDate = TaskHelper.tomorrowZero(reportPeriod);
Set<String> domainSet = new HashSet<String>();
getDomainSet(domainSet, reportPeriod, endDate);
HealthReportMerger merger = new HealthReportMerger(new HealthReport(reportDomain));
List<Report> reports = null;
try {
reports = m_reportDao.findAllByDomainNameDuration(reportPeriod, endDate, reportDomain, reportName,
ReportEntity.READSET_FULL);
} catch (DalException e1) {
Cat.logError(e1);
}
if (reports != null) {
for (Report report : reports) {
String xml = report.getContent();
try {
HealthReport model = com.dianping.cat.consumer.health.model.transform.DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (Exception e) {
Cat.logError(e);
}
}
}
String content = merger.getHealthReport().toString();
Dailyreport report = m_dailyReportDao.createLocal();
report.setContent(content);
report.setCreationDate(new Date());
report.setDomain(reportDomain);
report.setIp(NetworkInterfaceManager.INSTANCE.getLocalHostAddress());
report.setName(reportName);
report.setPeriod(reportPeriod);
report.setType(1);
return false;
}
private HealthReport buildHealthHourlyReport(String reportDomain, Date reportPeriod) throws DalException,
SAXException, IOException {
TransactionReport transactionReport = queryTransactionReport(reportDomain, reportPeriod);
EventReport eventReport = queryEventReport(reportDomain, reportPeriod);
ProblemReport problemReport = queryProblemReport(reportDomain, reportPeriod);
HeartbeatReport heartbeatReport = queryHeartbeatReport(reportDomain, reportPeriod);
m_serviceCollector.buildCrossInfo(reportPeriod.getTime());
Map<String,ServiceInfo> infos = m_serviceCollector.getServiceInfos();
HealthReportCreator healthReportCreator = new HealthReportCreator();
HealthReport report = healthReportCreator.build(transactionReport, eventReport, problemReport, heartbeatReport,infos);
return report;
}
@Override
public boolean buildHourReport(String reportName, String reportDomain, Date reportPeriod) {
String ip = NetworkInterfaceManager.INSTANCE.getLocalHostAddress();
try {
HealthReport report = buildHealthHourlyReport(reportDomain, reportPeriod);
DefaultXmlBuilder builder = new DefaultXmlBuilder(true);
Report r = m_reportDao.createLocal();
String xml = builder.buildXml(report);
String domain = report.getDomain();
r.setName("health");
r.setDomain(domain);
r.setPeriod(reportPeriod);
r.setIp(ip);
r.setType(1);
r.setContent(xml);
m_reportDao.insert(r);
} catch (Exception e) {
Cat.logError(e);
return false;
}
return true;
}
private EventReport queryEventReport(String domain, Date reportPeriod) throws DalException, SAXException,
IOException {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(reportPeriod, domain, 1, "event",
ReportEntity.READSET_FULL);
EventReportMerger merger = new EventReportMerger(new EventReport(domain));
merger.setAllIp(true);
for (Report report : reports) {
String xml = report.getContent();
EventReport model = com.dianping.cat.consumer.event.model.transform.DefaultSaxParser.parse(xml);
model.accept(merger);
}
EventReport eventReport = merger.getEventReport();
return eventReport;
}
private HeartbeatReport queryHeartbeatReport(String domain, Date reportPeriod) throws DalException, SAXException,
IOException {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(reportPeriod, domain, 1, "heartbeat",
ReportEntity.READSET_FULL);
HeartbeatReportMerger merger = new HeartbeatReportMerger(new HeartbeatReport(domain));
for (Report report : reports) {
String xml = report.getContent();
HeartbeatReport model = com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser.parse(xml);
model.accept(merger);
}
HeartbeatReport heartbeatReport = merger.getHeartbeatReport();
return heartbeatReport;
}
private ProblemReport queryProblemReport(String domain, Date reportPeriod) throws DalException, SAXException,
IOException {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(reportPeriod, domain, 1, "problem",
ReportEntity.READSET_FULL);
ProblemReportMerger merger = new ProblemReportMerger(new ProblemReport(domain));
for (Report report : reports) {
String xml = report.getContent();
ProblemReport model = com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser.parse(xml);
model.accept(merger);
}
ProblemReport problemReport = merger.getProblemReport();
return problemReport;
}
private TransactionReport queryTransactionReport(String domain, Date reportPeriod) throws DalException,
SAXException, IOException {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(reportPeriod, domain, 1, "transaction",
ReportEntity.READSET_FULL);
TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(domain));
merger.setAllIp(true);
for (Report report : reports) {
String xml = report.getContent();
TransactionReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
}
TransactionReport transactionReport = merger.getTransactionReport();
return transactionReport;
}
@Override
public boolean redoDailyReport(String reportName, String reportDomain, Date reportPeriod) {
return true;
}
@Override
public boolean redoHourReport(String reportName, String reportDomain, Date reportPeriod) {
return true;
}
}
package com.dianping.cat.report.task.health;
import com.dianping.cat.consumer.health.model.entity.BaseCacheInfo;
import com.dianping.cat.consumer.health.model.entity.BaseInfo;
import com.dianping.cat.consumer.health.model.entity.HealthReport;
import com.dianping.cat.consumer.health.model.transform.DefaultMerger;
public class HealthReportMerger extends DefaultMerger {
private double m_duration = 0;
public HealthReportMerger(HealthReport healthReport) {
super(healthReport);
}
@Override
protected void mergeBaseCacheInfo(BaseCacheInfo old, BaseCacheInfo baseCacheInfo) {
double totalTime = old.getTotal() * old.getResponseTime() + baseCacheInfo.getTotal()
* baseCacheInfo.getResponseTime();
long totalCount = old.getTotal() + baseCacheInfo.getTotal();
double hitNumber = old.getTotal() * old.getHitPercent() + baseCacheInfo.getTotal()
* baseCacheInfo.getHitPercent();
old.setTotal(totalCount);
if (totalCount > 0) {
old.setResponseTime(totalTime / totalCount);
old.setHitPercent(hitNumber / totalCount);
}
}
@Override
protected void mergeBaseInfo(BaseInfo old, BaseInfo baseInfo) {
long totalCount = old.getTotal() + baseInfo.getTotal();
double totalTime = old.getTotal() * old.getResponseTime() + baseInfo.getTotal() * baseInfo.getResponseTime();
long errorCount = old.getErrorTotal() + baseInfo.getErrorTotal();
old.setTotal(totalCount);
if (totalCount > 0) {
old.setResponseTime(totalTime / totalCount);
old.setErrorPercent((double) errorCount / totalCount);
old.setSuccessPercent(1 - old.getErrorPercent());
}
old.setErrorTotal(errorCount);
old.setTps(totalCount / m_duration);
}
public HealthReportMerger setDuration(long time) {
m_duration = time;
return this;
}
@Override
public void visitHealthReport(HealthReport healthReport) {
super.visitHealthReport(healthReport);
}
}
package com.dianping.cat.report.task.health;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.consumer.cross.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportDao;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.report.page.cross.DomainManager;
import com.dianping.cat.report.page.cross.display.ProjectInfo;
import com.dianping.cat.report.page.cross.display.TypeDetailInfo;
import com.dianping.cat.report.page.model.cross.CrossReportMerger;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
public class HealthServiceCollector {
private static final long ONE_HOUR = 60 * 60 * 1000L;
@Inject
private ReportDao m_reportDao;
@Inject
private DomainManager m_domainManager;
private long m_timestamp;
private Map<String, ServiceInfo> m_serviceInfos = new HashMap<String, ServiceInfo>();
private void addCallinfo(TypeDetailInfo info) {
String projectName = info.getProjectName();
if (projectName.equals("UnknownProject") || projectName.equals("AllServers")) {
return;
}
long totalCount = info.getTotalCount();
double avgTime = info.getAvg();
long failCount = info.getFailureCount();
ServiceInfo call = m_serviceInfos.get(projectName);
if (call == null) {
call = new ServiceInfo();
m_serviceInfos.put(projectName, call);
call.setTotalCount(totalCount);
call.setFailCount(failCount);
call.setAvgTime(avgTime);
} else {
double sum = totalCount * avgTime + call.getTotalCount() * call.getAvgTime();
long allTotalCount = call.getTotalCount() + totalCount;
call.setTotalCount(allTotalCount);
call.setFailCount(call.getFailCount() + failCount);
call.setAvgTime(sum / allTotalCount);
}
}
public synchronized void buildCrossInfo(long time) {
if (m_timestamp != time) {
m_serviceInfos.clear();
Set<String> domains = queryAllDomains(new Date(time));
for (String domain : domains) {
CrossReport report = queryCrossReport(new Date(time), domain);
ProjectInfo projectInfo = new ProjectInfo(ONE_HOUR);
projectInfo.setDomainManager(m_domainManager);
projectInfo.setClientIp(CatString.ALL_IP);
projectInfo.visitCrossReport(report);
Collection<TypeDetailInfo> calls = projectInfo.getCallProjectsInfo();
for (TypeDetailInfo info : calls) {
addCallinfo(info);
}
}
}
}
private Set<String> queryAllDomains(Date date) {
List<Report> historyReports = null;
try {
historyReports = m_reportDao.findAllByDomainNameDuration(date, new Date(date.getTime() + ONE_HOUR), null,
"cross", ReportEntity.READSET_DOMAIN_NAME);
} catch (DalException e) {
Cat.logError(e);
}
Set<String> domainNames = new HashSet<String>();
if (historyReports != null) {
for (Report report : historyReports) {
domainNames.add(report.getDomain());
}
}
return domainNames;
}
private CrossReport queryCrossReport(Date date, String domain) {
CrossReportMerger merger = new CrossReportMerger(new CrossReport(domain));
try {
List<Report> reports = m_reportDao.findAllByPeriodDomainTypeName(date, domain, 1, "cross",
ReportEntity.READSET_FULL);
for (Report report : reports) {
String xml = report.getContent();
CrossReport model = DefaultSaxParser.parse(xml);
model.accept(merger);
}
} catch (Exception e) {
Cat.logError(e);
}
CrossReport crossReport = merger.getCrossReport();
return crossReport;
}
public Map<String, ServiceInfo> getServiceInfos() {
return m_serviceInfos;
}
public static class ServiceInfo {
private long m_totalCount;
private long m_failCount;
private double m_avgTime;
public double getAvgTime() {
return m_avgTime;
}
public long getFailCount() {
return m_failCount;
}
public long getTotalCount() {
return m_totalCount;
}
public void setAvgTime(double avgTime) {
m_avgTime = avgTime;
}
public void setFailCount(long failCount) {
m_failCount = failCount;
}
public void setTotalCount(long totalCount) {
m_totalCount = totalCount;
}
}
}
......@@ -15,9 +15,9 @@ import com.dianping.cat.consumer.heartbeat.model.entity.Disk;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.entity.Period;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.report.task.GraphCreator;
import com.dianping.cat.report.task.GraphLine;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.GraphCreator;
import com.dianping.cat.report.task.spi.GraphLine;
public class HeartbeatGraphCreator implements GraphCreator<HeartbeatReport> {
......
......@@ -11,7 +11,7 @@ import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.heartbeat.HeartbeatReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.spi.ReportMerger;
public class HeartbeatMerger implements ReportMerger<HeartbeatReport> {
......
......@@ -9,8 +9,8 @@ import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -9,8 +9,8 @@ import com.dianping.cat.consumer.matrix.model.entity.MatrixReport;
import com.dianping.cat.consumer.matrix.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.matrix.MatrixReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class MatrixMerger implements ReportMerger<MatrixReport> {
......
......@@ -10,9 +10,9 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
package com.dianping.cat.report.task.monthreport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.xml.sax.SAXException;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.monthreport.model.entity.MonthReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.DailyreportDao;
import com.dianping.cat.hadoop.dal.DailyreportEntity;
import com.dianping.cat.hadoop.dal.Monthreport;
import com.dianping.cat.hadoop.dal.MonthreportDao;
import com.dianping.cat.hadoop.dal.MonthreportEntity;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.report.page.model.event.EventReportMerger;
import com.dianping.cat.report.page.model.problem.ProblemReportMerger;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
public class MonthReportBuilderTask implements Runnable {
private static final long DAY = 24 * 60 * 60 * 1000L;
@Inject
private DailyreportDao m_dailyreportDao;
@Inject
private MonthreportDao m_monthreportDao;
public MonthReport buildMonthReport(String domain, Date start, Date end) throws DalException, SAXException,
IOException {
TransactionReport transactionReport = getTransactionReport(start, end, domain);
EventReport eventReport = getEventReport(start, end, domain);
ProblemReport problemReport = getProblemReport(start, end, domain);
MonthReportBuilder builder = new MonthReportBuilder();
return builder.build(transactionReport, eventReport, problemReport);
}
private Set<String> getAllDomains(final Date start, final Date end) throws DalException {
Set<String> domains = new HashSet<String>();
List<Dailyreport> historyReports = m_dailyreportDao.findAllByPeriod(start, end,
DailyreportEntity.READSET_DOMAIN_NAME);
for (Dailyreport report : historyReports) {
domains.add(report.getDomain());
}
return domains;
}
private EventReport getEventReport(final Date start, final Date end, String domain) throws DalException,
SAXException, IOException {
long startLong = Long.MAX_VALUE;
long endLong = 0;
long startTime = start.getTime();
int days = (int) ((end.getTime() - startTime) / DAY);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
EventReportMerger merger = new EventReportMerger(new EventReport(domain));
for (int i = 0; i < days; i++) {
Dailyreport report = null;
try {
report = m_dailyreportDao.findByNameDomainPeriod(new Date(startTime + i * DAY), domain, "event",
DailyreportEntity.READSET_FULL);
} catch (DalException e) {
}
if (report != null) {
String xml = report.getContent();
EventReport reportModel = com.dianping.cat.consumer.event.model.transform.DefaultSaxParser.parse(xml);
startLong = Math.min(startLong, reportModel.getStartTime().getTime());
endLong = Math.max(startLong, reportModel.getEndTime().getTime());
reportModel.accept(merger);
} else {
Cat.getProducer().logEvent("MonthReport", "event", "NotFound",
domain + sdf.format(new Date(startTime + i * DAY)));
}
}
EventReport eventReport = merger.getEventReport();
eventReport.setStartTime(new Date(startLong));
eventReport.setEndTime(new Date(endLong));
return eventReport;
}
public Date getMonthFirstDay(int step) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MONTH, step);
return cal.getTime();
}
private List<String> getMonthReportCreatedDomin(Date date) {
List<String> domains = new ArrayList<String>();
try {
List<Monthreport> monthreports = m_monthreportDao.findByPeriod(date, MonthreportEntity.READSET_DOMAIN_PERIOD);
for (Monthreport report : monthreports) {
domains.add(report.getDomain());
}
} catch (DalException e) {
e.printStackTrace();
}
return domains;
}
private ProblemReport getProblemReport(final Date start, final Date end, String domain) throws DalException,
SAXException, IOException {
long startLong = Long.MAX_VALUE;
long endLong = 0;
long startTime = start.getTime();
int days = (int) ((end.getTime() - startTime) / DAY);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
ProblemReportMerger merger = new ProblemReportMerger(new ProblemReport(domain));
for (int i = 0; i < days; i++) {
Dailyreport report = null;
try {
report = m_dailyreportDao.findByNameDomainPeriod(new Date(startTime + i * DAY), domain, "problem",
DailyreportEntity.READSET_FULL);
} catch (DalException e) {
}
if (report != null) {
String xml = report.getContent();
ProblemReport reportModel = com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser.parse(xml);
startLong = Math.min(startLong, reportModel.getStartTime().getTime());
endLong = Math.max(startLong, reportModel.getEndTime().getTime());
reportModel.accept(merger);
} else {
Cat.getProducer().logEvent("MonthReport", "transaction", "NotFound",
domain + sdf.format(new Date(startTime + i * DAY)));
}
}
ProblemReport problemReport = merger.getProblemReport();
problemReport.setStartTime(new Date(startLong));
problemReport.setEndTime(new Date(endLong));
return problemReport;
}
private long getSleepTime() {
long currentTime = System.currentTimeMillis();
long nextDay = TaskHelper.tomorrowZero(new Date()).getTime() + 1000 * 60 * 10;
return nextDay - currentTime;
}
private TransactionReport getTransactionReport(final Date start, final Date end, String domain) throws DalException,
SAXException, IOException {
long startLong = Long.MAX_VALUE;
long endLong = 0;
long startTime = start.getTime();
int days = (int) ((end.getTime() - startTime) / DAY);
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(domain));
for (int i = 0; i < days; i++) {
Dailyreport report = null;
try {
report = m_dailyreportDao.findByNameDomainPeriod(new Date(startTime + i * DAY), domain, "transaction",
DailyreportEntity.READSET_FULL);
} catch (DalException e) {
}
if (report != null) {
String xml = report.getContent();
TransactionReport reportModel = DefaultSaxParser.parse(xml);
startLong = Math.min(startLong, reportModel.getStartTime().getTime());
endLong = Math.max(startLong, reportModel.getEndTime().getTime());
reportModel.accept(merger);
} else {
Cat.getProducer().logEvent("MonthReport", "transaction", "NotFound",
domain + sdf.format(new Date(startTime + i * DAY)));
}
}
TransactionReport transactionReport = merger.getTransactionReport();
transactionReport.setStartTime(new Date(startLong));
transactionReport.setEndTime(new Date(endLong));
return transactionReport;
}
public void run() {
while (true) {
try {
Date lastMonth = getMonthFirstDay(-1);
Date currentMonth = getMonthFirstDay(0);
Set<String> allDomains = getAllDomains(lastMonth, currentMonth);
List<String> createdDomains = getMonthReportCreatedDomin(lastMonth);
for (String temp : createdDomains) {
allDomains.remove(temp);
}
for (String domain : allDomains) {
Transaction t = Cat.newTransaction("MonthReport", domain);
try {
MonthReport report = buildMonthReport(domain, lastMonth, currentMonth);
Monthreport entity = m_monthreportDao.createLocal();
entity.setContent(report.toString());
entity.setDomain(domain);
entity.setName("monthreport");
entity.setPeriod(lastMonth);
m_monthreportDao.insert(entity);
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
} finally {
t.complete();
}
}
} catch (Exception e) {
Cat.logError(e);
}
try {
long sleepTime = getSleepTime();
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// Ignore
}
}
}
}
......@@ -15,9 +15,9 @@ import com.dianping.cat.consumer.problem.model.entity.JavaThread;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.entity.Segment;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.report.task.GraphCreator;
import com.dianping.cat.report.task.GraphLine;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.GraphCreator;
import com.dianping.cat.report.task.spi.GraphLine;
public class ProblemGraphCreator implements GraphCreator<ProblemReport> {
......
......@@ -12,8 +12,8 @@ import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.problem.ProblemReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class ProblemMerger implements ReportMerger<ProblemReport> {
......
......@@ -13,9 +13,9 @@ import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
package com.dianping.cat.report.task;
package com.dianping.cat.report.task.spi;
import java.util.ArrayList;
import java.util.Date;
......@@ -28,12 +28,12 @@ public abstract class AbstractReportBuilder {
protected ReportDao m_reportDao;
protected void clearDailyReport(Dailyreport report) throws DalException {
this.m_dailyReportDao.deleteByDomainNamePeriod(report);
m_dailyReportDao.deleteByDomainNamePeriod(report);
}
protected void clearHourlyGraphs(List<Graph> graphs) throws DalException {
for (Graph graph : graphs) {
this.m_graphDao.deleteByDomainNamePeriodIp(graph);
m_graphDao.deleteByDomainNamePeriodIp(graph);
}
}
......
/**
*
*/
package com.dianping.cat.report.task;
package com.dianping.cat.report.task.spi;
import java.util.Date;
import java.util.List;
......
package com.dianping.cat.report.task;
package com.dianping.cat.report.task.spi;
public final class GraphLine {
public long failCount;
......
package com.dianping.cat.report.task;
package com.dianping.cat.report.task.spi;
import java.util.Date;
import java.util.HashMap;
......@@ -16,6 +16,7 @@ import com.dianping.cat.hadoop.dal.TaskEntity;
import com.dianping.cat.report.task.cross.CrossReportBuilder;
import com.dianping.cat.report.task.database.DatabaseReportBuilder;
import com.dianping.cat.report.task.event.EventReportBuilder;
import com.dianping.cat.report.task.health.HealthReportBuilder;
import com.dianping.cat.report.task.heartbeat.HeartbeatReportBuilder;
import com.dianping.cat.report.task.matrix.MatrixReportBuilder;
import com.dianping.cat.report.task.problem.ProblemReportBuilder;
......@@ -53,6 +54,9 @@ public class ReportFacade implements LogEnabled, Initializable {
@Inject
private SqlReportBuilder m_sqlReportBuilder;
@Inject
private HealthReportBuilder m_healthReportBuilder;
@Inject
private TaskDao m_taskDao;
......@@ -103,6 +107,7 @@ public class ReportFacade implements LogEnabled, Initializable {
m_reportBuilders.put("cross", m_crossReportBuilder);
m_reportBuilders.put("database", m_databaseReportBuilder);
m_reportBuilders.put("sql", m_sqlReportBuilder);
m_reportBuilders.put("health", m_healthReportBuilder);
}
public boolean redoTask(int taskID) {
......
/**
*
*/
package com.dianping.cat.report.task;
package com.dianping.cat.report.task.spi;
import java.util.List;
import java.util.Set;
......
......@@ -10,8 +10,8 @@ import com.dianping.cat.consumer.sql.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.report.page.model.sql.SqlReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class SqlMerger implements ReportMerger<SqlReport> {
......
......@@ -10,9 +10,9 @@ import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -17,8 +17,8 @@ import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.report.task.GraphCreator;
import com.dianping.cat.report.task.GraphLine;
import com.dianping.cat.report.task.spi.GraphCreator;
import com.dianping.cat.report.task.spi.GraphLine;
public class TransactionGraphCreator implements GraphCreator<TransactionReport> {
......
......@@ -13,8 +13,8 @@ import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.message.Event;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
import com.dianping.cat.report.task.ReportMerger;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.ReportMerger;
public class TransactionMerger implements ReportMerger<TransactionReport> {
......
......@@ -13,9 +13,9 @@ import com.dianping.cat.hadoop.dal.Dailyreport;
import com.dianping.cat.hadoop.dal.Graph;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.hadoop.dal.ReportEntity;
import com.dianping.cat.report.task.AbstractReportBuilder;
import com.dianping.cat.report.task.ReportBuilder;
import com.dianping.cat.report.task.TaskHelper;
import com.dianping.cat.report.task.spi.AbstractReportBuilder;
import com.dianping.cat.report.task.spi.ReportBuilder;
import com.site.dal.jdbc.DalException;
import com.site.lookup.annotation.Inject;
......
......@@ -33,9 +33,9 @@ public class NavigationBar {
ReportPage.LOGVIEW,
ReportPage.MONTHREPORT,
ReportPage.DATABASE,
ReportPage.DATABASE
ReportPage.HEALTH
};
}
......
......@@ -26,18 +26,6 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.monthreport.MonthReportBuilderTask</role>
<implementation>com.dianping.cat.report.task.monthreport.MonthReportBuilderTask</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.MonthreportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.TaskConsumer</role>
<implementation>com.dianping.cat.report.task.DefaultTaskConsumer</implementation>
......@@ -46,7 +34,7 @@
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.ReportFacade</role>
<role>com.dianping.cat.report.task.spi.ReportFacade</role>
</requirement>
</requirements>
</component>
......@@ -266,8 +254,26 @@
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.ReportFacade</role>
<implementation>com.dianping.cat.report.task.ReportFacade</implementation>
<role>com.dianping.cat.report.task.health.HealthReportBuilder</role>
<implementation>com.dianping.cat.report.task.health.HealthReportBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.GraphDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.health.HealthServiceCollector</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.spi.ReportFacade</role>
<implementation>com.dianping.cat.report.task.spi.ReportFacade</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.task.transaction.TransactionReportBuilder</role>
......@@ -293,6 +299,9 @@
<requirement>
<role>com.dianping.cat.report.task.sql.SqlReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.health.HealthReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
</requirement>
......@@ -310,6 +319,18 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.health.HealthServiceCollector</role>
<implementation>com.dianping.cat.report.task.health.HealthServiceCollector</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.cross.DomainManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-local</role-hint>
......@@ -1536,7 +1557,7 @@
<role>com.dianping.cat.report.page.task.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.ReportFacade</role>
<role>com.dianping.cat.report.task.spi.ReportFacade</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
......@@ -1548,8 +1569,8 @@
<implementation>com.dianping.cat.report.page.task.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.ReportFacade</role>
<implementation>com.dianping.cat.report.task.ReportFacade</implementation>
<role>com.dianping.cat.report.task.spi.ReportFacade</role>
<implementation>com.dianping.cat.report.task.spi.ReportFacade</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.task.event.EventReportBuilder</role>
......@@ -1575,6 +1596,9 @@
<requirement>
<role>com.dianping.cat.report.task.sql.SqlReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.health.HealthReportBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
</requirement>
......@@ -1768,6 +1792,57 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.health.HealthReportBuilder</role>
<implementation>com.dianping.cat.report.task.health.HealthReportBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.task.health.HealthServiceCollector</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.GraphDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.task.health.HealthServiceCollector</role>
<implementation>com.dianping.cat.report.task.health.HealthServiceCollector</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.cross.DomainManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.cross.DomainManager</role>
<implementation>com.dianping.cat.report.page.cross.DomainManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.HostinfoDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.hadoop.dal.HostinfoDao</role>
<implementation>com.dianping.cat.hadoop.dal.HostinfoDao</implementation>
<requirements>
<requirement>
<role>com.site.dal.jdbc.QueryEngine</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.hadoop.dal.TaskDao</role>
<implementation>com.dianping.cat.hadoop.dal.TaskDao</implementation>
......@@ -1808,33 +1883,27 @@
<implementation>com.dianping.cat.report.page.matrix.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.monthreport.Handler</role>
<implementation>com.dianping.cat.report.page.monthreport.Handler</implementation>
<role>com.dianping.cat.report.page.health.Handler</role>
<implementation>com.dianping.cat.report.page.health.Handler</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.monthreport.JspViewer</role>
<role>com.dianping.cat.report.page.health.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.hadoop.dal.MonthreportDao</role>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
<role>com.dianping.cat.hadoop.dal.ReportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.monthreport.JspViewer</role>
<implementation>com.dianping.cat.report.page.monthreport.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.hadoop.dal.MonthreportDao</role>
<implementation>com.dianping.cat.hadoop.dal.MonthreportDao</implementation>
<requirements>
<requirement>
<role>com.site.dal.jdbc.QueryEngine</role>
<role>com.dianping.cat.hadoop.dal.DailyreportDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.health.JspViewer</role>
<implementation>com.dianping.cat.report.page.health.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.cross.Handler</role>
<implementation>com.dianping.cat.report.page.cross.Handler</implementation>
......@@ -1868,27 +1937,6 @@
<role>com.dianping.cat.report.page.cross.JspViewer</role>
<implementation>com.dianping.cat.report.page.cross.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.cross.DomainManager</role>
<implementation>com.dianping.cat.report.page.cross.DomainManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.hadoop.dal.HostinfoDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.hadoop.dal.HostinfoDao</role>
<implementation>com.dianping.cat.hadoop.dal.HostinfoDao</implementation>
<requirements>
<requirement>
<role>com.site.dal.jdbc.QueryEngine</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.cache.Handler</role>
<implementation>com.dianping.cat.report.page.cache.Handler</implementation>
......
<?xml version="1.0" encoding="UTF-8"?>
<wizard package="com.dianping.cat">
<webapp package="com.dianping.cat" webres="true">
<module name="report" path="r">
<page name="home" title="Home" default="true">
<description>Home Page</description>
</page>
<page name="problem" title="Problem" path="p" view="/jsp/report/problemGroup.jsp">
<description>Problem Discovered</description>
</page>
<page name="transaction" title="Transaction" path="t">
<description>Transaction Summary Report</description>
</page>
<page name="event" title="Event" path="e">
<description>Event Summary Report</description>
</page>
<page name="heartbeat" title="Heartbeat" path="h">
<description>Heartbeat Summary Report</description>
</page>
<page name="logview" title="Logview" path="m" standalone="false">
<description>Log View Details</description>
</page>
<page name="ip" title="Top IP" standalone="false">
<description>Top Visited IP</description>
</page>
<page name="model" title="Model" path="model" standalone="false">
<description>Service Model</description>
</page>
<page name="sql" title="SQL" path="sql">
<description>SQL Report</description>
</page>
<page name="heatmap" title="Heatmap" path="heatmap" standalone="false">
<description>Heatmap</description>
</page>
<page name="dashboard" title="Dashboard" path="dashboard" standalone="false">
<description>Dashboard</description>
</page>
<page name="task" title="Task" path="task" standalone="false">
<description>Task</description>
</page>
<page name="matrix" title="Matrix" path="matrix">
<description>Matrix</description>
</page>
<page name="monthreport" title="Monthreport" path="monthreport" standalone="false">
<description>Monthreport</description>
</page>
<page name="cross" title="Cross" path="cross">
<description>Cross</description>
</page>
<page name="cache" title="Cache" path="cache">
<description>Cache</description>
</page>
<page name="database" title="Database" path="database">
<description>Database</description>
</page>
</module>
</webapp>
<webapp package="com.dianping.cat" webres="true">
<module name="report" path="r">
<page name="home" title="Home" default="true">
<description>Home Page</description>
</page>
<page name="problem" title="Problem" path="p" view="/jsp/report/problemGroup.jsp">
<description>Problem Discovered</description>
</page>
<page name="transaction" title="Transaction" path="t">
<description>Transaction Summary Report</description>
</page>
<page name="event" title="Event" path="e">
<description>Event Summary Report</description>
</page>
<page name="heartbeat" title="Heartbeat" path="h">
<description>Heartbeat Summary Report</description>
</page>
<page name="logview" title="Logview" path="m" standalone="false">
<description>Log View Details</description>
</page>
<page name="ip" title="Top IP" standalone="false">
<description>Top Visited IP</description>
</page>
<page name="model" title="Model" path="model" standalone="false">
<description>Service Model</description>
</page>
<page name="sql" title="SQL" path="sql">
<description>SQL Report</description>
</page>
<page name="heatmap" title="Heatmap" path="heatmap" standalone="false">
<description>Heatmap</description>
</page>
<page name="dashboard" title="Dashboard" path="dashboard" standalone="false">
<description>Dashboard</description>
</page>
<page name="task" title="Task" path="task" standalone="false">
<description>Task</description>
</page>
<page name="matrix" title="Matrix" path="matrix">
<description>Matrix</description>
</page>
<page name="health" title="Health" path="health">
<description>Health</description>
</page>
<page name="cross" title="Cross" path="cross">
<description>Cross</description>
</page>
<page name="cache" title="Cache" path="cache">
<description>Cache</description>
</page>
<page name="database" title="Database" path="database">
<description>Database</description>
</page>
</module>
</webapp>
</wizard>
.health {
width: auto;
font-size: small;
}
.health .odd td {
background-color: #eee;
font-size: small;
text-align:right;
}
.health .even td {
background-color: white;
font-size: small;
text-align:right;
}
.health th .left{
text-align:left;
}
.health tr .left{
text-align:left;
}
.health tr .left{
text-align:left;
}
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.health.Context"
scope="request" />
<jsp:useBean id="payload"
type="com.dianping.cat.report.page.health.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.health.Model"
scope="request" />
<a:report title="Health Report" navUrlPrefix="domain=${model.domain}">
<jsp:attribute name="subtitle">From ${w:format(model.report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.report.endTime,'yyyy-MM-dd HH:mm:ss')}</jsp:attribute>
<jsp:body>
<res:useCss value="${res.css.local.health_css}" target="head-css" />
<br>
<h2>综合指标:99</h2>
<div style="float: left;width:100%">
<div style="width: 33%; float: left">
<table class="health">
<tr class="odd">
<th>URL请求平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.url.baseInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>URL请求总访问量</th>
<td>${w:formatNumber(model.report.url.baseInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>URL请求出错次数</th>
<td>${w:formatNumber(model.report.url.baseInfo.errorTotal,'0.0','')}</td>
</tr>
<tr class="even">
<th>URL请求成功百分比</th>
<td>${w:format(model.report.url.baseInfo.successPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>(从服务端看)Service请求平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.service.baseInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>(从服务端看)Service请求总访问量</th>
<td>${w:formatNumber(model.report.service.baseInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>(从服务端看)Service请求出错次数</th>
<td>${w:formatNumber(model.report.service.baseInfo.errorTotal,'0.0','')}</td>
</tr>
<tr class="even">
<th>(从服务端看)Service请求成功百分比</th>
<td>${w:format(model.report.service.baseInfo.successPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>(从客户端看)Service请求平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.clientService.baseInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>(从客户端看)Service请求总访问量</th>
<td>${w:formatNumber(model.report.clientService.baseInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>(从客户端看)Service请求出错次数</th>
<td>${w:formatNumber(model.report.clientService.baseInfo.errorTotal,'0.0','')}</td>
</tr>
<tr class="even">
<th>(从客户端看)Service请求成功百分比</th>
<td>${w:format(model.report.clientService.baseInfo.successPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>远程调用平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.call.baseInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>远程调用总访问量</th>
<td>${w:formatNumber(model.report.call.baseInfo.total,'0.0','')}</td>
</tr>
<tr class="even">
<th>远程调用出错次数</th>
<td>${w:formatNumber(model.report.call.baseInfo.errorTotal,'0.0','')}</td>
</tr>
<tr class="even">
<th>远程调用成功百分比</th>
<td>${w:format(model.report.call.baseInfo.successPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>数据库平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.sql.baseInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>数据库总访问量</th>
<td>${w:formatNumber(model.report.sql.baseInfo.total,'0.0','')}</td>
</tr>
<tr class="even">
<th>数据库出错次数</th>
<td>${w:formatNumber(model.report.sql.baseInfo.errorTotal,'0.0','')}</td>
</tr>
<tr class="even">
<th>数据库成功百分比</th>
<td>${w:format(model.report.sql.baseInfo.successPercent,'00.0000%')}</td>
</tr>
</table>
</div>
<div style="width: 33%; float:left">
<table>
<tr class="odd">
<th>memcached缓存平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.memCache.baseCacheInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>memcached缓存月总访问量</th>
<td>${w:formatNumber(model.report.memCache.baseCacheInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>memcached缓存命中率</th>
<td>${w:format(model.report.memCache.baseCacheInfo.hitPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>kvdbCache缓存平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.kvdbCache.baseCacheInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>kvdbCache缓存月总访问量</th>
<td>${w:formatNumber(model.report.kvdbCache.baseCacheInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>kvdbCache缓存命中率</th>
<td>${w:format(model.report.kvdbCache.baseCacheInfo.hitPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>webCache缓存平均响应时间(ms)</th>
<td>${w:formatNumber(model.report.webCache.baseCacheInfo.responseTime,'0.0','ms')}</td>
</tr>
<tr class="even">
<th>webCache缓存月总访问量</th>
<td>${w:formatNumber(model.report.webCache.baseCacheInfo.total,'0.0','')}</td>
</tr>
<tr class="odd">
<th>webCache缓存命中率</th>
<td>${w:format(model.report.webCache.baseCacheInfo.hitPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>Exception月异常数</th>
<td>${w:formatNumber(model.report.problemInfo.exceptions,'0.0','')}</td>
</tr>
<tr class="even">
<th>Long-url月总次数(大于1000ms)</th>
<td>${w:formatNumber(model.report.problemInfo.longUrls,'0.0','')}</td>
</tr>
<tr class="odd">
<th>Long-url百分比</th>
<td>${w:format(model.report.problemInfo.longUrlPercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>Long-service月总次数(大于1000ms)</th>
<td>${w:formatNumber(model.report.problemInfo.longServices,'0.0','')}</td>
</tr>
<tr class="even">
<th>Long-service百分比</th>
<td>${w:format(model.report.problemInfo.longServicePercent,'00.0000%')}</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="odd">
<th>Long-sql月总次数(大于100ms)</th>
<td>${w:formatNumber(model.report.problemInfo.longSqls,'0.0','')}</td>
</tr>
<tr class="even">
<th>Long-sql百分比</th>
<td>${w:format(model.report.problemInfo.longSqlPercent,'00.0000%')}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>Long-cache月总次数(大于10ms)</th>
<td>${w:formatNumber(model.report.problemInfo.longCaches,'0.0','')}</td>
</tr>
<tr class="even">
<th>Long-cache百分比</th>
<td>${w:format(model.report.problemInfo.longCachePercent,'00.0000%')}</td>
</tr>
</table>
</div>
<div style="width: 33%; float:left">
<table>
<tr class="odd">
<th>部署机器数量</th>
<td>${model.report.machineInfo.numbers}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>所有机器平均负载</th>
<td>${w:formatNumber(model.report.machineInfo.avgLoad,'0.0','')}</td>
</tr>
<tr class="even">
<th>所有机器最大负载</th>
<td>${w:formatNumber(model.report.machineInfo.avgMaxLoad,'0.0','')}</td>
</tr>
<tr class="even">
<th>最大负载机器IP</th>
<td>${model.report.machineInfo.avgMaxLoadMachine}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>所有机器平均每分钟OldGc</th>
<td>${w:formatNumber(model.report.machineInfo.avgOldgc,'0.0','')}</td>
</tr>
<tr class="even">
<th>所有机器平均最大每分钟OldGc</th>
<td>${w:formatNumber(model.report.machineInfo.avgMaxOldgc,'0.0','')}</td>
</tr>
<tr class="even">
<th>最大OldGc机器IP</th>
<td>${model.report.machineInfo.avgMaxOldgcMachine}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>所有机器平均HTTP线程</th>
<td>${w:formatNumber(model.report.machineInfo.avgHttp,'0.0','')}</td>
</tr>
<tr class="even">
<th>所有机器平均最大HTTP线程</th>
<td>${w:formatNumber(model.report.machineInfo.avgMaxHttp,'0.0','')}</td>
</tr>
<tr class="even">
<th>最大HTTP机器IP</th>
<td>${model.report.machineInfo.avgMaxHttpMachine}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>所有机器平均Pigeon线程</th>
<td>${w:formatNumber(model.report.machineInfo.avgPigeon,'0.0','')}</td>
</tr>
<tr class="even">
<th>所有机器平均最大Pigeon线程</th>
<td>${w:formatNumber(model.report.machineInfo.avgMaxPigeon,'0.0','')}</td>
</tr>
<tr class="even">
<th>最大Pigeon机器IP</th>
<td>${model.report.machineInfo.avgMaxPigeonMachine}</td>
</tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr class="odd">
<th>所有机器平均内存使用(MB)</th>
<td>${w:formatNumber(model.report.machineInfo.avgMemoryUsed,'0.0','')}</td>
</tr>
<tr class="even">
<th>所有机器平均最大内存使用(MB)</th>
<td>${w:formatNumber(model.report.machineInfo.avgMaxMemoryUsed,'0.0','')}</td>
</tr><tr class="even">
<th>最大内存使用机器IP</th>
<td>${model.report.machineInfo.avgMaxMemoryUsedMachine}</td>
</tr>
</table>
</div>
</div>
</jsp:body>
</a:report>
package com.dianping.cat.report.task.monthreport;
import java.util.Date;
package com.dianping.cat.report.task.healthreport;
import junit.framework.Assert;
......@@ -9,35 +7,24 @@ import org.unidal.webres.helper.Files;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.transform.DefaultDomParser;
import com.dianping.cat.consumer.monthreport.model.entity.MonthReport;
import com.dianping.cat.consumer.health.model.entity.HealthReport;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.report.task.health.HealthReportCreator;
public class MonthReportBuilderTest {
@Test
public void testCreatLastMonthFirstDay() {
MonthReportBuilderTask task = new MonthReportBuilderTask();
Date date = task.getMonthFirstDay(0);
System.out.println(date);
date = task.getMonthFirstDay(-1);
System.out.println(date);
date = task.getMonthFirstDay(-2);
System.out.println(date);
}
public class HealthReportBuilderTest {
@Test
public void testBuildMonthReport() throws Exception {
MonthReportBuilder builder= new MonthReportBuilder();
public void testBuildHealthReport() throws Exception {
HealthReportCreator builder = new HealthReportCreator();
TransactionReport transactionReport = getTranscationReportFromFile("TransactionReport.xml");
EventReport eventReport =getEventReportFromFile("EventReport.xml");
ProblemReport problemReport =getProblemReportFromFile("ProblemReport.xml");
MonthReport real = builder.build(transactionReport, eventReport, problemReport);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("MonthReport.xml"), "utf-8");
Assert.assertEquals(expected.replaceAll("\\s*", ""),real.toString().replaceAll("\\s*", ""));
EventReport eventReport = getEventReportFromFile("EventReport.xml");
ProblemReport problemReport = getProblemReportFromFile("ProblemReport.xml");
HealthReport real = builder.build(transactionReport, eventReport, problemReport, null,null);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("HealthReport.xml"), "utf-8");
Assert.assertEquals(expected.replaceAll("\\s*", ""), real.toString().replaceAll("\\s*", ""));
}
private TransactionReport getTranscationReportFromFile(String fileName) throws Exception {
......@@ -51,7 +38,7 @@ public class MonthReportBuilderTest {
return new DefaultDomParser().parse(xml);
}
private ProblemReport getProblemReportFromFile(String fileName) throws Exception {
String xml = Files.forIO().readFrom(getClass().getResourceAsStream(fileName), "utf-8");
return new com.dianping.cat.consumer.problem.model.transform.DefaultDomParser().parse(xml);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册