超级技术二:降温神器 预埋温度计+喷雾机+冷却水管

超级技术三:大坝“天眼”防止坝基山体渗水的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模块动态加载,无倾入监控。

扩展阅读

相关文章:

  • 2021-11-02
  • 2022-01-30
  • 2022-12-23
  • 2021-07-19
  • 2021-11-23
  • 2021-08-16
  • 2021-09-17
  • 2021-06-04
猜你喜欢
  • 2021-11-27
  • 2022-02-18
  • 2022-01-15
  • 2021-09-27
  • 2021-04-13
  • 2021-06-05
相关资源
相似解决方案