From 5f5ec91333d7d34f967f67d78cb7be843d452f06 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Mon, 7 Dec 2020 23:09:46 +0530 Subject: [PATCH 1/4] Use db.connection_string for sql backend url --- .../utils/db/DbSemanticConventionUtils.java | 27 ++++++++++++++++++- .../fieldgenerators/SqlFieldsGenerator.java | 11 +++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java index 30f08b188..be97de79f 100644 --- a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java +++ b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java @@ -2,6 +2,10 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -163,7 +167,19 @@ public static Optional getSqlURI(Event event) { if (SpanAttributeUtils.containsAttributeKey(event, SQL_URL)) { return Optional.of(SpanAttributeUtils.getStringAttribute(event, SQL_URL)); } - return getBackendURIForOtelFormat(event); + Optional backendUrl = getBackendURIForOtelFormat(event); + if (backendUrl.isPresent()) { + return backendUrl; + } + if (SpanAttributeUtils.containsAttributeKey( + event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { + String url = SpanAttributeUtils.getStringAttribute( + event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()); + if (isValidUrl(url)) { + return Optional.of(url); + } + } + return Optional.empty(); } /** @@ -192,4 +208,13 @@ public static Optional getDbTypeForOtelFormat(Event event) { } return Optional.empty(); } + + public static boolean isValidUrl(String url) { + try { + new URL(url); + } catch (MalformedURLException e) { + return false; + } + return true; + } } diff --git a/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java b/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java index c47bb7b72..a7117e716 100644 --- a/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java +++ b/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java @@ -71,7 +71,16 @@ protected void maybePopulateSqlUrlForOtelSpan( final Map attributeFieldMap) { if (DbSemanticConventionUtils.isSqlTypeBackendForOtelFormat(attributeFieldMap)) { Optional sqlUrl = DbSemanticConventionUtils.getBackendURIForOtelFormat(attributeFieldMap); - sqlUrl.ifPresent(s -> eventBuilder.getSqlBuilder().setUrl(s)); + if (sqlUrl.isPresent()) { + eventBuilder.getSqlBuilder().setUrl(sqlUrl.get()); + return; + } + if (attributeFieldMap.containsKey(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { + String url = attributeFieldMap.get(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()).getValue(); + if (DbSemanticConventionUtils.isValidUrl(url)) { + eventBuilder.getSqlBuilder().setUrl(url); + } + } } } } From 5237866b1426378b6885ad898ab57300d2c77f97 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Mon, 14 Dec 2020 14:00:36 +0530 Subject: [PATCH 2/4] Add test --- .../utils/db/DbSemanticConventionUtils.java | 29 +++++++------ .../db/DbSemanticConventionUtilsTest.java | 41 +++++++++++++++++++ .../fieldgenerators/SqlFieldsGenerator.java | 15 +------ 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java index 893c05184..579447ee0 100644 --- a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java +++ b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java @@ -175,9 +175,23 @@ public static Optional getSqlURI(Event event) { event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { String url = SpanAttributeUtils.getStringAttribute( event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()); - if (isValidUrl(url)) { - return Optional.of(url); - } + return Optional.of(url); + } + return Optional.empty(); + } + + public static Optional getSqlUrlForOtelFormat( + Map attributeValueMap) { + if (!isSqlTypeBackendForOtelFormat(attributeValueMap)) { + return Optional.empty(); + } + Optional backendUrl = getBackendURIForOtelFormat(attributeValueMap); + if (backendUrl.isPresent()) { + return backendUrl; + } + if (attributeValueMap.containsKey(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { + String url = attributeValueMap.get(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()).getValue(); + return Optional.of(url); } return Optional.empty(); } @@ -208,13 +222,4 @@ public static Optional getDbTypeForOtelFormat(Event event) { } return Optional.empty(); } - - public static boolean isValidUrl(String url) { - try { - new URL(url); - } catch (MalformedURLException e) { - return false; - } - return true; - } } diff --git a/semantic-convention-utils/src/test/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtilsTest.java b/semantic-convention-utils/src/test/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtilsTest.java index c988b47c5..d19414517 100644 --- a/semantic-convention-utils/src/test/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtilsTest.java +++ b/semantic-convention-utils/src/test/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtilsTest.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Optional; +import org.hypertrace.core.datamodel.AttributeValue; import org.hypertrace.core.semantic.convention.constants.db.OTelDbSemanticConventions; import org.hypertrace.core.semantic.convention.constants.span.OTelSpanSemanticConventions; import org.hypertrace.semantic.convention.utils.SemanticConventionTestUtil; @@ -193,6 +194,46 @@ public void testGetSqlURI() { when(e.getAttributes()).thenReturn(attributes); v = DbSemanticConventionUtils.getSqlURI(e); assertTrue(v.isEmpty()); + + attributes = SemanticConventionTestUtil.buildAttributes( + Map.of( + OTelDbSemanticConventions.DB_SYSTEM.getValue(), + SemanticConventionTestUtil.buildAttributeValue(OTelDbSemanticConventions.MYSQL_DB_SYSTEM_VALUE.getValue()), + OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue(), + SemanticConventionTestUtil.buildAttributeValue("jdbc:mysql://mysql:3306/shop"))); + when(e.getAttributes()).thenReturn(attributes); + v = DbSemanticConventionUtils.getSqlURI(e); + assertEquals("jdbc:mysql://mysql:3306/shop", v.get()); + } + + @Test + public void testGetSqlUrlForOtelFormat() { + Map map = + Map.of( + OTelDbSemanticConventions.DB_SYSTEM.getValue(), + SemanticConventionTestUtil.buildAttributeValue(OTelDbSemanticConventions.MYSQL_DB_SYSTEM_VALUE.getValue()), + OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue(), + SemanticConventionTestUtil.buildAttributeValue("jdbc:mysql://mysql:3306/shop")); + Optional v = DbSemanticConventionUtils.getSqlUrlForOtelFormat(map); + assertEquals("jdbc:mysql://mysql:3306/shop", v.get()); + + map = Map.of( + OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue(), + SemanticConventionTestUtil.buildAttributeValue("jdbc:mysql://mysql:3306/shop") + ); + v = DbSemanticConventionUtils.getSqlUrlForOtelFormat(map); + assertTrue(v.isEmpty()); + + map = + Map.of( + OTelSpanSemanticConventions.NET_PEER_IP.getValue(), + SemanticConventionTestUtil.buildAttributeValue("127.0.0.1"), + OTelDbSemanticConventions.DB_SYSTEM.getValue(), + SemanticConventionTestUtil.buildAttributeValue(OTelDbSemanticConventions.MYSQL_DB_SYSTEM_VALUE.getValue()), + OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue(), + SemanticConventionTestUtil.buildAttributeValue("jdbc:mysql://mysql:3306/shop")); + v = DbSemanticConventionUtils.getSqlUrlForOtelFormat(map); + assertEquals("127.0.0.1", v.get()); } @Test diff --git a/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java b/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java index a7117e716..0df4890ba 100644 --- a/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java +++ b/span-normalizer/span-normalizer/src/main/java/org/hypertrace/core/spannormalizer/fieldgenerators/SqlFieldsGenerator.java @@ -69,18 +69,7 @@ protected void populateOtherFields(Event.Builder eventBuilder, final Map attributeFieldMap) { - if (DbSemanticConventionUtils.isSqlTypeBackendForOtelFormat(attributeFieldMap)) { - Optional sqlUrl = DbSemanticConventionUtils.getBackendURIForOtelFormat(attributeFieldMap); - if (sqlUrl.isPresent()) { - eventBuilder.getSqlBuilder().setUrl(sqlUrl.get()); - return; - } - if (attributeFieldMap.containsKey(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { - String url = attributeFieldMap.get(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()).getValue(); - if (DbSemanticConventionUtils.isValidUrl(url)) { - eventBuilder.getSqlBuilder().setUrl(url); - } - } - } + Optional url = DbSemanticConventionUtils.getSqlUrlForOtelFormat(attributeFieldMap); + url.ifPresent(s -> eventBuilder.getSqlBuilder().setUrl(s)); } } From e2544136e1da6508501df2a4feb155f58c7d4e40 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Mon, 14 Dec 2020 14:04:52 +0530 Subject: [PATCH 3/4] Remove unusued imports --- .../convention/utils/db/DbSemanticConventionUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java index 579447ee0..b5d583503 100644 --- a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java +++ b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java @@ -2,10 +2,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Map; From d53590b121839d9140f178ec5affdb7d2ab0f7e8 Mon Sep 17 00:00:00 2001 From: Rishabh Singh Date: Mon, 14 Dec 2020 18:52:35 +0530 Subject: [PATCH 4/4] Check if the db connection string is a valid uri --- .../utils/db/DbSemanticConventionUtils.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java index b5d583503..5f293cac3 100644 --- a/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java +++ b/semantic-convention-utils/src/main/java/org/hypertrace/semantic/convention/utils/db/DbSemanticConventionUtils.java @@ -2,6 +2,8 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -171,6 +173,9 @@ public static Optional getSqlURI(Event event) { event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { String url = SpanAttributeUtils.getStringAttribute( event, OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()); + if (!isValidURI(url)) { + return Optional.empty(); + } return Optional.of(url); } return Optional.empty(); @@ -187,6 +192,9 @@ public static Optional getSqlUrlForOtelFormat( } if (attributeValueMap.containsKey(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue())) { String url = attributeValueMap.get(OTelDbSemanticConventions.DB_CONNECTION_STRING.getValue()).getValue(); + if (!isValidURI(url)) { + return Optional.empty(); + } return Optional.of(url); } return Optional.empty(); @@ -218,4 +226,13 @@ public static Optional getDbTypeForOtelFormat(Event event) { } return Optional.empty(); } + + static boolean isValidURI(String uri) { + try { + new URI(uri); + } catch (URISyntaxException e) { + return false; + } + return true; + } }