ARTS-16-什么是应用性能监控APM

博客首页文章列表 松花皮蛋me 2019-06-30 09:27
文章首发于公众号 松花皮蛋的黑板报松花皮蛋的黑板报,作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

ARTS的初衷

Algorithm: 主要是为了编程训练和学习。

Review:主要是为了学习英文

Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章

https://www.zhihu.com/question/301150832

一、Algorithm

Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:

Input: nums = [1], k = 1
Output: [1]
Note:

You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        //桶排序,注意:桶长要比原数组长度大一
        List[] buckets = new List[nums.length+1];
        Map<Integer, Integer> counts = new HashMap<>();
        for(int num:nums) {
            counts.put(num,counts.getOrDefault(num,0)+1);
        }
        for (int num:counts.keySet()) {
            int count = counts.get(num);
            if(buckets[count]==null) {
                buckets[count] = new ArrayList();
            }
            buckets[count].add(num);
        }
        List<Integer> ans = new ArrayList<>();
        //从后往前找top k,i>=1 &amp;&amp; ans.size<k
        for (int i=buckets.length-1;i>=1 &amp;&amp; ans.size()<k;i--) {
            if(buckets[i]!=null) {
               ans.addAll(buckets[i]);
            }
        }
        return ans;
    }
}

二、Review

以前的异常排查不管是通过发临时包、在线调试、QA复现,受多因素的影响,复现排查都麻烦,所以催生了应用性能监控APM。APM是负责监控和管理用户体验的工具,它不像崩溃报告仅仅收集错误信息。主要有两种收集和呈现数据的方式:代码级数据、Metric监控数据。代码级数据就是通过在软件中使用探针和事务跟踪获取到生产信息,这种方式综合性强

确保服务是启动运行状态还远远不够,响应变得缓慢发生的频率远高于程序崩溃,所以需要快速了解清楚问题是如何发生的。APM工具可以帮助开发团队快速了解一些常见问题,比如立即了解任何应用程序问题的根本原因,包括导致问题的确切代码行、方法、数据库或者具体的API调用,又或者了解并比较新版本部署对关键指标的影响,代码变化所引入的新问题和对性能的影响,还有APM可以帮助我们跟踪整体访问和流量高峰情况

APM就是利用数据来理解问题发生的原因,并尽可能提供最佳的用户体验,整个公司团队都从中受益,不管是在部署前、生产,还是部署后阶段。开发团队可以通过APM了解到软件质量,并提供更好的用户体验,测试团队可以通过APM进行压力负载测试并确保整个产品的一致性,运维团队可以通过APM进行性能监控,产品团队可以通过APM获得用户对新功能的欢迎程度反馈,业务负责人可以通过APM跟踪关键业务情况,如果有任何影响到业务增长的问题,他们会在第一时间得到,平均恢复时间MTTR因为性能问题得到更快修复而降低

APM服务收集了相当庞大的数据,但团队需要的是可操作的见解而不仅仅是报告,下面是一些常见的功能

1、完整的堆栈信息

了解清楚到底发生了什么才能更直接有效地处理问题

2、服务监控

基础性能监控CPU使用率、CPU平均负载、内存是必不可少的,依赖服务(如Mysql、Redis、Elasticsearch)调用时延(TP99)监控也很重要

3、事务跟踪

事务跟踪中如何翻译资源ID、记录点击事件是关键,不管采用何种编译插桩技术进行事务跟踪,都要保证自身的低性能消耗,绝不能拖慢服务本身

4、部署跟踪

通过部署跟踪确保所做的更改不会对页面性能产生负面影响,不要等到用户来反馈这些错误

5、数据可视化

走势、分布情况、火焰图等等图表,以更易于理解的格式呈现,也方便我们进行共性分析

6、灵活的告警

基于基线或者阀值的异常检测,然后通过不同渠道反馈到干系人

7、真实用户监控

真实用户监控可以帮助我们了解下面类似问题:用户加载响应差的具体页面是哪个、是什么原因导致了用户的问题、用户遭遇问题前的关键访问路径是什么、整个活动会话访问都是异常的还是个别页面异常、用户设备情况和网络上传下载速度(比如SSL建链\首包时间)和LBS定位

此图像的alt属性为空;文件名为Real_User_Monitoring.png

8、崩溃报告

无日记信息的异常、只有系统日记的异常、被截断的异常对我们毫无意义,APM需要提供错误前后上下文,完整的方法调用堆栈信息和环境变量

翻译自:https://medium.com/@raygunio/what-is-application-performance-management-9610315fd63

三、Tip

Kafka无消息丢失配置

1、不要使用producer.send(msg),而要使用producer.send(msg,callback)
2、设置acks = all,表明所有副本Broker都要接收到消息才算已提交
3、设置重试参数retries一个较大的值
4、设置unclean.leader.election.enable=false,避免落后太多的Broker参考leader的竞争
5、设置replication.factor>=3,表明消费保存份数
6、设置min.insync.replicas>1,表明消息至少要被写入到多少个副本才算是已提交
7、确保replication.factor>min.insync.replicas
8、设置enable.auth.commit=false,确保消息消费完成后再提交

四、Share

微服务架构之服务冶理Dubbo-Netty流程