Skip to content

Commit 7de440f

Browse files
feat:support spring cloud version auto-detection. (#201)
* feat:support spring cloud version auto-detection. * feat:support spring cloud version auto-detection. * feat:support spring cloud version auto-detection.
1 parent 567a385 commit 7de440f

File tree

7 files changed

+747
-629
lines changed
  • polaris-agent-build/bin
  • polaris-agent-core
  • polaris-agent-examples/spring-cloud-plugins-examples/spring-cloud-2023-examples/quickstart-examples/provider
  • polaris-agent-plugins/spring-cloud-plugins/spring-cloud-plugin-common/src/main/conf/plugin/spring-cloud

7 files changed

+747
-629
lines changed

polaris-agent-build/bin/start.sh

+25-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#!/bin/bash
22

33
version=$(cat /app/version.txt)
4-
polaris_agent_dir_name="polaris-java-agent-${version}"
4+
polaris_agent_zip_name="polaris-java-agent-${version}"
5+
polaris_agent_dir_name="polaris-java-agent"
56
echo "polaris agent dir name ${polaris_agent_dir_name}"
67

78
java_agent_dir=${JAVA_AGENT_DIR}
@@ -12,13 +13,16 @@ mkdir -p ${java_agent_dir}
1213

1314
# 将 /app/lib 下的文件 copy 一份出去
1415

15-
cp -f /app/${polaris_agent_dir_name}.zip ${java_agent_dir}/
16+
cp -f /app/${polaris_agent_zip_name}.zip ${java_agent_dir}/
1617
cp -f /app/version.txt ${java_agent_dir}/
1718

1819

1920
# 这里需要将 agent 起到需要的相关信息全部注入到对应 plugin 中
2021
cd ${java_agent_dir}
21-
unzip ${polaris_agent_dir_name}.zip
22+
unzip ${polaris_agent_zip_name}.zip
23+
# 创建 polaris-java-agent 目录
24+
mkdir -p ${polaris_agent_dir_name}
25+
cp -rf ${polaris_agent_zip_name}/* ${polaris_agent_dir_name}/
2226

2327
check_string_not_empty() {
2428
local string_to_check="$1"
@@ -46,9 +50,22 @@ echo "plugins.enable=${custom_plugin_id}" > ${polaris_agent_dir_name}/conf/polar
4650

4751
# 第二步,将 plugin 所需要的配置注入到 plugin 对应的目录中去
4852
echo "inject with default config ${JAVA_AGENT_PLUGIN_CONF}"
49-
custom_plugin_properties=${JAVA_AGENT_PLUGIN_CONF}
5053
target_config_file=${polaris_agent_dir_name}/conf/plugin/spring-cloud/application.properties
51-
echo "${custom_plugin_properties}" > "${target_config_file}"
54+
if check_string_not_empty "${JAVA_AGENT_PLUGIN_CONF}"; then
55+
echo "${JAVA_AGENT_PLUGIN_CONF}" > "${target_config_file}"
56+
else
57+
echo "JAVA_AGENT_PLUGIN_CONF is empty"
58+
echo "read polaris server ip: ${POLARIS_SERVER_IP}"
59+
echo "read polaris discovery port: ${POLARIS_DISCOVER_PORT}"
60+
echo "read polaris config ip: ${POLARIS_CONFIG_IP}"
61+
echo "read polaris config port: ${POLARIS_CONFIG_PORT}"
62+
polaris_address="grpc\\\:\/\/${POLARIS_SERVER_IP}\\\:${POLARIS_DISCOVER_PORT}"
63+
polaris_config_address="grpc\\\:\/\/${POLARIS_CONFIG_IP}\\\:${POLARIS_CONFIG_PORT}"
64+
echo "read polaris address: ${polaris_address}"
65+
echo "read polaris config address: ${polaris_config_address}"
66+
sed -i "s/spring.cloud.polaris.address=grpc\\\:\/\/127.0.0.1\\\:8091/spring.cloud.polaris.address=${polaris_address}/g" ${target_config_file}
67+
sed -i "s/spring.cloud.polaris.config.address=grpc\\\:\/\/127.0.0.1\\\:8093/spring.cloud.polaris.config.address=${polaris_config_address}/g" ${target_config_file}
68+
fi
5269

5370
# 第三步,将地域信息拉取并设置进配置文件
5471
# 腾讯云不能拿到大区,因此腾讯云上的region对应的是北极星的zone,zone对应北极星的campus
@@ -66,4 +83,6 @@ zone_code=$?
6683
echo "zone is ${zone}, return code is ${zone_code}"
6784
if [ ${zone_code} -eq 0 ] && [ -n ${zone} ]; then
6885
sed -i "s/spring.cloud.tencent.metadata.content.campus=\"\"/spring.cloud.tencent.metadata.content.campus=${zone}/g" ${target_config_file}
69-
fi
86+
fi
87+
88+
cat ${target_config_file}

polaris-agent-core/polaris-agent-core-asm/src/main/java/cn/polarismesh/agent/core/asm/instrument/plugin/PluginNameFilter.java

+71
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@
1818
package cn.polarismesh.agent.core.asm.instrument.plugin;
1919

2020
import cn.polarismesh.agent.core.common.conf.ConfigManager;
21+
import cn.polarismesh.agent.core.common.logger.CommonLogger;
22+
import cn.polarismesh.agent.core.common.logger.StdoutCommonLoggerFactory;
2123
import cn.polarismesh.agent.core.common.utils.StringUtils;
24+
25+
import java.io.IOException;
2226
import java.util.Collections;
2327
import java.util.HashSet;
2428
import java.util.Set;
29+
import java.util.jar.JarFile;
30+
import java.util.jar.Manifest;
2531

2632
public class PluginNameFilter implements PluginFilter {
2733

34+
private static final CommonLogger logger = StdoutCommonLoggerFactory.INSTANCE
35+
.getLogger(PluginNameFilter.class.getCanonicalName());
36+
2837
private final Set<String> pluginNames;
2938

3039
public PluginNameFilter() {
@@ -38,6 +47,9 @@ public boolean accept(PluginJar pluginJar) {
3847

3948
private static Set<String> getLoadablePluginNames() {
4049
String enablePlugins = ConfigManager.INSTANCE.getConfigValue(ConfigManager.KEY_PLUGIN_ENABLE);
50+
logger.info("Enable plugins: " + enablePlugins);
51+
enablePlugins = appendSpringCloudPluginNameIfNeeded(enablePlugins);
52+
logger.info("Enable plugins after appendSpringCloudPluginNameIfNeeded: " + enablePlugins);
4153
if (StringUtils.isEmpty(enablePlugins)) {
4254
return Collections.emptySet();
4355
}
@@ -51,4 +63,63 @@ private static Set<String> getLoadablePluginNames() {
5163
}
5264
return values;
5365
}
66+
67+
private static String appendSpringCloudPluginNameIfNeeded(String enablePlugins) {
68+
if (StringUtils.hasText(enablePlugins)) {
69+
String[] names = enablePlugins.split(",");
70+
for (String name : names) {
71+
if (StringUtils.hasText(name) && name.contains("spring-cloud-")) {
72+
return enablePlugins;
73+
}
74+
}
75+
}
76+
77+
JarFile jarFile = null;
78+
try {
79+
String classPath = System.getProperty("java.class.path");
80+
logger.info("Class path: " + classPath);
81+
String[] paths = classPath.split(":");
82+
String mainJarPath = paths[0];
83+
logger.info("Main jar: " + mainJarPath);
84+
jarFile = new JarFile(mainJarPath);
85+
Manifest manifest = (jarFile).getManifest();
86+
String versionStr = manifest.getMainAttributes().getValue("Spring-Boot-Version");
87+
logger.info("Spring Boot Version: " + versionStr);
88+
String springCloudPluginNamePattern = "spring-cloud-%s-plugin";
89+
String springCloudVersion = "";
90+
if (versionStr.startsWith("2.2") || versionStr.startsWith("2.3")) {
91+
springCloudVersion = "hoxton";
92+
} else if (versionStr.startsWith("2.4") || versionStr.startsWith("2.5")) {
93+
springCloudVersion = "2020";
94+
} else if (versionStr.startsWith("2.6") || versionStr.startsWith("2.7")) {
95+
springCloudVersion = "2021";
96+
} else if (versionStr.startsWith("3.0") || versionStr.startsWith("3.1")) {
97+
springCloudVersion = "2022";
98+
} else if (versionStr.startsWith("3.2") || versionStr.startsWith("3.3")) {
99+
springCloudVersion = "2023";
100+
}
101+
if (StringUtils.hasText(springCloudVersion)) {
102+
String springCloudPluginName = String.format(springCloudPluginNamePattern, springCloudVersion);
103+
logger.info("Spring Cloud Version: " + springCloudVersion);
104+
if (StringUtils.hasText(enablePlugins)) {
105+
enablePlugins = enablePlugins + "," + springCloudPluginName;
106+
} else {
107+
enablePlugins = springCloudPluginName;
108+
}
109+
} else {
110+
logger.warn("No compatible Spring Cloud version found for Spring Boot version: " + versionStr);
111+
}
112+
} catch (IOException ioException) {
113+
logger.warn("Cannot get Spring Boot Version from MANIFEST.", ioException);
114+
} finally {
115+
if (jarFile != null) {
116+
try {
117+
jarFile.close();
118+
} catch (IOException ioException) {
119+
logger.warn("Cannot close jarFile", ioException);
120+
}
121+
}
122+
}
123+
return enablePlugins;
124+
}
54125
}

0 commit comments

Comments
 (0)