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()));