diff --git a/agent-module/plugins/external/src/main/resources/META-INF/pinpoint/type-providers/h2-type-provider.yml b/agent-module/plugins/external/src/main/resources/META-INF/pinpoint/type-providers/h2-type-provider.yml new file mode 100644 index 000000000000..b202e13d0675 --- /dev/null +++ b/agent-module/plugins/external/src/main/resources/META-INF/pinpoint/type-providers/h2-type-provider.yml @@ -0,0 +1,14 @@ +serviceTypes: + - code: 2750 + name: 'H2' + desc: 'H2' + property: + terminal: true + includeDestinationId: true + - code: 2751 + name: 'H2_EXECUTE_QUERY' + desc: 'H2_EXECUTE_QUERY' + property: + recordStatistics: true + terminal: true + includeDestinationId: true diff --git a/otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolver.java b/otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolver.java index e3bda68ae145..9b5aa553df45 100644 --- a/otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolver.java +++ b/otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolver.java @@ -20,6 +20,7 @@ import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.Objects; @@ -73,7 +74,7 @@ public class OtlpDbSystemTypeResolver { private static void put(Map map, String baseName, String executeQueryName, String... dbSystemKeys) { String[] names = {baseName, executeQueryName}; for (String key : dbSystemKeys) { - map.put(key, names); + map.put(normalizeDbSystem(key), names); } } @@ -106,7 +107,7 @@ short resolveBaseCode(String dbSystem) { if (dbSystem == null) { return DEFAULT_BASE; } - short[] codes = codeMap.get(dbSystem); + short[] codes = codeMap.get(normalizeDbSystem(dbSystem)); return codes != null ? codes[0] : DEFAULT_BASE; } @@ -114,7 +115,11 @@ short resolveExecuteQueryCode(String dbSystem) { if (dbSystem == null) { return DEFAULT_EXECUTE_QUERY; } - short[] codes = codeMap.get(dbSystem); + short[] codes = codeMap.get(normalizeDbSystem(dbSystem)); return codes != null ? codes[1] : DEFAULT_EXECUTE_QUERY; } + + private static String normalizeDbSystem(String dbSystem) { + return dbSystem.trim().toLowerCase(Locale.ROOT); + } } diff --git a/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolverTest.java b/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolverTest.java index 89b13e6ff53e..62bf3fff88b7 100644 --- a/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolverTest.java +++ b/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpDbSystemTypeResolverTest.java @@ -132,6 +132,12 @@ void resolveBaseCode_legacyAliases() { assertThat(resolver.resolveBaseCode("h2")).isEqualTo((short) 2750); } + @Test + void resolveBaseCode_normalizesDbSystem() { + assertThat(resolver.resolveBaseCode(" H2DATABASE ")).isEqualTo((short) 2750); + assertThat(resolver.resolveBaseCode(" H2 ")).isEqualTo((short) 2750); + } + @Test void resolveExecuteQueryCode_legacyAliases() { assertThat(resolver.resolveExecuteQueryCode("mssql")).isEqualTo((short) 2251); @@ -141,6 +147,12 @@ void resolveExecuteQueryCode_legacyAliases() { assertThat(resolver.resolveExecuteQueryCode("h2")).isEqualTo((short) 2751); } + @Test + void resolveExecuteQueryCode_normalizesDbSystem() { + assertThat(resolver.resolveExecuteQueryCode(" H2DATABASE ")).isEqualTo((short) 2751); + assertThat(resolver.resolveExecuteQueryCode(" H2 ")).isEqualTo((short) 2751); + } + // ======================================================================= // null / unknown → UNKNOWN_DB fallback // ======================================================================= diff --git a/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpTraceSpanEventMapperTest.java b/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpTraceSpanEventMapperTest.java index ba195c1db55f..317565b40248 100644 --- a/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpTraceSpanEventMapperTest.java +++ b/otlptrace/otlptrace-collector/src/test/java/com/navercorp/pinpoint/otlp/trace/collector/mapper/OtlpTraceSpanEventMapperTest.java @@ -23,15 +23,16 @@ class OtlpTraceSpanEventMapperTest { - // Stub registry pre-loaded with the client-side RPC ServiceTypes so client/RPC dispatch - // tests resolve to the real plugin codes. DB / messaging resolvers fall back gracefully - // when their plugin names are absent. + // Stub registry pre-loaded with the ServiceTypes needed for targeted dispatch tests. + // Unregistered DB / messaging plugin names still fall back gracefully. private static final ServiceTypeRegistryService TEST_REGISTRY = buildRegistry(); private static ServiceTypeRegistryService buildRegistry() { Map byName = new HashMap<>(); byName.put("GRPC", ServiceTypeFactory.of(9160, "GRPC", "GRPC")); byName.put("APACHE_DUBBO_CONSUMER", ServiceTypeFactory.of(9997, "APACHE_DUBBO_CONSUMER", "APACHE_DUBBO_CONSUMER")); + byName.put("H2", ServiceTypeFactory.of(2750, "H2", "H2")); + byName.put("H2_EXECUTE_QUERY", ServiceTypeFactory.of(2751, "H2_EXECUTE_QUERY", "H2_EXECUTE_QUERY")); return new ServiceTypeRegistryService() { @Override public ServiceType findServiceType(int serviceType) { @@ -403,6 +404,28 @@ void map_producer_activemq_destinationIdIsQueueName() { assertThat(event.getDestinationId()).isEqualTo("orders.queue"); } + @Test + void map_database_h2StableDbSystemName_setsH2ServiceType() { + Span span = span(Span.SpanKind.SPAN_KIND_CLIENT, + kv("db.system.name", strVal("h2database")), + kv("db.namespace", strVal("mem:testdb"))); + + SpanEventBo event = mapSingle(span); + assertThat(event.getServiceType()).isEqualTo((short) 2750); // H2 + assertThat(event.getDestinationId()).isEqualTo("mem:testdb"); + } + + @Test + void map_database_h2LegacyDbSystem_setsH2ExecuteQueryServiceType() { + Span span = span(Span.SpanKind.SPAN_KIND_CLIENT, + kv("db.system", strVal("h2")), + kv("db.statement", strVal("SELECT 1"))); + + SpanEventBo event = mapSingle(span); + assertThat(event.getServiceType()).isEqualTo((short) 2751); // H2_EXECUTE_QUERY + assertThat(event.getDestinationId()).isEqualTo("h2"); + } + @Test void map_client_grpc_setsGrpcServiceType() { // OTel grpc-1.6 agent emits rpc.system="grpc" on the client-side instrumenter.