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

extract domain, timestamp out of message id

上级 191a6f61
......@@ -62,7 +62,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(MessageIdFactory.class) //
.req(MessageManager.class));
all.add(C(MessagePathBuilder.class, DefaultMessagePathBuilder.class) //
.req(MessageManager.class));
.req(MessageManager.class, MessageIdFactory.class));
all.add(C(MessageStorage.class, "html", DefaultMessageStorage.class) //
.req(MessagePathBuilder.class) //
.req(MessageCodec.class, "html"));
......
......@@ -2,11 +2,13 @@ package com.dianping.cat.message.internal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.message.spi.MessageManager;
import com.site.helper.Splitters;
import com.site.lookup.annotation.Inject;
public class MessageIdFactory implements Initializable {
......@@ -46,6 +48,21 @@ public class MessageIdFactory implements Initializable {
return sb.toString();
}
public Object[] parse(String messageId) {
Object[] parts = new Object[4];
List<String> list = Splitters.by('-').split(messageId);
int len = list.size();
if (len == 4) {
parts[0] = list.get(0); // domain
parts[1] = list.get(1); // ip address in HEX
parts[2] = Long.parseLong(list.get(2), 16);
parts[3] = Integer.parseInt(list.get(3), 16);
}
return parts;
}
protected long getTimestamp() {
return MilliSecondTimer.currentTimeMillis();
}
......
package com.dianping.cat.message.spi;
public interface MessageId {
public String getDomain();
public long getTimestamp();
}
......@@ -4,13 +4,11 @@ import java.io.File;
import java.net.URL;
public interface MessagePathBuilder {
public String getHdfsPath(MessageTree tree, String host);
public String getHdfsPath(String messageId);
public File getLogViewBaseDir();
public URL getLogViewBaseUrl();
public String getLogViewPath(MessageTree tree);
public String getLogViewPath(String messageId);
}
......@@ -6,7 +6,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
......@@ -14,16 +13,18 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.configuration.model.entity.Config;
import com.dianping.cat.message.internal.MessageIdFactory;
import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageTree;
import com.site.helper.Splitters;
import com.site.lookup.annotation.Inject;
public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializable, LogEnabled {
@Inject
private MessageManager m_manager;
@Inject
private MessageIdFactory m_factory;
private File m_baseLogDir;
private URL m_baseLogUrl;
......@@ -31,12 +32,23 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
private Logger m_logger;
@Override
public String getHdfsPath(MessageTree tree, String host) {
public String getHdfsPath(String messageId) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/{1}/{0,date,mm}-{2}");
Date date = new Date(tree.getMessage().getTimestamp());
String path = format.format(new Object[] { date, tree.getDomain(), host });
Object[] parts = m_factory.parse(messageId);
return path;
try {
String domain = (String) parts[0];
String ipAddress = (String) parts[1];
long timestamp = (Long) parts[2];
Date date = new Date(timestamp);
String path = format.format(new Object[] { date, domain, ipAddress });
return path;
} catch (Exception e) {
m_logger.error("Invalid message id format: " + messageId, e);
}
return messageId;
}
@Override
......@@ -49,30 +61,19 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
return m_baseLogUrl;
}
@Override
public String getLogViewPath(MessageTree tree) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/{1}/{2}.html");
Date date = new Date(tree.getMessage().getTimestamp());
String path = format.format(new Object[] { date, tree.getDomain(), tree.getMessageId() });
return path;
}
@Override
public String getLogViewPath(String messageId) {
List<String> parts = Splitters.by('-').split(messageId);
if (parts.size() == 4) {
try {
String domain = parts.get(0);
long timestamp = Long.parseLong(parts.get(2), 16);
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/{1}/{2}.html");
String path = format.format(new Object[] { new Date(timestamp), domain, messageId });
return path;
} catch (Exception e) {
m_logger.error("Invalid message id format: " + messageId, e);
}
Object[] parts = m_factory.parse(messageId);
try {
String domain = (String) parts[0];
long timestamp = (Long) parts[2];
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/{1}/{2}.html");
String path = format.format(new Object[] { new Date(timestamp), domain, messageId });
return path;
} catch (Exception e) {
m_logger.error("Invalid message id format: " + messageId, e);
}
return messageId;
......
......@@ -52,14 +52,14 @@ public class DefaultMessageStorage implements MessageStorage, Initializable, Dis
@Override
public String getPath(MessageTree tree) {
String path = m_builder.getLogViewPath(tree);
String path = m_builder.getLogViewPath(tree.getMessageId());
return path;
}
@Override
public String store(MessageTree tree) {
String path = m_builder.getLogViewPath(tree);
String path = m_builder.getLogViewPath(tree.getMessageId());
m_job.append(tree);
return path;
......@@ -79,7 +79,7 @@ public class DefaultMessageStorage implements MessageStorage, Initializable, Dis
}
private void handle(MessageTree tree) {
String path = m_builder.getLogViewPath(tree);
String path = m_builder.getLogViewPath(tree.getMessageId());
File file = new File(m_builder.getLogViewBaseDir(), path);
if (!file.exists()) {
......
......@@ -53,6 +53,9 @@
<requirement>
<role>com.dianping.cat.message.spi.MessageManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.internal.MessageIdFactory</role>
</requirement>
</requirements>
</component>
<component>
......
......@@ -14,10 +14,25 @@ public class MessageIdFactoryTest {
}
};
private void check(String domain, String expected) {
m_factory.setDomain(domain);
m_factory.setIpAddress("c0a83f99"); // 192.168.63.153
String actual = m_factory.getNextId();
Assert.assertEquals(expected, actual);
Object[] parts = m_factory.parse(actual);
Assert.assertEquals(domain, parts[0]);
Assert.assertEquals("c0a83f99", parts[1]);
Assert.assertEquals(m_timestamp, parts[2]);
}
@Test
public void test() throws Exception {
m_factory.initialize();
check("domain1", "domain1-c0a83f99-135bdb7825c-0");
check("domain1", "domain1-c0a83f99-135bdb7825c-1");
check("domain1", "domain1-c0a83f99-135bdb7825c-2");
......@@ -33,13 +48,4 @@ public class MessageIdFactoryTest {
check("domain1", "domain1-c0a83f99-135bdb7825e-1");
check("domain1", "domain1-c0a83f99-135bdb7825e-2");
}
private void check(String domain, String expected) {
m_factory.setDomain(domain);
m_factory.setIpAddress("c0a83f99"); // 192.168.63.153
String actual = m_factory.getNextId();
Assert.assertEquals(expected, actual);
}
}
<%@ page contentType="text/html; charset=utf-8"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.transaction.Context" scope="request" />
<jsp:useBean id="payload" type="com.dianping.cat.report.page.transaction.Payload" scope="request" />
<%@ page contentType="image/html; charset=utf-8" %>
<jsp:useBean id="model" type="com.dianping.cat.report.page.transaction.Model" scope="request" />
${model.graph}
<%-- <table class="graphs">
<tr>
<td><img src="?op=graph&domain=${payload.domain}&type=${payload.type}&name=${payload.name}&graph=1" class="graph"></td>
<td><img src="?op=graph&domain=${payload.domain}&type=${payload.type}&name=${payload.name}&graph=2" class="graph"></td>
</tr>
<tr>
<td><img src="?op=graph&domain=${payload.domain}&type=${payload.type}&name=${payload.name}&graph=3" class="graph"></td>
<td><img src="?op=graph&domain=${payload.domain}&type=${payload.type}&name=${payload.name}&graph=4" class="graph"></td>
</tr>
</table> --%>
\ No newline at end of file
${model.graph}
\ No newline at end of file
......@@ -2,9 +2,7 @@ package com.dianping.cat.job.hdfs;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -37,8 +35,6 @@ public class DefaultOutputChannelManager extends ContainerHolder implements Outp
private Path m_basePath;
private String m_ipAddress;
private Map<String, OutputChannel> m_channels = new HashMap<String, OutputChannel>();
private Map<String, Integer> m_indexes = new HashMap<String, Integer>();
......@@ -103,19 +99,11 @@ public class DefaultOutputChannelManager extends ContainerHolder implements Outp
} catch (Exception e) {
throw new InitializationException("Error when getting HDFS file system.", e);
}
try {
InetAddress localHost = InetAddress.getLocalHost();
m_ipAddress = localHost.getHostAddress();
} catch (UnknownHostException e) {
m_logger.warn("Unable to get local host!", e);
}
}
@Override
public OutputChannel openChannel(MessageTree tree, boolean forceNew) throws IOException {
String path = m_builder.getHdfsPath(tree, m_ipAddress);
String path = m_builder.getHdfsPath(tree.getMessageId());
OutputChannel channel = m_channels.get(path);
if (channel == null) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册