simplified zipkin with ssl

This commit is contained in:
a10zn8
2023-07-12 17:56:17 +04:00
parent e074a21e16
commit ff95105f33
13 changed files with 216 additions and 535 deletions

View File

@@ -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)
}
}
}

View File

@@ -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)
}
}