sofastack / sofa-boot

SOFABoot is a framework that enhances Spring Boot and fully compatible with it, provides readiness check, class isolation, etc.
https://www.sofastack.tech/sofa-boot/docs/Home
Apache License 2.0
4.95k stars 1.26k forks source link

适合新手的任务列表,欢迎认领 #841

Closed alaneuler closed 1 year ago

alaneuler commented 3 years ago

申请人条件不限,申请的话可以在留言里简单说下自己的设计~

it-linnan commented 3 years ago

您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度

我是这样想的,改造HealthCheckerProcessor

  1. 在健康检查开始前,根据HealthChecker集合,打印待检查项
  2. 在调用HealthChecker.isHealthy方法时,利用CountDownLatch提供超时机制(超时时间提供默认值,支持配置)
  3. 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成
alaneuler commented 3 years ago

@it-linnan 好的,欢迎欢迎~

  1. 第一点可能还不够,SOFA 的健康检查除了 HealthChecker 还包括 HealthIndicator 的检查
  2. 同样,还需要考虑 HealthIndicator 的

可以在 issue 下面发下你的 PR,我们来 review~

seeflood commented 3 years ago

您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度

我是这样想的,改造HealthCheckerProcessor

  1. 在健康检查开始前,根据HealthChecker集合,打印待检查项
  2. 在调用HealthChecker.isHealthy方法时,利用CountDownLatch提供超时机制(超时时间提供默认值,支持配置)
  3. 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成

@alaneuler 说你思路很好~如果确定要做的话,我们把第一个issue assign给你?

it-linnan commented 3 years ago

您好,我想试试第一个任务: SOFA 健康检查日志中加入当前检查进度 我是这样想的,改造HealthCheckerProcessor

  1. 在健康检查开始前,根据HealthChecker集合,打印待检查项
  2. 在调用HealthChecker.isHealthy方法时,利用CountDownLatch提供超时机制(超时时间提供默认值,支持配置)
  3. 在调用具体组件的健康检查前后增加日志输出:xxx检查开始 xxx检查完成

@alaneuler 说你思路很好~如果确定要做的话,我们把第一个issue assign给你?

好的,确定要做,分配给我吧。

dkisser commented 3 years ago

2.支持单独配置终端日志级别

这个可以通过LoggerContext获取到对应的logger之后通过setLevel可以直接设置,但是有以下注意点:

dkisser commented 3 years ago

我想认领第二个任务

seeflood commented 3 years ago

我想认领第二个任务

棒!@dkisser 请在 #134 里回复下哈,我们好assign给你

alaneuler commented 3 years ago

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 哈~

  1. 一个 logger 的下面会有多个 appender,sofa 是通过添加一个 console appender 使得日志可以自动同时输出到终端。
  2. 得单独配置 appender 的级别,使得同一个 logger 的不同 appender 有不同的级别
  3. 配置的话,不需要考虑 log-conf.xml,因为这个 console appender 是 sofa 自动添加的

其他的思考的很棒,可以根据上面的建议再提一下~

alaneuler commented 3 years ago

@it-linnan Hi, are you still working on it?

it-linnan commented 3 years ago

@it-linnan Hi, are you still working on it?

您好,我已经提交了PR,等待review呢 Improve HealthCheck: add progress and timeout.(#837)

dkisser commented 3 years ago

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 哈~

  1. 一个 logger 的下面会有多个 appender,sofa 是通过添加一个 console appender 使得日志可以自动同时输出到终端。
  2. 得单独配置 appender 的级别,使得同一个 logger 的不同 appender 有不同的级别
  3. 配置的话,不需要考虑 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并缓存以解决此问题?

alaneuler commented 3 years ago

@dkisser setTarget 只是设置输出到 stdout 还是 stderr,并不能改 level 的吧。

可以往这两个方向看看:

你的疑问是对的,每个 logger 都需要一个 console appender,不能共用一个了。

dkisser commented 3 years ago

@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。现在我可以领取这个任务了吗?

alaneuler commented 3 years ago

@dkisser 可以的 @seeflood 第二个任务可以分配给 @dkisser 啦~

seeflood commented 3 years ago

增加了两个新任务:

keleqnma commented 3 years ago

我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:

seeflood commented 3 years ago

@alaneuler 看下哈

alaneuler commented 3 years ago

我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:

  • API发布服务: 现在ServiceClientImpl的service方法中,只检验InterfaceType非空和binding type。 增加检验instance是否实现了InterfaceType定义的接口。 代码位置:ServiceClientImpl、ServiceComponent
  • xml发布服务:
  • 注解发布服务:

嗯嗯,这个思路是 OK 的,但是可以提炼到 ServiceComponent 级别吗? 此外,关于校验开关配置有想法吗?

dkisser commented 3 years ago

我想认领 “为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来实现)

keleqnma commented 3 years ago

我想认领“SOFABoot 发布服务时 增加 interfaceType 校验”这个任务。 思路:

  • API发布服务: 现在ServiceClientImpl的service方法中,只检验InterfaceType非空和binding type。 增加检验instance是否实现了InterfaceType定义的接口。 代码位置:ServiceClientImpl、ServiceComponent
  • xml发布服务:
  • 注解发布服务:

嗯嗯,这个思路是 OK 的,但是可以提炼到 ServiceComponent 级别吗? 此外,关于校验开关配置有想法吗?

alaneuler commented 3 years ago

@keleqnma 思路可以的,有一点我提示一下:三个地方的服务发布,最终都是 new 一个 ServiceImpl 对象,该对象会持有 target(也即是 bean)和 interfaceType。

关于开关的话,可以新建一个,不用复用之前的了~

issue 中回复下,我 assign 给你。

alaneuler commented 3 years ago

我想认领 “为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 中增加自动配置。

it-linnan commented 3 years ago

您好,我想认领“为SOFA Boot增加SOFA tracer插件“

  1. 参考sofa-tracer项目,将各plugin对应的BeanPostProcessor同步到sofa-boot中;
  2. 为plugin增加对应的自动配置类,自动配置启用条件是属性开关(enabled)不是false,且项目中引用了相关依赖。
dkisser commented 3 years ago

我想认领 “为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,这边应该不用再集成了吧

alaneuler commented 3 years ago

2. 为plugin增加对应的自动配置类,自动配置启用条件是属性开关(enabled)不是false,且项目中引用了相关依赖。

这个思路是对的,BPP 可以不用同步,还是放在 SOFATracer 中吧~

alaneuler commented 3 years ago

@dkisser 需要的,虽然埋点已经完成,但是自动化的配置是没有的,需要让用户低成本使用。