APM 监控系统:APM小结

2,905 阅读2分钟

八、 APM 小结

  1. 通常来说各个端的监控能力是不太一致的,技术实现细节也不统一。所以在技术方案评审的时候需要将监控能力对齐统一。每个能力在各个端的数据字段必须对齐(字段个数、名称、数据类型和精度),因为 APM 本身是一个闭环,监控了之后需符号化解析、数据整理,进行产品化开发、最后需要监控大盘展示等

  2. 一些 crash 或者 ANR 等根据等级需要邮件、短信、企业内容通信工具告知干系人,之后快速发布版本、hot fix 等。

  3. 监控的各个能力需要做成可配置,灵活开启关闭。

  4. 监控数据需要做内存到文件的写入处理,需要注意策略。监控数据需要存储数据库,数据库大小、设计规则等。存入数据库后如何上报,上报机制等会在另一篇文章讲:打造一个通用、可配置的数据上报 SDK

  5. 尽量在技术评审后,将各端的技术实现写进文档中,同步给相关人员。比如 ANR 的实现

    /*
    android 端
    
    根据设备分级,一般超过 300ms 视为一次卡顿
    hook 系统 loop,在消息处理前后插桩,用以计算每条消息的时长
    开启另外线程 dump 堆栈,处理结束后关闭
    */
    new ExceptionProcessor().init(this, new Runnable() {
                @Override
                public void run() {
                    //监测卡顿
                    try {
                        ProxyPrinter proxyPrinter = new ProxyPrinter(PerformanceMonitor.this);
                        Looper.getMainLooper().setMessageLogging(proxyPrinter);
                        mWeakPrinter = new WeakReference<ProxyPrinter>(proxyPrinter);
                    } catch (FileNotFoundException e) {
                    }
                }
            })
            
    /*
    iOS 端
    
    子线程通过 ping 主线程来确认主线程当前是否卡顿。
    卡顿阈值设置为 300ms,超过阈值时认为卡顿。
    卡顿时获取主线程的堆栈,并存储上传。
    */ 
    - (void) main() {
        while (self.cancle == NO) {
            self.isMainThreadBlocked = YES;
            dispatch_async(dispatch_get_main_queue(), ^{
                self.isMainThreadBlocked = YES;
                [self.semaphore singal];
            });
            [Thread sleep:300];
            if (self.isMainThreadBlocked) {
                [self handleMainThreadBlock];
            }
            [self.semaphore wait];
        }
    }
    
  6. 整个 APM 的架构图如下

    APM Structure

    说明:

    • 埋点 SDK,通过 sessionId 来关联日志数据
  7. APM 技术方案本身是随着技术手段、分析需求不断调整升级的。上图的几个结构示意图是早期几个版本的,目前使用的是在此基础上进行了升级和结构调整,提几个关键词:Hermes、Flink SQL、InfluxDB。

文章内容过长,拆分为多个篇章,请自行点击查看,如果想整体连贯查看,请访问这里