超级技术二:降温神器 预埋温度计+喷雾机+冷却水管
超级技术三:大坝“天眼”防止坝基山体渗水的1万多个灌浆孔
超级技术四:护坡神器主动网 蜘蛛人的奉献
注意:超级电站设计人员在工程设计时,就考虑到了系统在未来会遇到的风险,然后主动设计预防措施,而这些预防措施都离不开传感器:温度计,湿度计,水位/震动感知等等。
作为码农,我们在做系统设计时也会考虑到未来的风险,而我们的“传感器”来自日志监控系统。这也是一个健壮的系统离不开日志系统的原因。
日志的作用:
- 追踪程序运行过程,快速定位问题
- 记录分析运行数据,便于后续版本统计优化
- 分析用户行为数据,便于做用户运营
如需求上线,发现程序bug;统计程序bug,提升代码质量;统计接口调用频次,发现系统热点……
日志可以帮助我们用心看清系统
常用的日志系统
日志系统应该包含如下功能:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制
常用开源的、分布式的、支持docker云化等的日志系统有ELK套件,Prometheus+Grafana等。
ELK常用架构
Prometheus套件
记录日志的方式:
- 普通程序员:Log.debug(),哪里有问题哪里debug。
- 高级程序员:MDC
下面介绍下MDC:(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能
在Java语言环境下,常用的日志记录方式:
@Aspect切面记录接口调用日志
@Intercepter拦截器记录日志
@Filter过滤器记录日志
一次请求,记录一个LOG_ID,用完即删。
MDC.put(“LOG_ID", UUID.randomUUID().toString().replace("-", ""));
request.process()......
MDC.remove(“LOG_ID”);
Logback.xml:<pattern>%d{yyyy-MM-dd HH:mm:ss [%X{LOG_ID}] %msg%n</pattern>
调用链分析
针对一般的web应用,MDC已经可以把一次请求,从request,mq,nosqldb,db等都串联起来,方便我们去定位问题。分布式环境下,要将用户请求都记录并关联起来就比较困难,对于高级程序员来说,这都不是事,手撸一个就行。但是对于普通开发人员来说,就得借助强大的开源社区了,所以调用链分析系统应运而生。引入几个简单概念:
- TraceID:用来标识每一条业务请求链的唯一ID,TraceID需要在整个调用链路上传递
- Span:请求链中的每一个环节为一个Span,每一个Span有一个SpanId来标识,前后Span间形成父子关系
- Annotation:业务自定义的埋点信息,可以是sql、用户ID等关键信息
举个栗子
常用调用链分析工具
Zipkin,Pinpoint,SkyWalking,CAT
通过对比,我们来认识他们。在云时代,这些名词常见于网络。
字节码技术
通过调用链分析工具的对比,我们发现好多工具都是无倾入式的,凭啥做到的,字节码技术。
java程序员都知道,.java文件编译之后都会生成.class文件。我们常用的是反射,但是反射的性能是比较低的。当然可以通过自定义的序列化协议来提高反射的性能。但是还有一种高级的骚操作----字节码技术。它是一种运行时修改jvm中的字节码的一组API接口。
常见字节码框架有:Javaassist, ASM
常见作用:Android模块动态加载,无倾入监控。