simplified zipkin with ssl
This commit is contained in:
@@ -1,138 +0,0 @@
|
||||
package io.emeraldpay.dshackle.config.spans
|
||||
|
||||
import brave.handler.SpanHandler
|
||||
import org.junit.jupiter.api.Assertions.assertThrows
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.assertDoesNotThrow
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
import org.mockito.Mockito.mock
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.boot.test.context.TestConfiguration
|
||||
import org.springframework.cloud.sleuth.Tracer
|
||||
import org.springframework.context.ApplicationContext
|
||||
import org.springframework.context.annotation.Bean
|
||||
import org.springframework.test.context.ContextConfiguration
|
||||
import org.springframework.test.context.TestPropertySource
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension
|
||||
|
||||
class CollectSpanConfigTest {
|
||||
|
||||
@ContextConfiguration(
|
||||
classes = [SpanConfig::class],
|
||||
)
|
||||
@ExtendWith(SpringExtension::class)
|
||||
@TestPropertySource(
|
||||
properties = [
|
||||
"spans.collect.enabled=false"
|
||||
]
|
||||
)
|
||||
class SpanConfigTest {
|
||||
@Autowired
|
||||
private lateinit var appCtx: ApplicationContext
|
||||
|
||||
@Test
|
||||
fun testSpanConfig() {
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(SpanConfig::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ProviderSpanHandler::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ServerSpansInterceptor::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ClientSpansInterceptor::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean("spanMapper")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ContextConfiguration(
|
||||
classes = [SpanConfig::class, SpanProviderConfigTest.Config::class],
|
||||
)
|
||||
@ExtendWith(SpringExtension::class)
|
||||
@TestPropertySource(
|
||||
properties = [
|
||||
"spans.collect.enabled=true",
|
||||
"spans.collect.provider.enabled=true",
|
||||
"spans.collect.main.enabled=false"
|
||||
]
|
||||
)
|
||||
class SpanProviderConfigTest {
|
||||
@Autowired
|
||||
private lateinit var appCtx: ApplicationContext
|
||||
|
||||
@Test
|
||||
fun testSpanProviderConfig() {
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean(SpanConfig::class.java)
|
||||
}
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean(ProviderSpanHandler::class.java)
|
||||
}
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean(ServerSpansInterceptor::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ClientSpansInterceptor::class.java)
|
||||
}
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean("spanMapper")
|
||||
}
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
open class Config {
|
||||
@Bean
|
||||
open fun tracer(): Tracer = mock(Tracer::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
@ContextConfiguration(
|
||||
classes = [SpanConfig::class, SpanMainConfigTest.Config::class],
|
||||
)
|
||||
@ExtendWith(SpringExtension::class)
|
||||
@TestPropertySource(
|
||||
properties = [
|
||||
"spans.collect.enabled=true",
|
||||
"spans.collect.provider.enabled=false",
|
||||
"spans.collect.main.enabled=true"
|
||||
]
|
||||
)
|
||||
class SpanMainConfigTest {
|
||||
@Autowired
|
||||
private lateinit var appCtx: ApplicationContext
|
||||
|
||||
@Test
|
||||
fun testSpanMainConfig() {
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean(SpanConfig::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ProviderSpanHandler::class.java)
|
||||
}
|
||||
assertThrows(NoSuchBeanDefinitionException::class.java) {
|
||||
appCtx.getBean(ServerSpansInterceptor::class.java)
|
||||
}
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean(ClientSpansInterceptor::class.java)
|
||||
}
|
||||
assertDoesNotThrow {
|
||||
appCtx.getBean("spanMapper")
|
||||
}
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
open class Config {
|
||||
@Bean
|
||||
open fun tracer(): brave.Tracer = mock(brave.Tracer::class.java)
|
||||
|
||||
@Bean
|
||||
open fun zipkinSpanHandler(): SpanHandler = mock(SpanHandler::class.java)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,128 +1,85 @@
|
||||
package io.emeraldpay.dshackle.config.spans
|
||||
|
||||
import brave.handler.MutableSpan
|
||||
import brave.handler.SpanHandler
|
||||
import brave.propagation.TraceContext
|
||||
import com.fasterxml.jackson.module.kotlin.readValue
|
||||
import io.emeraldpay.dshackle.commons.SPAN_ERROR
|
||||
import io.emeraldpay.dshackle.commons.SPAN_NO_RESPONSE_MESSAGE
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertTrue
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.params.ParameterizedTest
|
||||
import org.junit.jupiter.params.provider.Arguments
|
||||
import org.junit.jupiter.params.provider.MethodSource
|
||||
import org.mockito.Mockito
|
||||
import org.mockito.Mockito.`when`
|
||||
import org.springframework.cloud.sleuth.Span
|
||||
import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext
|
||||
import java.util.stream.Stream
|
||||
|
||||
class ProviderSpanHandlerTest {
|
||||
private val mapper = SpanConfig().spanMapper()
|
||||
private val spanExportableList = listOf(
|
||||
ErrorSpanExportable(), NoResponseSpanExportable(), LongResponseSpanExportable(10)
|
||||
)
|
||||
private val ctx = TraceContext.newBuilder()
|
||||
.traceId(1223324)
|
||||
.spanId(234235)
|
||||
.build()
|
||||
|
||||
@Test
|
||||
fun `span with length of traceId less than 20 is not collected`() {
|
||||
val spanId = "f7e83f2b69ec684d"
|
||||
val currentSpan = Mockito.mock(Span::class.java)
|
||||
val handler = spanHandler()
|
||||
|
||||
`when`(currentSpan.context()).thenReturn(BraveTraceContext(ctx))
|
||||
|
||||
handler.end(ctx, span("f7e83f2b69ec684d", spanId), SpanHandler.Cause.FINISHED)
|
||||
|
||||
val result = handler.getErrorSpans(spanId, currentSpan)
|
||||
assertEquals("", result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `span without parenId is not collected`() {
|
||||
val spanId = "f7e83f2b69ec684d"
|
||||
val currentSpan = Mockito.mock(Span::class.java)
|
||||
val handler = spanHandler()
|
||||
|
||||
`when`(currentSpan.context()).thenReturn(BraveTraceContext(ctx))
|
||||
|
||||
handler.end(ctx, span("6666632728347823749827349723985", spanId), SpanHandler.Cause.FINISHED)
|
||||
|
||||
val result = handler.getErrorSpans(spanId, currentSpan)
|
||||
assertEquals("", result)
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("spans")
|
||||
fun `span with length of traceId greater than 20 and with parentId is collected`(span: MutableSpan) {
|
||||
val currentSpan = Mockito.mock(Span::class.java)
|
||||
val handler = spanHandler()
|
||||
|
||||
`when`(currentSpan.context()).thenReturn(BraveTraceContext(ctx))
|
||||
|
||||
handler.end(ctx, span, SpanHandler.Cause.FINISHED)
|
||||
|
||||
val result = handler.getErrorSpans("f7e83f2b69ec682d", currentSpan)
|
||||
val collectedSpans = mapper.readValue<List<MutableSpan>>(result)
|
||||
assertTrue(collectedSpans.size == 1)
|
||||
assertEquals(span, collectedSpans[0])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `span without error tag is not collected`() {
|
||||
val spanId = "f7e83f2b69ec684d"
|
||||
val currentSpan = Mockito.mock(Span::class.java)
|
||||
val handler = spanHandler()
|
||||
val span = span("6666632728347823749827349723985", spanId)
|
||||
.apply {
|
||||
parentId("f7e83f2b69ec682d")
|
||||
removeTag(SPAN_ERROR)
|
||||
}
|
||||
|
||||
`when`(currentSpan.context()).thenReturn(BraveTraceContext(ctx))
|
||||
|
||||
handler.end(ctx, span, SpanHandler.Cause.FINISHED)
|
||||
|
||||
val result = handler.getErrorSpans("f7e83f2b69ec682d", currentSpan)
|
||||
assertEquals("", result)
|
||||
}
|
||||
|
||||
private fun span(traceId: String, spanId: String) = MutableSpan()
|
||||
.apply {
|
||||
traceId(traceId)
|
||||
id(spanId)
|
||||
tag(SPAN_ERROR, "true")
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun spans() = listOf(
|
||||
MutableSpan()
|
||||
.apply {
|
||||
traceId("6666632728347823749827349723985")
|
||||
id("f7e83f2b69ec682d")
|
||||
tag(SPAN_ERROR, "true")
|
||||
parentId("f7e83f2b69ec682d")
|
||||
},
|
||||
MutableSpan()
|
||||
.apply {
|
||||
traceId("6666632728347823749827349723985")
|
||||
id("f7e83f2b69ec111d")
|
||||
parentId("f7e83f2b69ec682d")
|
||||
tag(SPAN_NO_RESPONSE_MESSAGE, "noResp")
|
||||
},
|
||||
MutableSpan()
|
||||
.apply {
|
||||
traceId("6666632728347823749827349723985")
|
||||
id("f7e83f2b69ec111d")
|
||||
parentId("f7e83f2b69ec682d")
|
||||
startTimestamp(3034272)
|
||||
finishTimestamp(15034272)
|
||||
}
|
||||
)
|
||||
fun data(): Stream<Arguments> {
|
||||
return Stream.of(
|
||||
Arguments.of(
|
||||
false, null,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
},
|
||||
true
|
||||
),
|
||||
Arguments.of(
|
||||
false, 1000L,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(999999)
|
||||
},
|
||||
false
|
||||
),
|
||||
Arguments.of(
|
||||
false, 1000L,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
},
|
||||
true
|
||||
),
|
||||
Arguments.of(
|
||||
true, null,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
},
|
||||
false
|
||||
),
|
||||
Arguments.of(
|
||||
true, null,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
tag("error", "true")
|
||||
},
|
||||
true
|
||||
),
|
||||
Arguments.of(
|
||||
false, null,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
tag("error", "true")
|
||||
},
|
||||
true
|
||||
),
|
||||
Arguments.of(
|
||||
true, 1000L,
|
||||
MutableSpan().apply {
|
||||
startTimestamp(0)
|
||||
finishTimestamp(1000000)
|
||||
},
|
||||
true
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun spanHandler() = ProviderSpanHandler(mapper, spanExportableList)
|
||||
@ParameterizedTest
|
||||
@MethodSource("data")
|
||||
fun end(onlyErrors: Boolean?, timeThreshold: Long?, span: MutableSpan, expected: Boolean) {
|
||||
val handler = ProviderSpanHandler(onlyErrors, timeThreshold)
|
||||
val res = handler.end(null, span, null)
|
||||
assertEquals(expected, res)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user