09.CAT-埋点数据
9.01 客户端埋点
埋点示例

示例的API
public class Cat {
private static Cat s_instance = new Cat();
......
public static void logEvent(String type, String name, String status, String nameValuePairs) {
......
}
......
9.02 服务端解析埋点
cat-client 模块中,通过 Cat 类中对外暴露的数据接口,进行消息的埋点。
数据从客户端上报到服务端
参考 客户端上报数据
服务端埋点数据解析
消费者消费及分发数据的解析见 服务端埋点数据解析
数据统计
在服务端进行消息分析时,通过 DefaultMessageAnalyzerManager 管理所有的 消息分析器 ,如下代码
public class DefaultMessageAnalyzerManager extends ContainerHolder implements MessageAnalyzerManager, Initializable,
LogEnabled {
......
private Map<Long, Map<String, List<MessageAnalyzer>>> m_analyzers = new HashMap<Long, Map<String, List<MessageAnalyzer>>>();
@Override
public List<MessageAnalyzer> getAnalyzer(String name, long startTime) {
// remove last two hour analyzer
try {
Map<String, List<MessageAnalyzer>> temp = m_analyzers.remove(startTime - m_duration * 2);
if (temp != null) {
for (List<MessageAnalyzer> anlyzers : temp.values()) {
for (MessageAnalyzer analyzer : anlyzers) {
analyzer.destroy();
}
}
}
} catch (Exception e) {
Cat.logError(e);
}
Map<String, List<MessageAnalyzer>> map = m_analyzers.get(startTime);
if (map == null) {
synchronized (m_analyzers) {
map = m_analyzers.get(startTime);
if (map == null) {
map = new HashMap<String, List<MessageAnalyzer>>();
m_analyzers.put(startTime, map);
}
}
}
List<MessageAnalyzer> analyzers = map.get(name);
if (analyzers == null) {
synchronized (map) {
analyzers = map.get(name);
if (analyzers == null) {
analyzers = new ArrayList<MessageAnalyzer>();
MessageAnalyzer analyzer = lookup(MessageAnalyzer.class, name);
analyzer.setIndex(0);
analyzer.initialize(startTime, m_duration, m_extraTime);
analyzers.add(analyzer);
int count = analyzer.getAnanlyzerCount();
for (int i = 1; i < count; i++) {
MessageAnalyzer tempAnalyzer = lookup(MessageAnalyzer.class, name);
tempAnalyzer.setIndex(i);
tempAnalyzer.initialize(startTime, m_duration, m_extraTime);
analyzers.add(tempAnalyzer);
}
map.put(name, analyzers);
}
}
}
return analyzers;
}
9.03 EventAnalyzer
public class EventAnalyzer extends AbstractMessageAnalyzer<EventReport> implements LogEnabled {
@Inject
private EventDelegate m_delegate;
@Inject(ID)
private ReportManager<EventReport> m_reportManager;
@Override
public void process(MessageTree tree) {
String domain = tree.getDomain();
if (m_serverFilterConfigManager.validateDomain(domain)) {
EventReport report = m_reportManager.getHourlyReport(getStartTime(), domain, true);
Message message = tree.getMessage();
String ip = tree.getIpAddress();
if (message instanceof Transaction) {
processTransaction(report, tree, (Transaction) message, ip);
} else if (message instanceof Event) {
processEvent(report, tree, (Event) message, ip);
}
}
}
private void processEvent(EventReport report, MessageTree tree, Event event, String ip) {
int count = 1;
EventType type = report.findOrCreateMachine(ip).findOrCreateType(event.getType());
EventName name = type.findOrCreateName(event.getName());
String messageId = tree.getMessageId();
report.addIp(tree.getIpAddress());
type.incTotalCount(count);
name.incTotalCount(count);
if (event.isSuccess()) {
type.setSuccessMessageUrl(messageId);
name.setSuccessMessageUrl(messageId);
} else {
type.incFailCount(count);
name.incFailCount(count);
type.setFailMessageUrl(messageId);
name.setFailMessageUrl(messageId);
}
type.setFailPercent(type.getFailCount() * 100.0 / type.getTotalCount());
name.setFailPercent(name.getFailCount() * 100.0 / name.getTotalCount());
processEventGrpah(name, event, count);
}
private void processEventGrpah(EventName name, Event t, int count) {
long current = t.getTimestamp() / 1000 / 60;
int min = (int) (current % (60));
Range range = name.findOrCreateRange(min);
range.incCount(count);
if (!t.isSuccess()) {
range.incFails(count);
}
}
private void processTransaction(EventReport report, MessageTree tree, Transaction t, String ip) {
List<Message> children = t.getChildren();
for (Message child : children) {
if (child instanceof Transaction) {
processTransaction(report, tree, (Transaction) child, ip);
} else if (child instanceof Event) {
processEvent(report, tree, (Event) child, ip);
}
}
}
9.04 EventDelegate
public class EventDelegate implements ReportDelegate<EventReport> {
@Inject
private TaskManager m_taskManager;
小结
- 打开 应用项目的
app.properties的项目名app.name配置,就开启向服务 - 客户端组织数据进行数据上报
- 服务消费数据,进行分析

浙公网安备 33010602011771号