Skip to content

Commit 2020042

Browse files
authored
Merge pull request #4040 from jsonwan/tenant-dev
Merge branch master into tenant-dev
2 parents 5cd4331 + 1cf9461 commit 2020042

124 files changed

Lines changed: 5918 additions & 660 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ support-files/dependJarLists/
2525
**/*.DS_Store
2626
.codecc
2727
build.yml
28-
28+
AGENTS.md
29+
CODEBUDDY.md
30+
.codebuddy/
31+
openspec/
2932

3033
pre-*-bkcodeai

src/backend/commons/cmdb-sdk/src/main/java/com/tencent/bk/job/common/cc/config/CmdbAutoConfiguration.java

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import com.tencent.bk.job.common.esb.config.AppProperties;
3737
import com.tencent.bk.job.common.esb.config.BkApiAutoConfiguration;
3838
import com.tencent.bk.job.common.esb.config.BkApiGatewayProperties;
39-
import com.tencent.bk.job.common.esb.constants.EsbLang;
4039
import com.tencent.bk.job.common.paas.user.IVirtualAdminAccountProvider;
4140
import com.tencent.bk.job.common.tenant.TenantEnvService;
4241
import com.tencent.bk.job.common.util.FlowController;
@@ -47,7 +46,6 @@
4746
import org.springframework.context.annotation.Bean;
4847
import org.springframework.context.annotation.Configuration;
4948
import org.springframework.context.annotation.Import;
50-
import org.springframework.context.annotation.Primary;
5149

5250
import java.util.concurrent.LinkedBlockingQueue;
5351
import java.util.concurrent.ThreadPoolExecutor;
@@ -95,7 +93,6 @@ public ThreadPoolExecutor cmdbLongTermThreadPoolExecutor(CmdbConfig cmdbConfig,
9593
}
9694

9795
@Bean
98-
@Primary
9996
@ConditionalOnMockCmdbApiDisabled
10097
public IBizCmdbClient bizCmdbClient(AppProperties appProperties,
10198
BkApiGatewayProperties bkApiGatewayProperties,
@@ -110,32 +107,6 @@ public IBizCmdbClient bizCmdbClient(AppProperties appProperties,
110107
appProperties,
111108
bkApiGatewayProperties,
112109
cmdbConfig,
113-
EsbLang.EN,
114-
cmdbThreadPoolExecutor,
115-
cmdbLongTermThreadPoolExecutor,
116-
flowControllerProvider.getIfAvailable(),
117-
meterRegistry,
118-
tenantEnvService,
119-
virtualAdminAccountProvider
120-
);
121-
}
122-
123-
@Bean("cnBizCmdbClient")
124-
@ConditionalOnMockCmdbApiDisabled
125-
public IBizCmdbClient cnBizCmdbClient(AppProperties appProperties,
126-
BkApiGatewayProperties bkApiGatewayProperties,
127-
CmdbConfig cmdbConfig,
128-
ThreadPoolExecutor cmdbThreadPoolExecutor,
129-
ThreadPoolExecutor cmdbLongTermThreadPoolExecutor,
130-
MeterRegistry meterRegistry,
131-
ObjectProvider<FlowController> flowControllerProvider,
132-
TenantEnvService tenantEnvService,
133-
IVirtualAdminAccountProvider virtualAdminAccountProvider) {
134-
return new BizCmdbClient(
135-
appProperties,
136-
bkApiGatewayProperties,
137-
cmdbConfig,
138-
EsbLang.CN,
139110
cmdbThreadPoolExecutor,
140111
cmdbLongTermThreadPoolExecutor,
141112
flowControllerProvider.getIfAvailable(),
@@ -185,7 +156,6 @@ public ITenantSetCmdbClient tenantSetCmdbClient(AppProperties appProperties,
185156
}
186157

187158
@Bean
188-
@Primary
189159
@ConditionalOnMockCmdbApiEnabled
190160
public IBizCmdbClient mockedBizCmdbClient(AppProperties appProperties,
191161
BkApiGatewayProperties bkApiGatewayProperties,
@@ -200,32 +170,6 @@ public IBizCmdbClient mockedBizCmdbClient(AppProperties appProperties,
200170
appProperties,
201171
bkApiGatewayProperties,
202172
cmdbConfig,
203-
EsbLang.EN,
204-
cmdbThreadPoolExecutor,
205-
cmdbLongTermThreadPoolExecutor,
206-
meterRegistry,
207-
flowControllerProvider,
208-
tenantEnvService,
209-
virtualAdminAccountProvider
210-
);
211-
}
212-
213-
@Bean("cnBizCmdbClient")
214-
@ConditionalOnMockCmdbApiEnabled
215-
public IBizCmdbClient mockedCnBizCmdbClient(AppProperties appProperties,
216-
BkApiGatewayProperties bkApiGatewayProperties,
217-
CmdbConfig cmdbConfig,
218-
ThreadPoolExecutor cmdbThreadPoolExecutor,
219-
ThreadPoolExecutor cmdbLongTermThreadPoolExecutor,
220-
MeterRegistry meterRegistry,
221-
ObjectProvider<FlowController> flowControllerProvider,
222-
TenantEnvService tenantEnvService,
223-
IVirtualAdminAccountProvider virtualAdminAccountProvider) {
224-
return new MockBizCmdbClient(
225-
appProperties,
226-
bkApiGatewayProperties,
227-
cmdbConfig,
228-
EsbLang.CN,
229173
cmdbThreadPoolExecutor,
230174
cmdbLongTermThreadPoolExecutor,
231175
meterRegistry,
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making BK-JOB蓝鲸智云作业平台 available.
3+
*
4+
* Copyright (C) 2021 Tencent. All rights reserved.
5+
*
6+
* BK-JOB蓝鲸智云作业平台 is licensed under the MIT License.
7+
*
8+
* License for BK-JOB蓝鲸智云作业平台:
9+
* --------------------------------------------------------------------
10+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
11+
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
12+
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
13+
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
16+
* the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
19+
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21+
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22+
* IN THE SOFTWARE.
23+
*/
24+
25+
package com.tencent.bk.job.common.cc.config;
26+
27+
import com.tencent.bk.job.common.cc.sdk.IBizCmdbClient;
28+
import com.tencent.bk.job.common.cc.sdk.IBizSetCmdbClient;
29+
import com.tencent.bk.job.common.cc.sdk.ITenantSetCmdbClient;
30+
import com.tencent.bk.job.common.cc.sdk.RetryableBizCmdbClient;
31+
import com.tencent.bk.job.common.cc.sdk.RetryableBizSetCmdbClient;
32+
import com.tencent.bk.job.common.cc.sdk.RetryableTenantSetCmdbClient;
33+
import com.tencent.bk.job.common.config.CircuitBreakerProperties;
34+
import com.tencent.bk.job.common.config.ExternalSystemRetryProperties;
35+
import com.tencent.bk.job.common.config.RetryProperties;
36+
import com.tencent.bk.job.common.constant.BKConstants;
37+
import com.tencent.bk.job.common.retry.ExponentialBackoffRetryPolicy;
38+
import com.tencent.bk.job.common.retry.circuitbreaker.CircuitBreakerFactory;
39+
import com.tencent.bk.job.common.retry.circuitbreaker.SystemCircuitBreakerFactory;
40+
import com.tencent.bk.job.common.retry.metrics.RetryMetricsRecorder;
41+
import io.micrometer.core.instrument.MeterRegistry;
42+
import lombok.extern.slf4j.Slf4j;
43+
import org.springframework.beans.factory.ObjectProvider;
44+
import org.springframework.beans.factory.annotation.Qualifier;
45+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
46+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
47+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
48+
import org.springframework.context.annotation.Bean;
49+
import org.springframework.context.annotation.Conditional;
50+
import org.springframework.context.annotation.Configuration;
51+
import org.springframework.context.annotation.Primary;
52+
53+
/**
54+
* CMDB 客户端重试自动配置
55+
* <p>
56+
* 当启用外部系统重试时,自动为 CMDB 客户端添加重试能力
57+
* </p>
58+
*/
59+
@Slf4j
60+
@Configuration(proxyBeanMethods = false)
61+
@EnableConfigurationProperties(ExternalSystemRetryProperties.class)
62+
@AutoConfigureAfter(CmdbAutoConfiguration.class)
63+
@Conditional(CmdbRetryCondition.class)
64+
public class CmdbRetryAutoConfiguration {
65+
66+
@Bean("cmdbCircuitBreakerFactory")
67+
@ConditionalOnMockCmdbApiDisabled
68+
public CircuitBreakerFactory cmdbCircuitBreakerFactory(ExternalSystemRetryProperties retryProperties) {
69+
CircuitBreakerProperties globalCircuitBreakerProperties = retryProperties.getGlobal().getCircuitBreaker();
70+
CircuitBreakerProperties finalCircuitBreakerProperties = globalCircuitBreakerProperties;
71+
RetryProperties cmdbRetryProperties = retryProperties.getCmdb();
72+
if (cmdbRetryProperties != null && cmdbRetryProperties.getCircuitBreaker() != null) {
73+
// 优先使用为指定系统配置的值,未配置的字段使用全局配置填充
74+
finalCircuitBreakerProperties = cmdbRetryProperties.getCircuitBreaker();
75+
finalCircuitBreakerProperties.fillDefault(globalCircuitBreakerProperties);
76+
}
77+
return new SystemCircuitBreakerFactory(BKConstants.SYSTEM_NAME_CMDB, finalCircuitBreakerProperties);
78+
}
79+
80+
@Bean
81+
@Primary
82+
@ConditionalOnBean(IBizCmdbClient.class)
83+
@ConditionalOnMockCmdbApiDisabled
84+
public IBizCmdbClient retryableBizCmdbClient(IBizCmdbClient bizCmdbClient,
85+
ExternalSystemRetryProperties retryProperties,
86+
@Qualifier("cmdbCircuitBreakerFactory")
87+
CircuitBreakerFactory circuitBreakerFactory,
88+
ObjectProvider<MeterRegistry> meterRegistryProvider) {
89+
ExponentialBackoffRetryPolicy retryPolicy = buildRetryPolicy(retryProperties);
90+
RetryMetricsRecorder metricsRecorder = buildMetricsRecorder(retryProperties, meterRegistryProvider);
91+
92+
log.info("Init RetryableBizCmdbClient");
93+
return new RetryableBizCmdbClient(bizCmdbClient, retryPolicy, metricsRecorder, circuitBreakerFactory);
94+
}
95+
96+
@Bean
97+
@Primary
98+
@ConditionalOnBean(IBizSetCmdbClient.class)
99+
public IBizSetCmdbClient retryableBizSetCmdbClient(IBizSetCmdbClient bizSetCmdbClient,
100+
ExternalSystemRetryProperties retryProperties,
101+
@Qualifier("cmdbCircuitBreakerFactory")
102+
CircuitBreakerFactory circuitBreakerFactory,
103+
ObjectProvider<MeterRegistry> meterRegistryProvider) {
104+
ExponentialBackoffRetryPolicy retryPolicy = buildRetryPolicy(retryProperties);
105+
RetryMetricsRecorder metricsRecorder = buildMetricsRecorder(retryProperties, meterRegistryProvider);
106+
107+
log.info("Init RetryableBizSetCmdbClient");
108+
return new RetryableBizSetCmdbClient(bizSetCmdbClient, retryPolicy, metricsRecorder, circuitBreakerFactory);
109+
}
110+
111+
@Bean
112+
@Primary
113+
@ConditionalOnBean(ITenantSetCmdbClient.class)
114+
@ConditionalOnMockCmdbApiDisabled
115+
public ITenantSetCmdbClient retryableTenantSetCmdbClient(ITenantSetCmdbClient tenantSetCmdbClient,
116+
ExternalSystemRetryProperties retryProperties,
117+
@Qualifier("cmdbCircuitBreakerFactory")
118+
CircuitBreakerFactory circuitBreakerFactory,
119+
ObjectProvider<MeterRegistry> meterRegistryProvider) {
120+
121+
ExponentialBackoffRetryPolicy retryPolicy = buildRetryPolicy(retryProperties);
122+
RetryMetricsRecorder metricsRecorder = buildMetricsRecorder(retryProperties, meterRegistryProvider);
123+
124+
log.info("Init RetryableTenantSetCmdbClient");
125+
return new RetryableTenantSetCmdbClient(
126+
tenantSetCmdbClient,
127+
retryPolicy,
128+
metricsRecorder,
129+
circuitBreakerFactory
130+
);
131+
}
132+
133+
private ExponentialBackoffRetryPolicy buildRetryPolicy(ExternalSystemRetryProperties retryProperties) {
134+
return ExponentialBackoffRetryPolicy.builder()
135+
.initialIntervalMs(retryProperties.getSystemInitialIntervalMs(retryProperties.getCmdb()))
136+
.maxIntervalMs(retryProperties.getSystemMaxIntervalMs(retryProperties.getCmdb()))
137+
.maxAttempts(retryProperties.getSystemMaxAttempts(retryProperties.getCmdb()))
138+
.multiplier(retryProperties.getSystemMultiplier(retryProperties.getCmdb()))
139+
.build();
140+
}
141+
142+
private RetryMetricsRecorder buildMetricsRecorder(ExternalSystemRetryProperties retryProperties,
143+
ObjectProvider<MeterRegistry> meterRegistryProvider) {
144+
return new RetryMetricsRecorder(
145+
meterRegistryProvider.getIfAvailable(),
146+
retryProperties.isMetricsEnabled(retryProperties.getCmdb())
147+
);
148+
}
149+
150+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making BK-JOB蓝鲸智云作业平台 available.
3+
*
4+
* Copyright (C) 2021 Tencent. All rights reserved.
5+
*
6+
* BK-JOB蓝鲸智云作业平台 is licensed under the MIT License.
7+
*
8+
* License for BK-JOB蓝鲸智云作业平台:
9+
* --------------------------------------------------------------------
10+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
11+
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
12+
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
13+
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
16+
* the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
19+
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21+
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22+
* IN THE SOFTWARE.
23+
*/
24+
25+
package com.tencent.bk.job.common.cc.config;
26+
27+
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
28+
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
29+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
30+
import org.springframework.context.annotation.Condition;
31+
import org.springframework.context.annotation.ConditionContext;
32+
import org.springframework.context.annotation.Conditional;
33+
import org.springframework.core.type.AnnotatedTypeMetadata;
34+
35+
import java.util.Objects;
36+
37+
/**
38+
* 开启CMDB重试的条件,满足任意一项即可:
39+
* 1.external-system.retry.cmdb.enabled配置项明确指定开启;
40+
* 2.external-system.retry.cmdb.enabled配置项未配置或值不为false,但全局配置项external-system.retry.global.enabled指定开启。
41+
*/
42+
@SuppressWarnings("unused")
43+
public class CmdbRetryCondition extends AnyNestedCondition {
44+
public CmdbRetryCondition() {
45+
super(ConfigurationPhase.PARSE_CONFIGURATION);
46+
}
47+
48+
@ConditionalOnProperty(name = "external-system.retry.cmdb.enabled", havingValue = "true")
49+
static class CmdbRetryEnabledCondition {
50+
51+
}
52+
53+
@Conditional(CmdbUseGlobalRetryCondition.class)
54+
static class GlobalRetryEnabledCondition {
55+
56+
}
57+
58+
static class CmdbUseGlobalRetryCondition extends AllNestedConditions {
59+
CmdbUseGlobalRetryCondition() {
60+
super(ConfigurationPhase.PARSE_CONFIGURATION);
61+
}
62+
63+
@ConditionalOnProperty(name = "external-system.retry.global.enabled", havingValue = "true")
64+
static class GlobalRetryEnabledCondition {
65+
66+
}
67+
68+
@Conditional(CmdbRetryNotFalseCondition.class)
69+
static class CmdbRetryNotDisabledCondition {
70+
71+
}
72+
73+
static class CmdbRetryNotFalseCondition implements Condition {
74+
@Override
75+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
76+
String enabled = context.getEnvironment().getProperty("external-system.retry.cmdb.enabled");
77+
// 配置项不存在或值不为 "false" 时返回 true
78+
return enabled == null || !Objects.equals(enabled, "false");
79+
}
80+
}
81+
82+
}
83+
}

src/backend/commons/cmdb-sdk/src/main/java/com/tencent/bk/job/common/cc/mock/MockBizCmdbClient.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ public class MockBizCmdbClient implements IBizCmdbClient {
5555
public MockBizCmdbClient(AppProperties appProperties,
5656
BkApiGatewayProperties bkApiGatewayProperties,
5757
CmdbConfig cmdbConfig,
58-
String lang,
5958
ThreadPoolExecutor cmdbThreadPoolExecutor,
6059
ThreadPoolExecutor cmdbLongTermThreadPoolExecutor,
6160
MeterRegistry meterRegistry,
@@ -66,7 +65,6 @@ public MockBizCmdbClient(AppProperties appProperties,
6665
appProperties,
6766
bkApiGatewayProperties,
6867
cmdbConfig,
69-
lang,
7068
cmdbThreadPoolExecutor,
7169
cmdbLongTermThreadPoolExecutor,
7270
flowControllerProvider.getIfAvailable(),

src/backend/commons/cmdb-sdk/src/main/java/com/tencent/bk/job/common/cc/sdk/BaseCmdbClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,12 @@ protected BaseCmdbClient(FlowController flowController,
134134
CmdbConfig cmdbConfig,
135135
MeterRegistry meterRegistry,
136136
TenantEnvService tenantEnvService,
137-
IVirtualAdminAccountProvider virtualAdminAccountProvider,
138-
String lang) {
137+
IVirtualAdminAccountProvider virtualAdminAccountProvider) {
139138
super(
140139
meterRegistry,
141140
CmdbMetricNames.CMDB_API_PREFIX,
142141
bkApiGatewayProperties.getCmdb().getUrl(),
143142
HttpHelperFactory.getLongRetryableHttpHelper(),
144-
lang,
145143
tenantEnvService
146144
);
147145
this.setLogger(LoggerFactory.getLogger(this.getClass()));
@@ -253,7 +251,7 @@ protected <R> EsbResp<R> requestCmdbApi(String tenantId,
253251
String errorMsg = "Fail to request CMDB data|method=" + method + "|uri=" + uri + "|queryParams="
254252
+ queryParams + "|body="
255253
+ JsonUtils.toJsonWithoutSkippedFields(JsonUtils.toJsonWithoutSkippedFields(reqBody));
256-
log.error(errorMsg, e);
254+
log.warn(errorMsg, e);
257255
throw new InternalCmdbException(e.getMessage(), e, ErrorCode.CMDB_API_DATA_ERROR);
258256
} finally {
259257
HttpMetricUtil.clearHttpMetric();

0 commit comments

Comments
 (0)