sofa-boot
sofa-boot copied to clipboard
适合新手的任务列表,欢迎认领
- [x] [ASSIGNED] SOFABoot 发布服务时 增加 interfaceType 校验。见 https://github.com/sofastack/sofa-boot/issues/851
- [x] [ASSIGNED] 为 SOFABoo t增加 SOFA tracer 插件,见 https://github.com/sofastack/sofa-boot/issues/847
- [x] [CLOSED] SOFA 健康检查日志中加入当前检查进度,见 https://github.com/sofastack/sofa-boot/issues/837
- [x] [ASSIGNED] 支持单独配置终端日志级别 见 https://github.com/sofastack/sofa-common-tools/issues/134
- [ ] [ASSIGNED] 设计实现一个新的配置项,用于判断 SOFABoot 是否由 IDE 启动。见 https://github.com/sofastack/sofa-boot/issues/861
申请人条件不限,申请的话可以在留言里简单说下自己的设计~
您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度
我是这样想的,改造HealthCheckerProcessor
- 在健康检查开始前,根据
HealthChecker
集合,打印待检查项 - 在调用
HealthChecker.isHealthy
方法时,利用CountDownLatch
提供超时机制(超时时间提供默认值,支持配置) - 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成
@it-linnan 好的,欢迎欢迎~
- 第一点可能还不够,SOFA 的健康检查除了 HealthChecker 还包括 HealthIndicator 的检查
- 同样,还需要考虑 HealthIndicator 的
可以在 issue 下面发下你的 PR,我们来 review~
您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度
我是这样想的,改造
HealthCheckerProcessor
- 在健康检查开始前,根据
HealthChecker
集合,打印待检查项- 在调用
HealthChecker.isHealthy
方法时,利用CountDownLatch
提供超时机制(超时时间提供默认值,支持配置)- 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成
@alaneuler 说你思路很好~如果确定要做的话,我们把第一个issue assign给你?
您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度 我是这样想的,改造
HealthCheckerProcessor
- 在健康检查开始前,根据
HealthChecker
集合,打印待检查项- 在调用
HealthChecker.isHealthy
方法时,利用CountDownLatch
提供超时机制(超时时间提供默认值,支持配置)- 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成
@alaneuler 说你思路很好~如果确定要做的话,我们把第一个issue assign给你?
好的,确定要做,分配给我吧。
2.支持单独配置终端日志级别
这个可以通过LoggerContext获取到对应的logger之后通过setLevel可以直接设置,但是有以下注意点:
- 设置日志级别的时候要兼容log4j与logback,两者的日志级别都要设置
- 设置时需要注意有三个地方都有console的配置,分别是log-conf.xml、sofa.middleware.log.console.level、sofa.middleware.log.{space id}.console.level,要注意配置顺序来确定最终生效的console日志级别
我想认领第二个任务
2.支持单独配置终端日志级别
这个可以通过LoggerContext获取到对应的logger之后通过setLevel可以直接设置,但是有以下注意点:
- 设置日志级别的时候要兼容log4j与logback,两者的日志级别都要设置
- 设置时需要注意有三个地方都有console的配置,分别是log-conf.xml、sofa.middleware.log.console.level、sofa.middleware.log.{space id}.console.level,要注意配置顺序来确定最终生效的console日志级别
这里不能使用 logger 的 setLevel 哈~
- 一个 logger 的下面会有多个 appender,sofa 是通过添加一个 console appender 使得日志可以自动同时输出到终端。
- 得单独配置 appender 的级别,使得同一个 logger 的不同 appender 有不同的级别
- 配置的话,不需要考虑 log-conf.xml,因为这个 console appender 是 sofa 自动添加的
其他的思考的很棒,可以根据上面的建议再提一下~
@it-linnan Hi, are you still working on it?
@it-linnan Hi, are you still working on it?
您好,我已经提交了PR,等待review呢 Improve HealthCheck: add progress and timeout.(#837)
2.支持单独配置终端日志级别 这个可以通过LoggerContext获取到对应的logger之后通过setLevel可以直接设置,但是有以下注意点:
- 设置日志级别的时候要兼容log4j与logback,两者的日志级别都要设置
- 设置时需要注意有三个地方都有console的配置,分别是log-conf.xml、sofa.middleware.log.console.level、sofa.middleware.log.{space id}.console.level,要注意配置顺序来确定最终生效的console日志级别
这里不能使用 logger 的 setLevel 哈~
- 一个 logger 的下面会有多个 appender,sofa 是通过添加一个 console appender 使得日志可以自动同时输出到终端。
- 得单独配置 appender 的级别,使得同一个 logger 的不同 appender 有不同的级别
- 配置的话,不需要考虑 log-conf.xml,因为这个 console appender 是 sofa 自动添加的
其他的思考的很棒,可以根据上面的建议再提一下~
consoleAppender大致的初始化流程: consoleAppender的初始化发生在AbstractLoggerSpaceFactory的子类(Log4j2LoggerSpaceFactory和LogbakLoggerSpaceFactory)的初始化过程中,AbstractLoggerSpaceFactoryBuilder在调用build()后会将所有需要consoleAppender的logger的loggerName记录到CommonLoggingConfigurations#loggerConsoleWhiteSet。然后在AbstractLoggerSpaceFactory子类的构造函数中判断是否需要将appender加入到logger中。
我的方案: 在AbstractLoggerSpaceFactory创建consoleAppender时通过ConsoleAppender.Builder#setTarget即可改变console的日志登记
疑问: 目前所有logger共有一个consoleAppender,若是直接调整日志级别,则其它logger也会受到影响。是否可以根据不同的logger来创建不同的consoleAppender并缓存以解决此问题?
@dkisser setTarget 只是设置输出到 stdout 还是 stderr,并不能改 level 的吧。
可以往这两个方向看看:
- appender filer.
- AppenderControl is also applicable in log4j2.
你的疑问是对的,每个 logger 都需要一个 console appender,不能共用一个了。
@dkisser setTarget 只是设置输出到 stdout 还是 stderr,并不能改 level 的吧。
可以往这两个方向看看:
- appender filer.
- AppenderControl is also applicable in log4j2.
你的疑问是对的,每个 logger 都需要一个 console appender,不能共用一个了。
处理思路清晰了,Log4j2可以在创建Appender的时候调用ApeenderBuilder#setFilter,手动给他创建一个ThresholdMatchFilter,通过filter来过滤日志。logback也是类似的,在创建appender的时候通过Appender#addFilter来添加filter。现在我可以领取这个任务了吗?
@dkisser 可以的 @seeflood 第二个任务可以分配给 @dkisser 啦~
增加了两个新任务:
- SOFABoot 发布服务时 增加 interfaceType 校验。见https://github.com/sofastack/sofa-boot/issues/851
- 为SOFA Boot增加SOFA tracer插件,见https://github.com/sofastack/sofa-boot/issues/847
我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:
- API发布服务: 现在ServiceClientImpl的service方法中,只检验InterfaceType非空和binding type。 增加检验instance是否实现了InterfaceType定义的接口。 代码位置:ServiceClientImpl, ServiceComponent
- xml发布服务: 代码位置:ServiceFactoryBean
- 注解发布服务: 代码位置:ServiceBeanFactoryPostProcessor
@alaneuler 看下哈
我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:
- API发布服务: 现在ServiceClientImpl的service方法中,只检验InterfaceType非空和binding type。 增加检验instance是否实现了InterfaceType定义的接口。 代码位置:ServiceClientImpl、ServiceComponent
- xml发布服务:
- 注解发布服务:
嗯嗯,这个思路是 OK 的,但是可以提炼到 ServiceComponent 级别吗? 此外,关于校验开关配置有想法吗?
我想认领 “为SOFA Boot增加SOFA tracer插件” 这个任务 tracer相关类: AbstractSofaTracerStatisticReporter ---执行具体的上报动作 AbstractDigestSpanEncoder ---存储要上报的内容 AbstractClientTracer聚合上述两个类,通过clientSend和clientRecieve来执行具体的发送与接受动作
思路 对于Kafka、Rocket、Rabbit、Redis、Mongo这些中间件,Spring均提供了模板类,我们可以通过代理这些模板类(如:redisTemplate、kafkaTemplate等),通过代理它的execute方法,在execute方法前后通过AbstractClientTracer的clientSend和clientRecieve来完成埋点操作,大体思路和RestTemplate的拦截类似,但不同的是我们需要手动得去实现拦截,而不能借用interceptor(暂时不确定各个模板类是否都有interceptor机制,对于有的可以和RestTemplate一样,通过interceptor实现。对于没有就只能自己编写代理类来拦截,也可以通过spring的AOP来实现)
我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:
- API发布服务: 现在ServiceClientImpl的service方法中,只检验InterfaceType非空和binding type。 增加检验instance是否实现了InterfaceType定义的接口。 代码位置:ServiceClientImpl、ServiceComponent
- xml发布服务:
- 注解发布服务:
嗯嗯,这个思路是 OK 的,但是可以提炼到 ServiceComponent 级别吗? 此外,关于校验开关配置有想法吗?
-
校验开关配置: 参照ModuleHealthChecker的配置实现,在SofaBootConstants里添加两个值:SOFABOOT_COMPONENT_CHECK_INTERFACE_TYPE_DEFAULT_ENABLED=false SOFABOOT_COMPONENT_CHECK_INTERFACE_TYPE_ENABLED= "com.alipay.sofa.healthcheck.component.check.interfacetype.enabled“ 或者,复用健康检查的strictcheck的值也可以(但感觉会有些混淆)
-
ServiceComponent内部: 添加私有值interfaceTypeCheck,用@Value注解注入 ServiceComponent内部的isHealthy方法,如果interfaceTypeCheck为真,则调用内部service的instance和interfaceType进行校验
@keleqnma 思路可以的,有一点我提示一下:三个地方的服务发布,最终都是 new 一个 ServiceImpl 对象,该对象会持有 target(也即是 bean)和 interfaceType。
关于开关的话,可以新建一个,不用复用之前的了~
issue 中回复下,我 assign 给你。
我想认领 “为SOFA Boot增加SOFA tracer插件” 这个任务 tracer相关类: AbstractSofaTracerStatisticReporter ---执行具体的上报动作 AbstractDigestSpanEncoder ---存储要上报的内容 AbstractClientTracer聚合上述两个类,通过clientSend和clientRecieve来执行具体的发送与接受动作
思路 对于Kafka、Rocket、Rabbit、Redis、Mongo这些中间件,Spring均提供了模板类,我们可以通过代理这些模板类(如:redisTemplate、kafkaTemplate等),通过代理它的execute方法,在execute方法前后通过AbstractClientTracer的clientSend和clientRecieve来完成埋点操作,大体思路和RestTemplate的拦截类似,但不同的是我们需要手动得去实现拦截,而不能借用interceptor(暂时不确定各个模板类是否都有interceptor机制,对于有的可以和RestTemplate一样,通过interceptor实现。对于没有就只能自己编写代理类来拦截,也可以通过spring的AOP来实现)
不是这个意思哈,trace 的埋点 SOFATracer 均已完成,现在是需要在 SOFABoot 中增加自动配置。
您好,我想认领“为SOFA Boot增加SOFA tracer插件“
- 参考sofa-tracer项目,将各plugin对应的BeanPostProcessor同步到sofa-boot中;
- 为plugin增加对应的自动配置类,自动配置启用条件是属性开关(enabled)不是false,且项目中引用了相关依赖。
我想认领 “为SOFA Boot增加SOFA tracer插件” 这个任务 tracer相关类: AbstractSofaTracerStatisticReporter ---执行具体的上报动作 AbstractDigestSpanEncoder ---存储要上报的内容 AbstractClientTracer聚合上述两个类,通过clientSend和clientRecieve来执行具体的发送与接受动作 思路 对于Kafka、Rocket、Rabbit、Redis、Mongo这些中间件,Spring均提供了模板类,我们可以通过代理这些模板类(如:redisTemplate、kafkaTemplate等),通过代理它的execute方法,在execute方法前后通过AbstractClientTracer的clientSend和clientRecieve来完成埋点操作,大体思路和RestTemplate的拦截类似,但不同的是我们需要手动得去实现拦截,而不能借用interceptor(暂时不确定各个模板类是否都有interceptor机制,对于有的可以和RestTemplate一样,通过interceptor实现。对于没有就只能自己编写代理类来拦截,也可以通过spring的AOP来实现)
不是这个意思哈,trace 的埋点 SOFATracer 均已完成,现在是需要在 SOFABoot 中增加自动配置。
sofa-tracer下的tracer-sofa-boot-starter模块已有相关Auto configuration,这边应该不用再集成了吧
2. 为plugin增加对应的自动配置类,自动配置启用条件是属性开关(enabled)不是false,且项目中引用了相关依赖。
这个思路是对的,BPP 可以不用同步,还是放在 SOFATracer 中吧~
@dkisser 需要的,虽然埋点已经完成,但是自动化的配置是没有的,需要让用户低成本使用。