From 2b0920d65c55e05dd3eea1534b1f00f62ee3b2e1 Mon Sep 17 00:00:00 2001 From: gsidhwani_nr Date: Wed, 5 Feb 2025 19:18:19 +0530 Subject: [PATCH] fix: added queries in db trace --- Vertx-SQLClient-4.1.0/build.gradle | 2 +- .../sqlclient/R2dbcObfuscator.java | 89 +++++++++++++++++++ .../vertx/sqlclient/impl/SqlClientBase.java | 6 +- 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 Vertx-SQLClient-4.1.0/src/main/java/com/nr/instrumentation/sqlclient/R2dbcObfuscator.java diff --git a/Vertx-SQLClient-4.1.0/build.gradle b/Vertx-SQLClient-4.1.0/build.gradle index edda4ee..d427700 100644 --- a/Vertx-SQLClient-4.1.0/build.gradle +++ b/Vertx-SQLClient-4.1.0/build.gradle @@ -21,7 +21,7 @@ jar { } verifyInstrumentation { - passes 'io.vertx:vertx-sql-client:[4.1.0,4.5.0)' + passes 'io.vertx:vertx-sql-client:[4.1.0,)' excludeRegex '.*SNAPSHOT' excludeRegex '.*milestone.*' excludeRegex '.*alpha.*' diff --git a/Vertx-SQLClient-4.1.0/src/main/java/com/nr/instrumentation/sqlclient/R2dbcObfuscator.java b/Vertx-SQLClient-4.1.0/src/main/java/com/nr/instrumentation/sqlclient/R2dbcObfuscator.java new file mode 100644 index 0000000..a7f5dcc --- /dev/null +++ b/Vertx-SQLClient-4.1.0/src/main/java/com/nr/instrumentation/sqlclient/R2dbcObfuscator.java @@ -0,0 +1,89 @@ +package com.nr.instrumentation.sqlclient; + +/* +* +* * Copyright 2020 New Relic Corporation. All rights reserved. +* * SPDX-License-Identifier: Apache-2.0 +* +*/ + +import com.newrelic.api.agent.QueryConverter; + +import java.util.regex.Pattern; + +public class R2dbcObfuscator { + private static final int PATTERN_SWITCHES = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final String SINGLE_QUOTE = "'(?:[^']|'')*?(?:\\\\'.*|'(?!'))"; + private static final String DOUBLE_QUOTE = "\"(?:[^\"]|\"\")*?(?:\\\\\".*|\"(?!\"))"; + private static final String DOLLAR_QUOTE = "(\\$(?!\\d)[^$]*?\\$).*?(?:\\1|$)"; + private static final String COMMENT = "(?:#|--).*?(?=\\r|\\n|$)"; + private static final String MULTILINE_COMMENT = "/\\*(?:[^/]|/[^*])*?(?:\\*/|/\\*.*)"; + private static final String UUID = "\\{?(?:[0-9a-f]\\-*){32}\\}?"; + private static final String HEX = "0x[0-9a-f]+"; + private static final String BOOLEAN = "\\b(?:true|false|null)\\b"; + private static final String NUMBER = "-?\\b(?:[0-9_]+\\.)?[0-9_]+([eE][+-]?[0-9_]+)?"; + private static final Pattern ALL_DIALECTS_PATTERN; + private static final Pattern ALL_UNMATCHED_PATTERN; + private static final Pattern MYSQL_DIALECT_PATTERN; + private static final Pattern MYSQL_UNMATCHED_PATTERN; + private static final Pattern POSTGRES_DIALECT_PATTERN; + private static final Pattern POSTGRES_UNMATCHED_PATTERN; + + public static final QueryConverter QUERY_CONVERTER; + public static final QueryConverter MYSQL_QUERY_CONVERTER; + public static final QueryConverter POSTGRES_QUERY_CONVERTER; + + static { + ALL_DIALECTS_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOUBLE_QUOTE, DOLLAR_QUOTE, COMMENT, MULTILINE_COMMENT, UUID, HEX, BOOLEAN, NUMBER), PATTERN_SWITCHES); + ALL_UNMATCHED_PATTERN = Pattern.compile("'|\"|/\\*|\\*/|\\$", PATTERN_SWITCHES); + MYSQL_DIALECT_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOUBLE_QUOTE, COMMENT, MULTILINE_COMMENT, HEX, BOOLEAN, NUMBER), PATTERN_SWITCHES); + MYSQL_UNMATCHED_PATTERN = Pattern.compile("'|\"|/\\*|\\*/", PATTERN_SWITCHES); + POSTGRES_DIALECT_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOLLAR_QUOTE, COMMENT, MULTILINE_COMMENT, UUID, BOOLEAN, NUMBER), PATTERN_SWITCHES); + POSTGRES_UNMATCHED_PATTERN = Pattern.compile("'|/\\*|\\*/|\\$(?!\\?)", PATTERN_SWITCHES); + + + QUERY_CONVERTER = new QueryConverter() { + @Override + public String toRawQueryString(String statement) { + return statement; + } + + @Override + public String toObfuscatedQueryString(String statement) { + return obfuscateSql(statement, ALL_DIALECTS_PATTERN, ALL_UNMATCHED_PATTERN); + } + }; + + MYSQL_QUERY_CONVERTER = new QueryConverter() { + @Override + public String toRawQueryString(String statement) { + return statement; + } + + @Override + public String toObfuscatedQueryString(String statement) { + return obfuscateSql(statement, MYSQL_DIALECT_PATTERN, MYSQL_UNMATCHED_PATTERN); + } + }; + + POSTGRES_QUERY_CONVERTER = new QueryConverter() { + @Override + public String toRawQueryString(String statement) { + return statement; + } + + @Override + public String toObfuscatedQueryString(String statement) { + return obfuscateSql(statement, POSTGRES_DIALECT_PATTERN, POSTGRES_UNMATCHED_PATTERN); + } + }; + } + + private static String obfuscateSql(String sql, Pattern dialect, Pattern unmatched) { + if (sql == null || sql.length() == 0) { + return sql; + } + String obfuscatedSql = dialect.matcher(sql).replaceAll("?"); + return unmatched.matcher(obfuscatedSql).find() ? "?" : obfuscatedSql; + } +} diff --git a/Vertx-SQLClient-4.1.0/src/main/java/io/vertx/sqlclient/impl/SqlClientBase.java b/Vertx-SQLClient-4.1.0/src/main/java/io/vertx/sqlclient/impl/SqlClientBase.java index dde1182..9ca27b7 100644 --- a/Vertx-SQLClient-4.1.0/src/main/java/io/vertx/sqlclient/impl/SqlClientBase.java +++ b/Vertx-SQLClient-4.1.0/src/main/java/io/vertx/sqlclient/impl/SqlClientBase.java @@ -10,6 +10,7 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.sqlclient.NRHandlerWrapper; +import com.nr.instrumentation.sqlclient.R2dbcObfuscator; import com.nr.instrumentation.sqlclient.SQLUtils; import io.vertx.core.AsyncResult; @@ -25,7 +26,7 @@ public abstract class SqlClientBase { @Trace public Query> query(String sql) { - Query> q = Weaver.callOriginal(); + Query q = Weaver.callOriginal(); return q; } @@ -49,7 +50,8 @@ public void execute(Handler> handler) { ParsedDatabaseStatement parsedStmt = SQLUtils.getParsed(sql); params = DatastoreParameters.product(dbType).collection(parsedStmt.getModel()) - .operation(parsedStmt.getOperation()).build(); + .operation(parsedStmt.getOperation()).noInstance().databaseName(dbType) + .slowQuery(sql, R2dbcObfuscator.MYSQL_QUERY_CONVERTER).build(); } NRHandlerWrapper wrapper = new NRHandlerWrapper(handler, segment, params); handler = wrapper;