@Override public String toString() { return "ArrayListSpanAccumulator{" + "spans=" + getSpans() + '}'; }
@Bean public ArrayListSpanReporter spanReporter() { return new ArrayListSpanReporter(); }
@Override public String toString() { return "ArrayListSpanAccumulator{" + "spans=" + getSpans() + '}'; }
@Test public void testShouldNotFailToCloseSpanForTwoConsecutiveConnections() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection1 = dataSource.getConnection(); Connection connection2 = dataSource.getConnection(); connection1.close(); connection2.close(); assertThat(spanReporter.getSpans()).hasSize(2); Span connectionSpan = spanReporter.getSpans().get(0); Span statementSpan = spanReporter.getSpans().get(1); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/connection"); }); }
@Test public void testShouldNotFailToCloseSpanForTwoConsecutiveConnections() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection1 = dataSource.getConnection(); Connection connection2 = dataSource.getConnection(); connection1.close(); connection2.close(); assertThat(spanReporter.getSpans()).hasSize(2); Span connectionSpan = spanReporter.getSpans().get(0); Span statementSpan = spanReporter.getSpans().get(1); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/connection"); }); }
@Test void testShouldAddSpanForPreparedStatementExecute() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); connection.prepareStatement("SELECT NOW()").execute(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(2); Span connectionSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldAddSpanForStatementAndResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); ResultSet resultSet = connection.createStatement().executeQuery("SELECT NOW()"); resultSet.next(); Thread.sleep(200L); resultSet.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldAddSpanForPreparedStatementExecute() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); connection.prepareStatement("SELECT NOW()").execute(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(2); Span connectionSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenConnectionIsClosedWihoutResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldAddSpanForStatementExecuteUpdate() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); connection.createStatement().executeUpdate("UPDATE INFORMATION_SCHEMA.TABLES SET table_Name = '' WHERE 0 = 1"); connection.close(); assertThat(spanReporter.getSpans()).hasSize(2); Span connectionSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "UPDATE INFORMATION_SCHEMA.TABLES SET table_Name = '' WHERE 0 = 1"); }); }
@Test void testShouldNotFailWhenConnectionIsClosedWihoutResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenClosedInReversedOrder() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); connection.close(); statement.close(); resultSet.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldAddSpanForPreparedStatementExecuteQueryIncludingTimeToCloseResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); ResultSet resultSet = connection.prepareStatement("SELECT NOW() UNION ALL SELECT NOW()").executeQuery(); resultSet.next(); resultSet.next(); resultSet.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW() UNION ALL SELECT NOW()"); }); }
@Test void testShouldNotFailWhenStatementIsClosedWihoutResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); statement.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenStatementIsClosedWihoutResultSet() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); statement.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenClosedInReversedOrder() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); connection.close(); statement.close(); resultSet.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); } }
@Test void testShouldNotFailWhenResultSetNextWasNotCalled() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); resultSet.close(); statement.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenResultSetNextWasNotCalled() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); resultSet.close(); statement.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenResourceIsAlreadyClosed() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); resultSet.close(); resultSet.close(); statement.close(); statement.close(); connection.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }
@Test void testShouldNotFailWhenResourceIsAlreadyClosed() { contextRunner.run(context -> { DataSource dataSource = context.getBean(DataSource.class); ArrayListSpanReporter spanReporter = context.getBean(ArrayListSpanReporter.class); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT NOW()"); resultSet.next(); resultSet.close(); resultSet.close(); statement.close(); statement.close(); connection.close(); connection.close(); assertThat(spanReporter.getSpans()).hasSize(3); Span connectionSpan = spanReporter.getSpans().get(2); Span resultSetSpan = spanReporter.getSpans().get(1); Span statementSpan = spanReporter.getSpans().get(0); assertThat(connectionSpan.name()).isEqualTo("jdbc:/test/connection"); assertThat(statementSpan.name()).isEqualTo("jdbc:/test/query"); assertThat(resultSetSpan.name()).isEqualTo("jdbc:/test/fetch"); assertThat(statementSpan.tags()).containsEntry(SleuthListenerAutoConfiguration.SPAN_SQL_QUERY_TAG_NAME, "SELECT NOW()"); }); }