diff --git a/sermant-plugins/sermant-metrics/metrics-common/pom.xml b/sermant-plugins/sermant-metrics/metrics-common/pom.xml
index 5004aeb4f7..dc9bc176ed 100644
--- a/sermant-plugins/sermant-metrics/metrics-common/pom.xml
+++ b/sermant-plugins/sermant-metrics/metrics-common/pom.xml
@@ -17,7 +17,7 @@
8
8
- 4.4
+ 4.8
diff --git a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/common/Constants.java b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/common/Constants.java
index 3c0e9e90a0..4603168942 100644
--- a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/common/Constants.java
+++ b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/common/Constants.java
@@ -128,6 +128,11 @@ public class Constants {
*/
public static final int MAX_SUCCESS_CODE = 399;
+ /**
+ * 默认的HTTP失败编码
+ */
+ public static final int HTTP_DEFAULT_FAILURE_CODE = 9999;
+
/**
* 最大客户端失败编码
*/
diff --git a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/interceptor/AbstractMysqlInterceptor.java b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/interceptor/AbstractMysqlInterceptor.java
index 6533cd0bb9..da99674df5 100644
--- a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/interceptor/AbstractMysqlInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/interceptor/AbstractMysqlInterceptor.java
@@ -23,10 +23,12 @@
import com.huawei.metrics.util.ResultJudgmentUtil;
import com.huawei.metrics.util.SqlParseUtil;
+import com.huaweicloud.sermant.core.common.LoggerFactory;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor;
import java.sql.SQLException;
+import java.util.logging.Logger;
/**
* MYSQL拦截器父类
@@ -35,6 +37,11 @@
* @since 2024-01-15
*/
public abstract class AbstractMysqlInterceptor implements Interceptor {
+ /**
+ * 日志
+ */
+ public static final Logger LOGGER = LoggerFactory.getLogger();
+
@Override
public ExecuteContext after(ExecuteContext context) {
return collectMetrics(context);
@@ -58,16 +65,16 @@ public ExecuteContext onThrow(ExecuteContext context) {
*
* @param context 上下文信息
* @param enableSsl 是否开启SSL
- * @param serverIp 服务端IP
+ * @param host 服务端域名或者IP
* @param serverPort 服务端端口
* @param sql 执行的SQL
* @return 指标信息
*/
- public MetricsRpcInfo initMetricsRpcInfo(ExecuteContext context, boolean enableSsl, String serverIp,
+ public MetricsRpcInfo initMetricsRpcInfo(ExecuteContext context, boolean enableSsl, String host,
int serverPort, String sql) {
MetricsRpcInfo metricsRpcInfo = new MetricsRpcInfo();
metricsRpcInfo.setClientIp(InetAddressUtil.getHostAddress());
- metricsRpcInfo.setServerIp(serverIp);
+ metricsRpcInfo.setServerIp(InetAddressUtil.getHostAddress(host));
metricsRpcInfo.setServerPort(serverPort);
metricsRpcInfo.setProtocol(Constants.MYSQL_PROTOCOL);
metricsRpcInfo.setEnableSsl(enableSsl);
diff --git a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/InetAddressUtil.java b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/InetAddressUtil.java
index f34ab60451..3ba0b49785 100644
--- a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/InetAddressUtil.java
+++ b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/InetAddressUtil.java
@@ -19,6 +19,7 @@
import com.huaweicloud.sermant.core.common.LoggerFactory;
import com.huaweicloud.sermant.core.utils.StringUtils;
+import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
@@ -61,7 +62,8 @@ public static String getHostAddress() {
for (Enumeration inetAdd = ni.getInetAddresses();
inetAdd.hasMoreElements(); ) {
InetAddress inetAddress = inetAdd.nextElement();
- if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
+ if (!inetAddress.isLoopbackAddress() && !inetAddress.isSiteLocalAddress()
+ && inetAddress instanceof Inet4Address) {
hostAddress = inetAddress.getHostAddress();
return hostAddress;
}
@@ -75,4 +77,24 @@ public static String getHostAddress() {
}
return hostAddress;
}
+
+ /**
+ * 获取host对应的IP地址
+ *
+ * @param host 域名
+ * @return IP地址
+ */
+ public static String getHostAddress(String host) {
+ try {
+ InetAddress inetAddress = InetAddress.getByName(host);
+ String address = inetAddress.getHostAddress();
+ if (StringUtils.equals(address, "127.0.0.1")) {
+ return getHostAddress();
+ }
+ return address;
+ } catch (UnknownHostException e) {
+ LOGGER.log(Level.SEVERE, "Unable to resolve domain name to IP.");
+ return StringUtils.EMPTY;
+ }
+ }
}
diff --git a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/MysqlTablesNameFinder.java b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/MysqlTablesNameFinder.java
new file mode 100644
index 0000000000..e8d6ddab64
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/MysqlTablesNameFinder.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.util;
+
+import com.huaweicloud.sermant.core.utils.StringUtils;
+
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.alter.Alter;
+import net.sf.jsqlparser.statement.create.index.CreateIndex;
+import net.sf.jsqlparser.statement.drop.Drop;
+import net.sf.jsqlparser.util.TablesNamesFinder;
+
+/**
+ * 表名获取工具类
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class MysqlTablesNameFinder extends TablesNamesFinder {
+ private static final String INDEX_TYPE = "INDEX";
+
+ @Override
+ public void visit(Drop drop) {
+ Table table = drop.getName();
+ if (StringUtils.equals(drop.getType(), INDEX_TYPE) || table == null
+ || StringUtils.isEmpty(table.getName())) {
+ return;
+ }
+ visit(drop.getName());
+ }
+
+ @Override
+ public void visit(CreateIndex createIndex) {
+ visit(createIndex.getTable());
+ }
+
+ @Override
+ public void visit(Alter alter) {
+ visit(alter.getTable());
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/SqlParseUtil.java b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/SqlParseUtil.java
index 8f19f817bc..984aa03dea 100644
--- a/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/SqlParseUtil.java
+++ b/sermant-plugins/sermant-metrics/metrics-common/src/main/java/com/huawei/metrics/util/SqlParseUtil.java
@@ -24,9 +24,9 @@
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
-import net.sf.jsqlparser.util.TablesNamesFinder;
-import java.util.List;
+import java.util.Locale;
+import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -39,11 +39,15 @@
public class SqlParseUtil {
private static final Logger LOGGER = LoggerFactory.getLogger();
+ private static final String STATEMENT_CLASS_NAME_SUFFIX = "Statement";
+
+ private static final String STATEMENT_CLASS_NAME_PREFIX = "Plain";
+
private SqlParseUtil() {
}
/**
- * 获取mysql的API维度信息(命令类型_表名)
+ * 获取mysql的API维度信息(命令类型_表名或命令类型)
*
* @param sql 执行的SQL语句
* @return API
@@ -52,12 +56,16 @@ public static String getApi(String sql) {
StringBuilder stringBuilder = new StringBuilder();
try {
Statement statement = CCJSqlParserUtil.parse(sql);
- stringBuilder.append(statement.getClass().getSimpleName().replace("Statement", StringUtils.EMPTY));
- TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
- List tables = tablesNamesFinder.getTableList(statement);
+ String className = statement.getClass().getSimpleName();
+ String commandType = className.replace(STATEMENT_CLASS_NAME_PREFIX, StringUtils.EMPTY)
+ .replace(STATEMENT_CLASS_NAME_SUFFIX, StringUtils.EMPTY)
+ .toLowerCase(Locale.ROOT);
+ stringBuilder.append(commandType);
+ MysqlTablesNameFinder tablesNamesFinder = new MysqlTablesNameFinder();
+ Set tables = tablesNamesFinder.getTables(statement);
if (tables != null) {
for (String table : tables) {
- stringBuilder.append(Constants.CONNECT).append(table);
+ stringBuilder.append(Constants.CONNECT).append(table.toLowerCase(Locale.ROOT));
}
}
return stringBuilder.toString();
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedDeclarer.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedDeclarer.java
new file mode 100644
index 0000000000..a929a3f2f0
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedDeclarer.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.declarer;
+
+import com.huawei.metrics.interceptor.ExecutePreparedInterceptor;
+
+import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
+
+/**
+ * mariadb2.x sql执行方法拦截声明
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ExecutePreparedDeclarer extends AbstractDeclarer {
+ private static final String ENHANCE_CLASS = "org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol";
+
+ @Override
+ public ClassMatcher getClassMatcher() {
+ return ClassMatcher.nameEquals(ENHANCE_CLASS);
+ }
+
+ /**
+ * 获取插件的拦截声明 {@link org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol#prepare(String, boolean)}
+ *
+ * @param classLoader 被增强类的类加载器
+ * @return 拦截声明集
+ */
+ @Override
+ public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
+ return new InterceptDeclarer[]{InterceptDeclarer.build(MethodMatcher.nameEquals("prepare"),
+ new ExecutePreparedInterceptor())
+ };
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedQueryDeclarer.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedQueryDeclarer.java
new file mode 100644
index 0000000000..3e6d6432de
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/declarer/ExecutePreparedQueryDeclarer.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.declarer;
+
+import com.huawei.metrics.interceptor.ExecutePreparedQueryInterceptor;
+
+import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
+
+/**
+ * mariadb2.x sql执行方法拦截声明
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ExecutePreparedQueryDeclarer extends AbstractDeclarer {
+ private static final String ENHANCE_CLASS = "org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol";
+
+ @Override
+ public ClassMatcher getClassMatcher() {
+ return ClassMatcher.nameEquals(ENHANCE_CLASS);
+ }
+
+ /**
+ * 获取插件的拦截声明
+ * {@link org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol#executePreparedQuery (boolean,
+ * ServerPrepareResult, Results, ParameterHolder[])}
+ *
+ * @param classLoader 被增强类的类加载器
+ * @return 拦截声明集
+ */
+ @Override
+ public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
+ return new InterceptDeclarer[]{
+ InterceptDeclarer.build(MethodMatcher.nameEquals("executePreparedQuery"),
+ new ExecutePreparedQueryInterceptor())
+ };
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractQueryProtocolInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractQueryProtocolInterceptor.java
new file mode 100644
index 0000000000..42d5aedce3
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractQueryProtocolInterceptor.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.common.Constants;
+import com.huawei.metrics.entity.MetricsRpcInfo;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+
+import org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol;
+
+/**
+ * Mariadb2.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public abstract class AbstractQueryProtocolInterceptor extends AbstractMysqlInterceptor {
+ @Override
+ public ExecuteContext before(ExecuteContext context) {
+ context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
+ return context;
+ }
+
+ /**
+ * 创建RPC实体类
+ *
+ * @param sql SQL信息
+ * @param context 上下文信息
+ * @param latency 时延
+ * @return 指标数据
+ */
+ public MetricsRpcInfo createRpcInfo(String sql, ExecuteContext context, long latency) {
+ boolean enableSsl = false;
+ AbstractQueryProtocol protocol = (AbstractQueryProtocol) context.getObject();
+ if (protocol.getUrlParser() != null && protocol.getUrlParser() != null
+ && protocol.getUrlParser().getOptions() != null) {
+ enableSsl = protocol.getUrlParser().getOptions().useSsl;
+ }
+ MetricsRpcInfo metricsRpcInfo = initMetricsRpcInfo(context, enableSsl, protocol.getHost(), protocol.getPort(),
+ sql);
+ metricsRpcInfo.getSumLatency().getAndAdd(latency);
+ metricsRpcInfo.getLatencyList().add(latency);
+ return metricsRpcInfo;
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteBatchInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteBatchInterceptor.java
index 2e664b5da1..78fc60b6ac 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteBatchInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteBatchInterceptor.java
@@ -17,18 +17,15 @@
package com.huawei.metrics.interceptor;
import com.huawei.metrics.common.Constants;
-import com.huawei.metrics.entity.MetricsRpcInfo;
import com.huawei.metrics.manager.MetricsManager;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+import com.huaweicloud.sermant.core.utils.CollectionUtils;
import com.huaweicloud.sermant.core.utils.StringUtils;
-import org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol;
import org.mariadb.jdbc.internal.util.dao.ClientPrepareResult;
import org.mariadb.jdbc.internal.util.dao.ServerPrepareResult;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
@@ -38,7 +35,7 @@
* @author zhp
* @since 2024-01-15
*/
-public class ExecuteBatchInterceptor extends AbstractMysqlInterceptor {
+public class ExecuteBatchInterceptor extends AbstractQueryProtocolInterceptor {
private static final int SQL_PARAM_INDEX = 2;
private static final int SERVER_PREPARE_RESULT_INDEX = 1;
@@ -47,32 +44,21 @@ public class ExecuteBatchInterceptor extends AbstractMysqlInterceptor {
private static final int ENABLE_NUM = 2;
- @Override
- public ExecuteContext before(ExecuteContext context) {
- context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
- return context;
- }
-
@Override
public ExecuteContext collectMetrics(ExecuteContext context) {
- List sqlList = getSqlList(context);
- if (sqlList.isEmpty()) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (startTime == null) {
return context;
}
- AbstractQueryProtocol protocol = (AbstractQueryProtocol) context.getObject();
- if (protocol.getSocket() == null || protocol.getSocket().getLocalAddress() == null
- || protocol.getOptions() == null) {
+ List sqlList = getSqlList(context);
+ if (CollectionUtils.isEmpty(sqlList)) {
+ LOGGER.warning("Unable to obtain the SQL that needs to be executed.");
return context;
}
- long latency = System.nanoTime() - (long) context.getLocalFieldValue(Constants.START_TIME_KEY);
- long avgLatency = new BigDecimal(latency).divide(new BigDecimal(sqlList.size()), ENABLE_NUM,
- RoundingMode.HALF_UP).longValue();
+ double latency = System.nanoTime() - (long) startTime;
+ long avgLatency = Math.round(latency / sqlList.size());
for (String sql : sqlList) {
- MetricsRpcInfo metricsRpcInfo = initMetricsRpcInfo(context, protocol.getOptions().useSsl,
- protocol.getSocket().getLocalAddress().getHostAddress(), protocol.getPort(), sql);
- metricsRpcInfo.getSumLatency().getAndAdd(avgLatency);
- metricsRpcInfo.getLatencyList().add(avgLatency);
- MetricsManager.saveRpcInfo(metricsRpcInfo);
+ MetricsManager.saveRpcInfo(createRpcInfo(sql, context, avgLatency));
}
return context;
}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteInterceptor.java
index 0982e77c8f..010660fe3b 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecuteInterceptor.java
@@ -17,12 +17,11 @@
package com.huawei.metrics.interceptor;
import com.huawei.metrics.common.Constants;
-import com.huawei.metrics.entity.MetricsRpcInfo;
import com.huawei.metrics.manager.MetricsManager;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+import com.huaweicloud.sermant.core.utils.StringUtils;
-import org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol;
import org.mariadb.jdbc.internal.util.dao.ClientPrepareResult;
/**
@@ -31,17 +30,15 @@
* @author zhp
* @since 2024-01-15
*/
-public class ExecuteInterceptor extends AbstractMysqlInterceptor {
+public class ExecuteInterceptor extends AbstractQueryProtocolInterceptor {
private static final int SQL_PARAM_INDEX = 2;
- @Override
- public ExecuteContext before(ExecuteContext context) {
- context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
- return context;
- }
-
@Override
public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (startTime == null) {
+ return context;
+ }
String sql = null;
if (context.getArguments()[SQL_PARAM_INDEX] instanceof String) {
sql = (String) context.getArguments()[SQL_PARAM_INDEX];
@@ -49,17 +46,12 @@ public ExecuteContext collectMetrics(ExecuteContext context) {
ClientPrepareResult clientPrepareResult = (ClientPrepareResult) context.getArguments()[SQL_PARAM_INDEX];
sql = clientPrepareResult.getSql();
}
- AbstractQueryProtocol protocol = (AbstractQueryProtocol) context.getObject();
- if (protocol.getSocket() == null || protocol.getSocket().getLocalAddress() == null
- || protocol.getOptions() == null) {
+ if (StringUtils.isEmpty(sql)) {
+ LOGGER.warning("Unable to obtain the SQL that needs to be executed.");
return context;
}
- MetricsRpcInfo metricsRpcInfo = initMetricsRpcInfo(context, protocol.getOptions().useSsl,
- protocol.getSocket().getLocalAddress().getHostAddress(), protocol.getPort(), sql);
- long latency = System.nanoTime() - (long) context.getLocalFieldValue(Constants.START_TIME_KEY);
- metricsRpcInfo.getSumLatency().getAndAdd(latency);
- metricsRpcInfo.getLatencyList().add(latency);
- MetricsManager.saveRpcInfo(metricsRpcInfo);
+ long latency = System.nanoTime() - (long) startTime;
+ MetricsManager.saveRpcInfo(createRpcInfo(sql, context, latency));
return context;
}
}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedInterceptor.java
new file mode 100644
index 0000000000..a06b155109
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedInterceptor.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.common.Constants;
+import com.huawei.metrics.manager.MetricsManager;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+
+/**
+ * Mariadb2.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ExecutePreparedInterceptor extends AbstractQueryProtocolInterceptor {
+ @Override
+ public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (context.getArguments()[0] == null || startTime == null) {
+ return context;
+ }
+ String sql = (String) context.getArguments()[0];
+ long latency = System.nanoTime() - (long) startTime;
+ MetricsManager.saveRpcInfo(createRpcInfo(sql, context, latency));
+ return context;
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedQueryInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedQueryInterceptor.java
new file mode 100644
index 0000000000..20041737ea
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/java/com/huawei/metrics/interceptor/ExecutePreparedQueryInterceptor.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.common.Constants;
+import com.huawei.metrics.manager.MetricsManager;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+import com.huaweicloud.sermant.core.utils.StringUtils;
+
+import org.mariadb.jdbc.internal.util.dao.ServerPrepareResult;
+
+/**
+ * Mariadb2.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ExecutePreparedQueryInterceptor extends AbstractQueryProtocolInterceptor {
+ @Override
+ public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (context.getArguments()[1] == null || startTime == null) {
+ return context;
+ }
+ ServerPrepareResult serverPrepareResult = (ServerPrepareResult) context.getArguments()[1];
+ String sql = serverPrepareResult.getSql();
+ if (StringUtils.isEmpty(sql)) {
+ LOGGER.warning("Unable to obtain the SQL that needs to be executed.");
+ return context;
+ }
+ long latency = System.nanoTime() - (long) startTime;
+ MetricsManager.saveRpcInfo(createRpcInfo(sql, context, latency));
+ return context;
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
index d3734fc155..7761c7a429 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb2.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
@@ -15,4 +15,6 @@
#
#
com.huawei.metrics.declarer.ExecuteBatchDeclarer
-com.huawei.metrics.declarer.ExecuteDeclarer
\ No newline at end of file
+com.huawei.metrics.declarer.ExecuteDeclarer
+com.huawei.metrics.declarer.ExecutePreparedDeclarer
+com.huawei.metrics.declarer.ExecutePreparedQueryDeclarer
\ No newline at end of file
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/ReplayClientDeclarer.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/ReplayClientDeclarer.java
new file mode 100644
index 0000000000..fa68fe87ee
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/ReplayClientDeclarer.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.declarer;
+
+import com.huawei.metrics.interceptor.ReplayClientInterceptor;
+
+import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
+
+/**
+ * mariadb3.x SQL事务重播方法拦截声明
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ReplayClientDeclarer extends AbstractDeclarer {
+ private static final String ENHANCE_CLASS = "org.mariadb.jdbc.client.impl.ReplayClient";
+
+ @Override
+ public ClassMatcher getClassMatcher() {
+ return ClassMatcher.nameEquals(ENHANCE_CLASS);
+ }
+
+ @Override
+ public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
+ return new InterceptDeclarer[]{InterceptDeclarer.build(MethodMatcher.nameEquals("transactionReplay"),
+ new ReplayClientInterceptor())
+ };
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientDeclarer.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecuteDeclarer.java
similarity index 80%
rename from sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientDeclarer.java
rename to sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecuteDeclarer.java
index 6c6cf9c38b..3995b8fb2c 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientDeclarer.java
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecuteDeclarer.java
@@ -16,33 +16,33 @@
package com.huawei.metrics.declarer;
-import com.huawei.metrics.interceptor.StandardClientInterceptor;
+import com.huawei.metrics.interceptor.StandardClientExecuteInterceptor;
import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
/**
- * 链接方法拦截声明
+ * mariadb3.x SQL执行方法拦截声明
*
* @author zhp
* @since 2024-01-15
*/
-public class StandardClientDeclarer extends AbstractDeclarer {
+public class StandardClientExecuteDeclarer extends AbstractDeclarer {
private static final String ENHANCE_CLASS = "org.mariadb.jdbc.client.impl.StandardClient";
- private static final int PARAM_COUNT = 1;
+ private static final int PARAM_COUNT = 8;
@Override
public ClassMatcher getClassMatcher() {
- return ClassMatcher.isExtendedFrom(ENHANCE_CLASS);
+ return ClassMatcher.nameEquals(ENHANCE_CLASS);
}
@Override
public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
return new InterceptDeclarer[]{
- InterceptDeclarer.build(MethodMatcher.nameEquals("sendQuery")
- .and(MethodMatcher.paramCountEquals(PARAM_COUNT)), new StandardClientInterceptor())
+ InterceptDeclarer.build(MethodMatcher.nameEquals("execute")
+ .and(MethodMatcher.paramCountEquals(PARAM_COUNT)), new StandardClientExecuteInterceptor())
};
}
}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecutePipelineDeclarer.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecutePipelineDeclarer.java
new file mode 100644
index 0000000000..2eb7b1dadb
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/declarer/StandardClientExecutePipelineDeclarer.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.declarer;
+
+import com.huawei.metrics.interceptor.StandardClientExecutePipelineInterceptor;
+
+import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
+import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
+
+/**
+ * mariadb3.x SQL批量执行方法拦截声明
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class StandardClientExecutePipelineDeclarer extends AbstractDeclarer {
+ private static final String ENHANCE_CLASS = "org.mariadb.jdbc.client.impl.StandardClient";
+
+ @Override
+ public ClassMatcher getClassMatcher() {
+ return ClassMatcher.nameEquals(ENHANCE_CLASS);
+ }
+
+ @Override
+ public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
+ return new InterceptDeclarer[]{
+ InterceptDeclarer.build(MethodMatcher.nameEquals("executePipeline"),
+ new StandardClientExecutePipelineInterceptor())
+ };
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractStandardClientExecuteInterceptor.java
similarity index 70%
rename from sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientInterceptor.java
rename to sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractStandardClientExecuteInterceptor.java
index fa296b3a93..12aee1189e 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractStandardClientExecuteInterceptor.java
@@ -16,7 +16,6 @@
package com.huawei.metrics.interceptor;
-import com.huawei.metrics.common.Constants;
import com.huawei.metrics.entity.MetricsRpcInfo;
import com.huawei.metrics.manager.MetricsManager;
@@ -26,31 +25,25 @@
import org.mariadb.jdbc.HostAddress;
import org.mariadb.jdbc.client.impl.StandardClient;
import org.mariadb.jdbc.export.SslMode;
-import org.mariadb.jdbc.message.ClientMessage;
/**
- * mysql-connector-java8.0 SQL执行增强器
+ * mariadb3.x SQL执行增强器
*
* @author zhp
* @since 2024-01-15
*/
-public class StandardClientInterceptor extends AbstractMysqlInterceptor {
- private static final int PARAM_COUNT = 1;
-
- @Override
- public ExecuteContext before(ExecuteContext context) {
- context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
- return context;
- }
-
- @Override
- public ExecuteContext collectMetrics(ExecuteContext context) {
- if (context.getArguments()[0] == null) {
- return context;
- }
- ClientMessage message = (ClientMessage) context.getArguments()[0];
- String sql = message.description();
+public abstract class AbstractStandardClientExecuteInterceptor extends AbstractMysqlInterceptor {
+ /**
+ * 保存指标数据
+ *
+ * @param context 上下文信息
+ * @param sql sql信息
+ * @param latency 时延
+ * @return 上下文信息
+ */
+ public ExecuteContext saveMetricInfo(ExecuteContext context, String sql, long latency) {
if (StringUtils.isEmpty(sql)) {
+ LOGGER.warning("Unable to obtain the SQL that needs to be executed.");
return context;
}
StandardClient client = (StandardClient) context.getObject();
@@ -61,7 +54,6 @@ public ExecuteContext collectMetrics(ExecuteContext context) {
&& client.getContext().getConf().sslMode() != SslMode.DISABLE;
HostAddress hostAddress = client.getHostAddress();
MetricsRpcInfo metricsRpcInfo = initMetricsRpcInfo(context, enableSsl, hostAddress.host, hostAddress.port, sql);
- long latency = System.nanoTime() - (long) context.getLocalFieldValue(Constants.START_TIME_KEY);
metricsRpcInfo.getSumLatency().getAndAdd(latency);
metricsRpcInfo.getLatencyList().add(latency);
MetricsManager.saveRpcInfo(metricsRpcInfo);
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/ReplayClientInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/ReplayClientInterceptor.java
new file mode 100644
index 0000000000..eb823358a0
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/ReplayClientInterceptor.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.common.Constants;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+
+import org.mariadb.jdbc.client.impl.TransactionSaver;
+import org.mariadb.jdbc.message.client.RedoableClientMessage;
+import org.mariadb.jdbc.message.client.RedoableWithPrepareClientMessage;
+
+/**
+ * mariadb3.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class ReplayClientInterceptor extends AbstractStandardClientExecuteInterceptor {
+ @Override
+ public ExecuteContext before(ExecuteContext context) {
+ context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
+ return context;
+ }
+
+ @Override
+ public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (context.getArguments()[0] == null || startTime == null) {
+ return context;
+ }
+ TransactionSaver transactionSaver = (TransactionSaver) context.getArguments()[0];
+ int length = transactionSaver.getIdx();
+ if (length == 0) {
+ return context;
+ }
+ double latency = System.nanoTime() - (long) startTime;
+ long avgLatency = Math.round(latency / length);
+ for (int i = 0; i < length; i++) {
+ RedoableClientMessage querySaver = transactionSaver.getBuffers()[i];
+ RedoableWithPrepareClientMessage message = (RedoableWithPrepareClientMessage) querySaver;
+ String sql = message.getCommand();
+ saveMetricInfo(context, sql, avgLatency);
+ }
+ return context;
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecuteInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecuteInterceptor.java
new file mode 100644
index 0000000000..79fc0b315d
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecuteInterceptor.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.common.Constants;
+import com.huawei.metrics.util.ThreadMetricsUtil;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+
+import org.mariadb.jdbc.message.ClientMessage;
+
+/**
+ * mariadb3.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class StandardClientExecuteInterceptor extends AbstractStandardClientExecuteInterceptor {
+ @Override
+ public ExecuteContext before(ExecuteContext context) {
+ context.setLocalFieldValue(Constants.START_TIME_KEY, System.nanoTime());
+ return context;
+ }
+
+ @Override
+ public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (context.getArguments()[0] == null || ThreadMetricsUtil.getStartTime() != null || startTime == null) {
+ return context;
+ }
+ ClientMessage message = (ClientMessage) context.getArguments()[0];
+ String sql = message.description();
+ long latency = System.nanoTime() - (long) startTime;
+ return saveMetricInfo(context, sql, latency);
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecutePipelineInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecutePipelineInterceptor.java
new file mode 100644
index 0000000000..8aa4d60f41
--- /dev/null
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/java/com/huawei/metrics/interceptor/StandardClientExecutePipelineInterceptor.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2024-2024 Huawei Technologies Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.huawei.metrics.interceptor;
+
+import com.huawei.metrics.util.ThreadMetricsUtil;
+
+import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+
+import org.mariadb.jdbc.message.ClientMessage;
+
+/**
+ * mariadb3.x SQL执行增强器
+ *
+ * @author zhp
+ * @since 2024-01-15
+ */
+public class StandardClientExecutePipelineInterceptor extends AbstractStandardClientExecuteInterceptor {
+ @Override
+ public ExecuteContext before(ExecuteContext context) {
+ ThreadMetricsUtil.setStartTime(System.nanoTime());
+ return context;
+ }
+
+ @Override
+ public ExecuteContext collectMetrics(ExecuteContext context) {
+ Long startTime = ThreadMetricsUtil.getStartTime();
+ ThreadMetricsUtil.removeStartTime();
+ if (context.getArguments()[0] == null || startTime == null) {
+ return context;
+ }
+ ClientMessage[] clientMessages = (ClientMessage[]) context.getArguments()[0];
+ if (clientMessages.length == 0) {
+ return context;
+ }
+ double latency = System.nanoTime() - startTime;
+ long avgLatency = Math.round(latency / clientMessages.length);
+ for (ClientMessage clientMessage : clientMessages) {
+ String sql = clientMessage.description();
+ saveMetricInfo(context, sql, avgLatency);
+ }
+ return context;
+ }
+}
diff --git a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
index f4161c818f..d6b6fb991b 100644
--- a/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
+++ b/sermant-plugins/sermant-metrics/metrics-mariadb3.x-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer
@@ -14,4 +14,6 @@
# limitations under the License.
#
#
-com.huawei.metrics.declarer.StandardClientDeclarer
\ No newline at end of file
+com.huawei.metrics.declarer.StandardClientExecuteDeclarer
+com.huawei.metrics.declarer.StandardClientExecutePipelineDeclarer
+com.huawei.metrics.declarer.ReplayClientDeclarer
\ No newline at end of file
diff --git a/sermant-plugins/sermant-metrics/metrics-mysql8.x-plugin/src/main/java/com/huawei/metrics/interceptor/NativeSessionInterceptor.java b/sermant-plugins/sermant-metrics/metrics-mysql8.x-plugin/src/main/java/com/huawei/metrics/interceptor/NativeSessionInterceptor.java
index d80c6c7c5c..d0a22e7359 100644
--- a/sermant-plugins/sermant-metrics/metrics-mysql8.x-plugin/src/main/java/com/huawei/metrics/interceptor/NativeSessionInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-mysql8.x-plugin/src/main/java/com/huawei/metrics/interceptor/NativeSessionInterceptor.java
@@ -21,6 +21,7 @@
import com.huawei.metrics.manager.MetricsManager;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
+import com.huaweicloud.sermant.core.utils.StringUtils;
import com.mysql.cj.NativeSession;
import com.mysql.cj.conf.HostInfo;
@@ -41,6 +42,10 @@ public ExecuteContext before(ExecuteContext context) {
@Override
public ExecuteContext collectMetrics(ExecuteContext context) {
+ Object startTime = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (startTime == null) {
+ return context;
+ }
String sql;
Object object = context.getArguments()[0];
if (object instanceof JdbcPreparedStatement) {
@@ -48,11 +53,19 @@ public ExecuteContext collectMetrics(ExecuteContext context) {
} else {
sql = (String) context.getArguments()[1];
}
+ if (StringUtils.isEmpty(sql)) {
+ LOGGER.warning("Unable to obtain the SQL that needs to be executed.");
+ return context;
+ }
NativeSession nativeSession = (NativeSession) context.getObject();
HostInfo hostInfo = nativeSession.getHostInfo();
+ if (hostInfo == null) {
+ LOGGER.warning("Unable to obtain host information for database.");
+ return context;
+ }
MetricsRpcInfo metricsRpcInfo = initMetricsRpcInfo(context, nativeSession.isSSLEstablished(),
- nativeSession.getProcessHost(), hostInfo.getPort(), sql);
- long latency = System.nanoTime() - (long) context.getLocalFieldValue(Constants.START_TIME_KEY);
+ hostInfo.getHost(), hostInfo.getPort(), sql);
+ long latency = System.nanoTime() - (long) startTime;
metricsRpcInfo.getSumLatency().getAndAdd(latency);
metricsRpcInfo.getLatencyList().add(latency);
MetricsManager.saveRpcInfo(metricsRpcInfo);
diff --git a/sermant-plugins/sermant-metrics/metrics-service/pom.xml b/sermant-plugins/sermant-metrics/metrics-service/pom.xml
index 52b0ff7534..edad751e02 100644
--- a/sermant-plugins/sermant-metrics/metrics-service/pom.xml
+++ b/sermant-plugins/sermant-metrics/metrics-service/pom.xml
@@ -29,12 +29,6 @@
${project.version}
provided
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
junit
diff --git a/sermant-plugins/sermant-metrics/metrics-service/src/main/java/com/huawei/metrics/service/MetricsService.java b/sermant-plugins/sermant-metrics/metrics-service/src/main/java/com/huawei/metrics/service/MetricsService.java
index a980d23009..e9b388c758 100644
--- a/sermant-plugins/sermant-metrics/metrics-service/src/main/java/com/huawei/metrics/service/MetricsService.java
+++ b/sermant-plugins/sermant-metrics/metrics-service/src/main/java/com/huawei/metrics/service/MetricsService.java
@@ -27,8 +27,6 @@
import com.huaweicloud.sermant.core.utils.StringUtils;
import com.huaweicloud.sermant.core.utils.ThreadFactoryUtils;
-import com.alibaba.fastjson.JSONObject;
-
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
@@ -145,8 +143,7 @@ private void reportData(RandomAccessFile raf) throws IOException {
Map rpcInfoMap = new HashMap<>();
StringBuilder stringBuilder = new StringBuilder();
for (Entry entry : MetricsManager.getRpcInfoMap().entrySet()) {
- MetricsRpcInfo metricsRpcInfo = JSONObject.parseObject(JSONObject.toJSONString(entry.getValue()),
- MetricsRpcInfo.class);
+ MetricsRpcInfo metricsRpcInfo = copyRpcInfo(entry.getValue());
if (metricsRpcInfo.getReqCount().get() == 0 || metricsRpcInfo.getResponseCount().get() == 0
|| metricsRpcInfo.getSumLatency().get() == 0) {
continue;
@@ -317,4 +314,36 @@ private String getLatencyHistogram(List latencyList) {
}
return latencyHistogram.toString();
}
+
+ /**
+ * 数据拷贝
+ *
+ * @param metricsRpcInfo 指标数据
+ * @return 指标数据信息
+ */
+ private MetricsRpcInfo copyRpcInfo(MetricsRpcInfo metricsRpcInfo) {
+ MetricsRpcInfo targetRpcInfo = new MetricsRpcInfo();
+ targetRpcInfo.setProcessId(metricsRpcInfo.getProcessId());
+ targetRpcInfo.setClientIp(metricsRpcInfo.getClientIp());
+ targetRpcInfo.setServerIp(metricsRpcInfo.getServerIp());
+ targetRpcInfo.setServerPort(metricsRpcInfo.getServerPort());
+ targetRpcInfo.setL4Role(metricsRpcInfo.getL4Role());
+ targetRpcInfo.setL7Role(metricsRpcInfo.getL7Role());
+ targetRpcInfo.setProtocol(metricsRpcInfo.getProtocol());
+ targetRpcInfo.setContainerId(metricsRpcInfo.getContainerId());
+ targetRpcInfo.setComm(metricsRpcInfo.getComm());
+ targetRpcInfo.setPodName(metricsRpcInfo.getPodName());
+ targetRpcInfo.setPodIp(metricsRpcInfo.getPodIp());
+ targetRpcInfo.setEnableSsl(metricsRpcInfo.isEnableSsl());
+ targetRpcInfo.setMachineId(metricsRpcInfo.getMachineId());
+ targetRpcInfo.setUrl(metricsRpcInfo.getUrl());
+ targetRpcInfo.getReqCount().set(metricsRpcInfo.getReqCount().get());
+ targetRpcInfo.getResponseCount().set(metricsRpcInfo.getResponseCount().get());
+ targetRpcInfo.getSumLatency().set(metricsRpcInfo.getSumLatency().get());
+ targetRpcInfo.getReqErrorCount().set(metricsRpcInfo.getReqErrorCount().get());
+ targetRpcInfo.getClientErrorCount().set(metricsRpcInfo.getClientErrorCount().get());
+ targetRpcInfo.getServerErrorCount().set(metricsRpcInfo.getServerErrorCount().get());
+ targetRpcInfo.getLatencyList().addAll(metricsRpcInfo.getLatencyList());
+ return targetRpcInfo;
+ }
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/httpurlconnection/ConnectDeclarer.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/httpurlconnection/ConnectDeclarer.java
index c6e66d092b..11361a894e 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/httpurlconnection/ConnectDeclarer.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/httpurlconnection/ConnectDeclarer.java
@@ -30,11 +30,11 @@
* @since 2023-12-15
*/
public class ConnectDeclarer extends AbstractDeclarer {
- private static final String ENHANCE_CLASS = "sun.net.www.protocol.http.HttpURLConnection";
+ private static final String ENHANCE_CLASS = "java.net.HttpURLConnection";
@Override
public ClassMatcher getClassMatcher() {
- return ClassMatcher.nameEquals(ENHANCE_CLASS);
+ return ClassMatcher.isExtendedFrom(ENHANCE_CLASS);
}
@Override
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/okhttp/CallDeclarer.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/okhttp/CallDeclarer.java
index 6aed99a40a..e9a78a58c4 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/okhttp/CallDeclarer.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/declarer/okhttp/CallDeclarer.java
@@ -23,6 +23,8 @@
import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher;
import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher;
+import com.squareup.okhttp.Request;
+
/**
* okhttp2.x服务调用拦截声明
*
@@ -30,18 +32,25 @@
* @since 2023-12-15
*/
public class CallDeclarer extends AbstractDeclarer {
- private static final String ENHANCE_CLASS = "com.squareup.okhttp.Call";
+ private static final String ENHANCE_CLASS = "com.squareup.okhttp.Call$ApplicationInterceptorChain";
@Override
public ClassMatcher getClassMatcher() {
return ClassMatcher.nameEquals(ENHANCE_CLASS);
}
+ /**
+ * 获取插件的拦截声明
+ * {@link com.squareup.okhttp.Call.ApplicationInterceptorChain#proceed(Request)}}
+ *
+ * @param classLoader 被增强类的类加载器
+ * @return 拦截声明集
+ */
@Override
public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {
return new InterceptDeclarer[]{
- InterceptDeclarer.build(MethodMatcher.nameEquals("getResponseWithInterceptorChain"),
- new CallInterceptor())
+ InterceptDeclarer.build(MethodMatcher.nameEquals("proceed")
+ .and(MethodMatcher.paramTypesEqual("com.squareup.okhttp.Request")), new CallInterceptor())
};
}
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractHttpInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractHttpInterceptor.java
index d8c33c5c57..1f1e391012 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractHttpInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/AbstractHttpInterceptor.java
@@ -19,14 +19,15 @@
import com.huawei.metrics.common.Constants;
import com.huawei.metrics.common.ResultType;
import com.huawei.metrics.entity.MetricsRpcInfo;
+import com.huawei.metrics.util.InetAddressUtil;
import com.huawei.metrics.util.ResultJudgmentUtil;
+import com.huaweicloud.sermant.core.common.LoggerFactory;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor;
-import java.net.InetAddress;
import java.net.URL;
-import java.net.UnknownHostException;
+import java.util.logging.Logger;
/**
* Http拦截器父类
@@ -35,8 +36,13 @@
* @since 2023-12-15
*/
public abstract class AbstractHttpInterceptor implements Interceptor {
+ /**
+ * 日志
+ */
+ public static final Logger LOGGER = LoggerFactory.getLogger();
+
@Override
- public ExecuteContext after(ExecuteContext context) throws Exception {
+ public ExecuteContext after(ExecuteContext context) {
return collectMetrics(context);
}
@@ -45,9 +51,8 @@ public ExecuteContext after(ExecuteContext context) throws Exception {
*
* @param context 上下文信息
* @return ExecuteContext 上下文信息
- * @throws Exception 指标采集异常
*/
- public abstract ExecuteContext collectMetrics(ExecuteContext context) throws Exception;
+ public abstract ExecuteContext collectMetrics(ExecuteContext context);
@Override
public ExecuteContext onThrow(ExecuteContext context) {
@@ -62,13 +67,11 @@ public ExecuteContext onThrow(ExecuteContext context) {
* @param latency 时延
* @param statusCode 结果编码
* @return 指标数据
- * @throws UnknownHostException 未知域名异常
*/
- public MetricsRpcInfo initMetricsInfo(URL url, boolean enableSsl, long latency, int statusCode)
- throws UnknownHostException {
+ public MetricsRpcInfo initMetricsInfo(URL url, boolean enableSsl, long latency, int statusCode) {
MetricsRpcInfo metricsRpcInfo = new MetricsRpcInfo();
- metricsRpcInfo.setClientIp(InetAddress.getLocalHost().getHostAddress());
- metricsRpcInfo.setServerIp(url.getHost());
+ metricsRpcInfo.setClientIp(InetAddressUtil.getHostAddress());
+ metricsRpcInfo.setServerIp(InetAddressUtil.getHostAddress(url.getHost()));
metricsRpcInfo.setServerPort(url.getPort());
metricsRpcInfo.setProtocol(url.getProtocol());
metricsRpcInfo.setEnableSsl(enableSsl);
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpclient/HttpClientInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpclient/HttpClientInterceptor.java
index 246c6469a8..cbf95abb72 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpclient/HttpClientInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpclient/HttpClientInterceptor.java
@@ -28,7 +28,10 @@
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
+import java.io.IOException;
import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.logging.Level;
/**
* HttpClient请求发送增强器
@@ -44,20 +47,38 @@ public ExecuteContext before(ExecuteContext context) {
}
@Override
- public ExecuteContext collectMetrics(ExecuteContext context) throws Exception {
+ public ExecuteContext collectMetrics(ExecuteContext context) {
HttpHost httpHost = (HttpHost) context.getArguments()[0];
HttpRequest httpRequest = (HttpRequest) context.getArguments()[1];
HttpResponse httpResponse = (HttpResponse) context.getResult();
- if (context.getLocalFieldValue(Constants.START_TIME_KEY) == null || httpRequest.getRequestLine() == null
- || httpResponse.getStatusLine() == null) {
+ Object object = context.getLocalFieldValue(Constants.START_TIME_KEY);
+ if (object == null || httpRequest.getRequestLine() == null) {
return context;
}
- URI uri = new URI(httpRequest.getRequestLine().getUri());
- long latency = System.nanoTime() - (Long) context.getLocalFieldValue(Constants.START_TIME_KEY);
- int statusCode = httpResponse.getStatusLine().getStatusCode();
- boolean enableSsl = StringUtils.equals(httpHost.getSchemeName(), Constants.HTTPS_PROTOCOL);
- MetricsRpcInfo metricsRpcInfo = initMetricsInfo(uri.toURL(), enableSsl, latency, statusCode);
- MetricsManager.saveRpcInfo(metricsRpcInfo);
- return context;
+ try {
+ URI uri = new URI(httpRequest.getRequestLine().getUri());
+ long latency = System.nanoTime() - (Long) object;
+ int statusCode = getResponseCode(httpResponse);
+ boolean enableSsl = StringUtils.equals(httpHost.getSchemeName(), Constants.HTTPS_PROTOCOL);
+ MetricsRpcInfo metricsRpcInfo = initMetricsInfo(uri.toURL(), enableSsl, latency, statusCode);
+ MetricsManager.saveRpcInfo(metricsRpcInfo);
+ return context;
+ } catch (IOException | URISyntaxException e) {
+ LOGGER.log(Level.SEVERE, "Unable to obtain requested URL information.", e);
+ return context;
+ }
+ }
+
+ /**
+ * 获取响应编码
+ *
+ * @param httpResponse 响应信息
+ * @return 响应编码
+ */
+ private int getResponseCode(HttpResponse httpResponse) {
+ if (httpResponse == null || httpResponse.getStatusLine() == null) {
+ return Constants.HTTP_DEFAULT_FAILURE_CODE;
+ }
+ return httpResponse.getStatusLine().getStatusCode();
}
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpurlconnection/DisconnectorInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpurlconnection/DisconnectorInterceptor.java
index 0e35f5b4af..6ef78ada26 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpurlconnection/DisconnectorInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/httpurlconnection/DisconnectorInterceptor.java
@@ -25,6 +25,7 @@
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.utils.StringUtils;
+import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -41,20 +42,35 @@ public ExecuteContext before(ExecuteContext context) {
}
@Override
- public ExecuteContext collectMetrics(ExecuteContext context) throws Exception {
+ public ExecuteContext collectMetrics(ExecuteContext context) {
if (ThreadMetricsUtil.getStartTime() == null) {
return context;
}
HttpURLConnection httpUrlConnection = (HttpURLConnection) context.getObject();
URL url = httpUrlConnection.getURL();
if (url == null) {
+ ThreadMetricsUtil.removeStartTime();
return context;
}
boolean enableSsl = StringUtils.equals(url.getProtocol(), Constants.HTTPS_PROTOCOL);
- long latency = System.nanoTime() - (long) ThreadMetricsUtil.getStartTime();
- MetricsRpcInfo metricsRpcInfo = initMetricsInfo(url, enableSsl, latency, httpUrlConnection.getResponseCode());
+ long latency = System.nanoTime() - ThreadMetricsUtil.getStartTime();
+ MetricsRpcInfo metricsRpcInfo = initMetricsInfo(url, enableSsl, latency, getResponseCode(httpUrlConnection));
MetricsManager.saveRpcInfo(metricsRpcInfo);
ThreadMetricsUtil.removeStartTime();
return context;
}
+
+ /**
+ * 获取响应编码
+ *
+ * @param httpUrlConnection 请求链接
+ * @return 响应编码
+ */
+ private int getResponseCode(HttpURLConnection httpUrlConnection) {
+ try {
+ return httpUrlConnection.getResponseCode();
+ } catch (IOException e) {
+ return Constants.HTTP_DEFAULT_FAILURE_CODE;
+ }
+ }
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp/CallInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp/CallInterceptor.java
index 31bfe21208..5ff24c1d2a 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp/CallInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp/CallInterceptor.java
@@ -40,14 +40,17 @@ public ExecuteContext before(ExecuteContext context) {
}
@Override
- public ExecuteContext collectMetrics(ExecuteContext context) throws Exception {
+ public ExecuteContext collectMetrics(ExecuteContext context) {
Response response = (Response) context.getResult();
- if (response == null || response.request() == null) {
- return context;
+ Request request = (Request) context.getArguments()[0];
+ int statusCode;
+ if (response == null) {
+ statusCode = Constants.HTTP_DEFAULT_FAILURE_CODE;
+ } else {
+ statusCode = response.code();
}
- Request request = response.request();
long latency = System.nanoTime() - (Long) context.getLocalFieldValue(Constants.START_TIME_KEY);
- MetricsRpcInfo metricsRpcInfo = initMetricsInfo(request.url(), request.isHttps(), latency, response.code());
+ MetricsRpcInfo metricsRpcInfo = initMetricsInfo(request.url(), request.isHttps(), latency, statusCode);
MetricsManager.saveRpcInfo(metricsRpcInfo);
return context;
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp3/CallInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp3/CallInterceptor.java
index 3e0719c6b5..3945e394a4 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp3/CallInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/okhttp3/CallInterceptor.java
@@ -43,13 +43,19 @@ public ExecuteContext before(ExecuteContext context) {
}
@Override
- public ExecuteContext collectMetrics(ExecuteContext context) throws Exception {
+ public ExecuteContext collectMetrics(ExecuteContext context) {
Call realCall = (Call) context.getObject();
Request request = realCall.request();
URL url = request.url().url();
long latency = System.nanoTime() - (Long) context.getLocalFieldValue(Constants.START_TIME_KEY);
Response response = (Response) context.getResult();
- MetricsRpcInfo metricsRpcInfo = initMetricsInfo(url, request.url().isHttps(), latency, response.code());
+ int statusCode;
+ if (response == null) {
+ statusCode = Constants.HTTP_DEFAULT_FAILURE_CODE;
+ } else {
+ statusCode = response.code();
+ }
+ MetricsRpcInfo metricsRpcInfo = initMetricsInfo(url, request.url().isHttps(), latency, statusCode);
MetricsManager.saveRpcInfo(metricsRpcInfo);
return context;
}
diff --git a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/servlet/HttpServletInterceptor.java b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/servlet/HttpServletInterceptor.java
index 1315912c8c..d74ea7b1b0 100644
--- a/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/servlet/HttpServletInterceptor.java
+++ b/sermant-plugins/sermant-metrics/metrics-springcloud-plugin/src/main/java/com/huawei/metrics/interceptor/servlet/HttpServletInterceptor.java
@@ -20,6 +20,7 @@
import com.huawei.metrics.entity.MetricsRpcInfo;
import com.huawei.metrics.interceptor.AbstractHttpInterceptor;
import com.huawei.metrics.manager.MetricsManager;
+import com.huawei.metrics.util.InetAddressUtil;
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
@@ -59,8 +60,8 @@ public ExecuteContext collectMetrics(ExecuteContext context) {
*/
private MetricsRpcInfo initMetricsInfo(HttpServletRequest req, long latency, int status) {
MetricsRpcInfo metricsRpcInfo = new MetricsRpcInfo();
- metricsRpcInfo.setClientIp(req.getRemoteHost());
- metricsRpcInfo.setServerIp(req.getLocalAddr());
+ metricsRpcInfo.setClientIp(InetAddressUtil.getHostAddress());
+ metricsRpcInfo.setServerIp(InetAddressUtil.getHostAddress(req.getLocalAddr()));
metricsRpcInfo.setServerPort(req.getLocalPort());
metricsRpcInfo.setProtocol(req.getScheme());
metricsRpcInfo.setEnableSsl(Constants.HTTPS_PROTOCOL.equals(req.getScheme()));