提交 aa739072 编写于 作者: F Frankie Wu

some refinement and bug fixes

- show last report from local report
- refine the precise of transaction/event report
- local-base-dir in server configuration
上级 003ac557
......@@ -127,7 +127,7 @@ public class RealtimeConsumer extends ContainerHolder implements MessageConsumer
long lastStartTime = m_periodManager.getCurrentStartTime() - m_duration;
Period period = m_periodManager.findPeriod(lastStartTime);
return period.getAnalyzer(name);
return period == null ? null : period.getAnalyzer(name);
}
@Override
......
......@@ -169,7 +169,7 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
}
// update statistics
long duration = t.getDurationInMillis();
double duration = t.getDurationInMicros() / 1000d;
name.setMax(Math.max(name.getMax(), duration));
name.setMin(Math.min(name.getMin(), duration));
......@@ -196,7 +196,7 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
}
private void processTransactionGrpah(TransactionName name, Transaction t) {
long d = t.getDurationInMillis();
double d = t.getDurationInMicros() / 1000d;
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(t.getTimestamp());
int min = cal.get(Calendar.MINUTE);
......
......@@ -3,6 +3,7 @@ package com.dianping.cat.build;
import java.util.ArrayList;
import java.util.List;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageTree;
......@@ -25,15 +26,15 @@ class StorageComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(Bucket.class, MessageTree.class.getName() + "-logview", LocalLogviewBucket.class) //
.is(PER_LOOKUP) //
.req(MessagePathBuilder.class) //
.req(ServerConfigManager.class, MessagePathBuilder.class) //
.req(MessageCodec.class, "plain-text"));
all.add(C(Bucket.class, MessageTree.class.getName() + "-message", LocalMessageBucket.class) //
.is(PER_LOOKUP) //
.req(MessagePathBuilder.class) //
.req(ServerConfigManager.class, MessagePathBuilder.class) //
.req(MessageCodec.class, "plain-text"));
all.add(C(Bucket.class, String.class.getName() + "-report", LocalReportBucket.class) //
.is(PER_LOOKUP) //
.req(MessagePathBuilder.class));
.req(ServerConfigManager.class, MessagePathBuilder.class));
return all;
}
......
......@@ -30,6 +30,8 @@ public class StatusUpdateTask implements Runnable, Initializable {
@Override
public void run() {
Cat.setup("StatusUpdateTask");
while (m_active) {
long start = MilliSecondTimer.currentTimeMillis();
MessageProducer cat = Cat.getProducer();
......@@ -51,6 +53,8 @@ public class StatusUpdateTask implements Runnable, Initializable {
}
}
}
Cat.reset();
}
public void setInterval(long interval) {
......
......@@ -22,6 +22,8 @@ import org.codehaus.plexus.logging.Logger;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.configuration.server.entity.ServerConfig;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageTree;
......@@ -38,6 +40,8 @@ public class LocalLogviewBucket implements Bucket<MessageTree>, LogEnabled {
private MessagePathBuilder m_pathBuilder;
@Inject
private ServerConfigManager m_configManager;
private String m_baseDir = "target/bucket";
// key => offset of record
......@@ -178,6 +182,12 @@ public class LocalLogviewBucket implements Bucket<MessageTree>, LogEnabled {
@Override
public void initialize(Class<?> type, String domain, Date timestamp) throws IOException {
ServerConfig serverConfig = m_configManager.getServerConfig();
if (serverConfig != null) {
m_baseDir = serverConfig.getStorage().getLocalBaseDir();
}
m_writeLock = new ReentrantLock();
m_readLock = new ReentrantLock();
......@@ -232,9 +242,6 @@ public class LocalLogviewBucket implements Bucket<MessageTree>, LogEnabled {
}
}
public void setBaseDir(String baseDir) {
m_baseDir = baseDir;
}
@Override
public boolean storeById(String id, MessageTree tree) throws IOException {
......
......@@ -12,6 +12,8 @@ import java.util.concurrent.locks.ReentrantLock;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.configuration.server.entity.ServerConfig;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageTree;
......@@ -26,6 +28,8 @@ public class LocalMessageBucket implements Bucket<MessageTree> {
private MessagePathBuilder m_pathBuilder;
@Inject
private ServerConfigManager m_configManager;
private String m_baseDir = "target/bucket";
private ReentrantLock m_writeLock;
......@@ -82,6 +86,12 @@ public class LocalMessageBucket implements Bucket<MessageTree> {
@Override
public void initialize(Class<?> type, String domain, Date timestamp) throws IOException {
ServerConfig serverConfig = m_configManager.getServerConfig();
if (serverConfig != null) {
m_baseDir = serverConfig.getStorage().getLocalBaseDir();
}
m_writeLock = new ReentrantLock();
String logicalPath = m_pathBuilder.getMessagePath(domain, timestamp);
......@@ -93,10 +103,6 @@ public class LocalMessageBucket implements Bucket<MessageTree> {
m_writeDataFile = new BufferedOutputStream(new FileOutputStream(dataFile, true), 8192);
}
public void setBaseDir(String baseDir) {
m_baseDir = baseDir;
}
@Override
public boolean storeById(String id, MessageTree tree) throws IOException {
ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
......
......@@ -18,6 +18,8 @@ import java.util.concurrent.locks.ReentrantLock;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.configuration.server.entity.ServerConfig;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.storage.Bucket;
import com.site.helper.Splitters;
......@@ -29,6 +31,8 @@ public class LocalReportBucket implements Bucket<String>, LogEnabled {
private MessagePathBuilder m_pathBuilder;
@Inject
private ServerConfigManager m_configManager;
private String m_baseDir = "target/bucket";
// key => offset of record
......@@ -159,6 +163,12 @@ public class LocalReportBucket implements Bucket<String>, LogEnabled {
@Override
public void initialize(Class<?> type, String name, Date timestamp) throws IOException {
ServerConfig serverConfig = m_configManager.getServerConfig();
if (serverConfig != null) {
m_baseDir = serverConfig.getStorage().getLocalBaseDir();
}
m_writeLock = new ReentrantLock();
m_readLock = new ReentrantLock();
......@@ -212,10 +222,6 @@ public class LocalReportBucket implements Bucket<String>, LogEnabled {
}
}
public void setBaseDir(String baseDir) {
m_baseDir = baseDir;
}
@Override
public boolean storeById(String id, String report) throws IOException {
if (m_idToOffsets.containsKey(id)) {
......
......@@ -7,7 +7,8 @@
<entity-ref name="console" />
</entity>
<entity name="storage">
<attribute name="disabled" value-type="boolean" />
<attribute name="local-base-dir" value-type="String" />
<attribute name="hdfs-disabled" value-type="boolean" />
<entity-ref name="hdfs" type="list" names="hdfses" />
<entity-ref name="property" type="list" names="properties" xml-indent="true" />
</entity>
......
......@@ -2,6 +2,7 @@
<model model-package="com.dianping.cat.configuration.server" enable-xml-parser="true" enable-validator="true">
<entity name="config" class-name="ServerConfig"/>
<entity name="storage" class-name="StorageConfig">
<attribute name="local-base-dir" value-type="String" default-value="target/bucket" />
<entity-ref name="hdfs" type="map" names="hdfses" />
<entity-ref name="property" type="map" names="properties" xml-indent="true" />
</entity>
......
......@@ -250,6 +250,9 @@
<implementation>com.dianping.cat.storage.message.LocalLogviewBucket</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessagePathBuilder</role>
</requirement>
......@@ -265,6 +268,9 @@
<implementation>com.dianping.cat.storage.message.LocalMessageBucket</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessagePathBuilder</role>
</requirement>
......@@ -280,6 +286,9 @@
<implementation>com.dianping.cat.storage.report.LocalReportBucket</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessagePathBuilder</role>
</requirement>
......
......@@ -34,6 +34,7 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
List<Component> all = new ArrayList<Component>();
all.add(C(ModelService.class, "transaction-local", LocalTransactionService.class) //
.req(BucketManager.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "transaction-historical", HistoricalTransactionService.class) //
.req(BucketManager.class, ReportDao.class));
......@@ -41,6 +42,7 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.req(ModelService.class, new String[] { "transaction-local", "transaction-historical" }, "m_services"));
all.add(C(ModelService.class, "event-local", LocalEventService.class) //
.req(BucketManager.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "event-historical", HistoricalEventService.class) //
.req(BucketManager.class, ReportDao.class));
......@@ -48,6 +50,7 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.req(ModelService.class, new String[] { "event-local", "event-historical" }, "m_services"));
all.add(C(ModelService.class, "problem-local", LocalProblemService.class) //
.req(BucketManager.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "problem-historical", HistoricalProblemService.class) //
.req(BucketManager.class, ReportDao.class));
......@@ -55,6 +58,7 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.req(ModelService.class, new String[] { "problem-local", "problem-historical" }, "m_services"));
all.add(C(ModelService.class, "ip-local", LocalIpService.class) //
.req(BucketManager.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "ip-historical", HistoricalIpService.class) //
.req(BucketManager.class, ReportDao.class));
......
......@@ -42,9 +42,8 @@ public class HistoricalEventService extends BaseHistoricalModelService<EventRepo
private EventReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "event");
String xml = bucket.findById(domain);
DefaultXmlParser parser = new DefaultXmlParser();
return parser.parse(xml);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
private EventReport getRemoteReport(long timestamp, String domain) throws Exception {
......
package com.dianping.cat.report.page.model.event;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.transform.DefaultXmlParser;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class LocalEventService extends BaseLocalModelService<EventReport> {
@Inject
private BucketManager m_bucketManager;
public LocalEventService() {
super("event");
}
@Override
protected EventReport getReport(ModelRequest request, ModelPeriod period, String domain) throws Exception {
EventReport report = super.getReport(request, period, domain);
if (report == null && period.isLast()) {
long date = Long.parseLong(request.getProperty("date"));
report = getLocalReport(date, domain);
}
return report;
}
private EventReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "event");
String xml = bucket.findById(domain);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
}
......@@ -42,9 +42,8 @@ public class HistoricalIpService extends BaseHistoricalModelService<IpReport> {
private IpReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "ip");
String xml = bucket.findById(domain);
DefaultXmlParser parser = new DefaultXmlParser();
return parser.parse(xml);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
private IpReport getRemoteReport(long timestamp, String domain) throws Exception {
......
package com.dianping.cat.report.page.model.ip;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.transform.DefaultXmlParser;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class LocalIpService extends BaseLocalModelService<IpReport> {
@Inject
private BucketManager m_bucketManager;
public LocalIpService() {
super("ip");
}
@Override
protected IpReport getReport(ModelRequest request, ModelPeriod period, String domain) throws Exception {
IpReport report = super.getReport(request, period, domain);
if (report == null && period.isLast()) {
long date = Long.parseLong(request.getProperty("date"));
report = getLocalReport(date, domain);
}
return report;
}
private IpReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "ip");
String xml = bucket.findById(domain);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
}
......@@ -43,9 +43,8 @@ public class HistoricalProblemService extends BaseHistoricalModelService<Problem
private ProblemReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "problem");
String xml = bucket.findById(domain);
DefaultXmlParser parser = new DefaultXmlParser();
return parser.parse(xml);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
private ProblemReport getRemoteReport(long timestamp, String domain) throws Exception {
......
package com.dianping.cat.report.page.model.problem;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.transform.DefaultXmlParser;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class LocalProblemService extends BaseLocalModelService<ProblemReport> {
@Inject
private BucketManager m_bucketManager;
public LocalProblemService() {
super("problem");
}
@Override
protected ProblemReport getReport(ModelRequest request, ModelPeriod period, String domain) throws Exception {
ProblemReport report = super.getReport(request, period, domain);
if (report == null && period.isLast()) {
long date = Long.parseLong(request.getProperty("date"));
report = getLocalReport(date, domain);
}
return report;
}
private ProblemReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "problem");
String xml = bucket.findById(domain);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
}
......@@ -16,7 +16,7 @@ public abstract class BaseHistoricalModelService<T> extends ModelServiceWithCalS
Initializable {
private String m_name;
private boolean m_localMode;
private boolean m_localMode = true;
public BaseHistoricalModelService(String name) {
m_name = name;
......@@ -33,14 +33,8 @@ public abstract class BaseHistoricalModelService<T> extends ModelServiceWithCalS
ServerConfigManager manager = lookup(ServerConfigManager.class);
ServerConfig serverConfig = manager.getServerConfig();
try {
if (serverConfig != null) {
m_localMode = serverConfig.isLocalMode();
} else {
m_localMode = true;
}
} finally {
release(manager);
if (serverConfig != null) {
m_localMode = serverConfig.isLocalMode();
}
}
......
......@@ -18,7 +18,8 @@ import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.site.lookup.annotation.Inject;
public abstract class BaseLocalModelService<T> extends ModelServiceWithCalSupport implements ModelService<T>, Initializable {
public abstract class BaseLocalModelService<T> extends ModelServiceWithCalSupport implements ModelService<T>,
Initializable {
@Inject(type = MessageConsumer.class, value = "realtime")
private RealtimeConsumer m_consumer;
......@@ -59,6 +60,16 @@ public abstract class BaseLocalModelService<T> extends ModelServiceWithCalSuppor
throw new RuntimeException("Internal error: this should not be reached!");
}
@Override
public void initialize() throws InitializationException {
ServerConfigManager manager = lookup(ServerConfigManager.class);
ServerConfig config = manager.getServerConfig();
if (config != null) {
m_defaultDomain = config.getConsole().getDefaultDomain();
}
}
@Override
public ModelResponse<T> invoke(ModelRequest request) {
ModelResponse<T> response = new ModelResponse<T>();
......@@ -97,18 +108,4 @@ public abstract class BaseLocalModelService<T> extends ModelServiceWithCalSuppor
return sb.toString();
}
@Override
public void initialize() throws InitializationException {
ServerConfigManager manager = lookup(ServerConfigManager.class);
ServerConfig config = manager.getServerConfig();
try {
if (config != null) {
m_defaultDomain = config.getConsole().getDefaultDomain();
}
} finally {
release(manager);
}
}
}
......@@ -42,9 +42,8 @@ public class HistoricalTransactionService extends BaseHistoricalModelService<Tra
private TransactionReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "transaction");
String xml = bucket.findById(domain);
DefaultXmlParser parser = new DefaultXmlParser();
return parser.parse(xml);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
private TransactionReport getRemoteReport(long timestamp, String domain) throws Exception {
......
package com.dianping.cat.report.page.model.transaction;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultXmlParser;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class LocalTransactionService extends BaseLocalModelService<TransactionReport> {
@Inject
private BucketManager m_bucketManager;
public LocalTransactionService() {
super("transaction");
}
@Override
protected TransactionReport getReport(ModelRequest request, ModelPeriod period, String domain) throws Exception {
TransactionReport report = super.getReport(request, period, domain);
if (report == null && period.isLast()) {
long date = Long.parseLong(request.getProperty("date"));
report = getLocalReport(date, domain);
}
return report;
}
private TransactionReport getLocalReport(long timestamp, String domain) throws Exception {
Bucket<String> bucket = m_bucketManager.getReportBucket(timestamp, "transaction");
String xml = bucket.findById(domain);
return xml == null ? null : new DefaultXmlParser().parse(xml);
}
}
......@@ -31,6 +31,9 @@
<role-hint>transaction-local</role-hint>
<implementation>com.dianping.cat.report.page.model.transaction.LocalTransactionService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -70,6 +73,9 @@
<role-hint>event-local</role-hint>
<implementation>com.dianping.cat.report.page.model.event.LocalEventService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -109,6 +115,9 @@
<role-hint>problem-local</role-hint>
<implementation>com.dianping.cat.report.page.model.problem.LocalProblemService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -148,6 +157,9 @@
<role-hint>ip-local</role-hint>
<implementation>com.dianping.cat.report.page.model.ip.LocalIpService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -420,6 +432,9 @@
<role>com.dianping.cat.report.page.model.transaction.LocalTransactionService</role>
<implementation>com.dianping.cat.report.page.model.transaction.LocalTransactionService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -431,6 +446,9 @@
<role>com.dianping.cat.report.page.model.event.LocalEventService</role>
<implementation>com.dianping.cat.report.page.model.event.LocalEventService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......@@ -442,6 +460,9 @@
<role>com.dianping.cat.report.page.model.problem.LocalProblemService</role>
<implementation>com.dianping.cat.report.page.model.problem.LocalProblemService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
......
......@@ -32,7 +32,7 @@
<td>${e.failCount}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
<td><a href="${model.logViewBaseUri}/${empty e.failMessageUrl ? e.successMessageUrl : e.failMessageUrl}">Log View</a></td>
<td>${w:format(e.min,'0')}/${w:format(e.max,'0')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
<td>${w:format(e.min,'0.#')}/${w:format(e.max,'0.#')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
</tr>
</c:forEach>
</c:when>
......@@ -50,7 +50,7 @@
<td>${e.failCount}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
<td><a href="${model.logViewBaseUri}/${empty e.failMessageUrl ? e.successMessageUrl : e.failMessageUrl}">Log View</a></td>
<td>${w:format(e.min,'0')}/${w:format(e.max,'0')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
<td>${w:format(e.min,'0.#')}/${w:format(e.max,'0.#')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
</tr>
<tr class="graphs"><td colspan="6"><div id="${status.index}" style="display:none"></div></td></tr>
</c:forEach>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册