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 配置,就开启向服务
  • 客户端组织数据进行数据上报
  • 服务消费数据,进行分析
posted @ 2021-02-16 19:14  可可逗豆  阅读(469)  评论(0)    收藏  举报