λ³Έ κΈμ λ§μ΄ν¬λ‘μλΉμ€μ λΆμ° μΆμ μ리μ¦λ‘ μ΄λ‘ κ³Ό μ€μ΅μ΄ ν¨κ» ν¬ν¨λ μ리μ¦μ λλ€. μλ λͺ©μ°¨μ νμλ κΈμ λͺ¨λ μ°Έκ³ νλ©΄ μ’μ΅λλ€.
λͺ©μ°¨
- Distributed Tracing, λΆμ° μΆμ μ΄λ?
- Spring Cloud Sleuth μ Zipkin
- Sleuth λ‘ Http νκ²½μ λΆμ° μΆμ μ€μ΅
- Sleuth λ‘ Messaging νκ²½μ λΆμ° μΆμ μ€μ΅
μ€μ΅μ λν μμ€μ½λλ₯Ό νμΈνμκ³ μΆλ€λ©΄ μ€μ΅ githubμμ νμΈνμ€ μ μμ΅λλ€.
Zipkin μ λν΄μ
Zipkin μ νΈμν°μμ κ°λ°νκ³ μ¬μ©ν Distributed Tracing Tool μ΄λ€
Zipkin μμλ μ§λ μκ° μμλ μ΄μΌκΈ°νμλ Dapper λ₯Ό μ΄μ©νμ¬ λΆμ° νκ²½μμ λ©μμ§λ₯Ό μΆμ νλ€.
Zipkin μμλ Tracer μ ν¨κ»ν΄μΌ νλ€.
Tracer λ κ° λ Έλμ ν¬ν¨λμ΄μλ μ ν리μΌμ΄μ λΌμ΄λΈλ¬λ¦¬ νΉμ Sidecar λ‘ ν΄λΉ λ Έλμμ λ°μν λ©μμ§λ₯Ό Timing Data μ κ°μ Metadata λ₯Ό ν¬ν¨μμΌ Zipkin μΌλ‘ μ μ‘ν΄μ€λ€.
κ·ΈλΌ Zipkin μ ν¬ν¨λ Collector μ μν΄μ ν΄λΉ λ°μ΄ν°λ€μ΄ λͺ¨μ΄κ² λκ³ μ μ λλ€.
κ·Έλ° λ€ Zipkin μ UI Dashboard μμ νμΈν μ μκ² νλ€
Trace μ Span
Zipkin μμλ λΆμ° νκ²½μ λ©μμ§λ€μ Trace μ Span μ ν΅ν΄μ ꡬλΆνκ³ μκ΄κ΄κ³λ₯Ό κ·μ νλ€
Span in Zipkin
Spanμ Timing Data μ κ°μ λ©ν λ°μ΄ν°λ₯Ό ν¬ν¨νλ μ 보μ΄λ€.
Span μ ν¬ν¨λ λ°μ΄ν°λ κ³μν΄μ Zipkin Collector λ‘ μ μ‘λμ΄μΌ νκΈ° λλ¬Έμ κ°λ₯ν μκ² μ μ§λμ΄μΌ νλ€.
Span μ μλ‘ μ°κ²°λμ΄μλλ°, SpanId μ ParentSpanId λ₯Ό ν΅ν΄μ λ Όλ¦¬μ μΌλ‘ μ°κ²°λμ΄μλ€
Trace in Zipkin
Trace λ Span λ€μ μΈνΈλ‘ νλμ TraceId λ₯Ό κ°κ°μ Span λ€μ΄ 곡μ νλ λ°©μμ΄λ€
μ΄λ¬ν Span κ³Ό Trace λ°μ΄ν°κ° Zipkin μ μ μ‘λλ©΄ λ€μκ³Ό κ°μ json μΌλ‘ Zipkin
[
{
"traceId": "5982fe77008310cc80f1da5e10147517",
"name": "get",
"id": "bd7a977555f6b982",
"localEndpoint": {
"serviceName": "zipkin-query",
},
"annotations": [
{
"timestamp": 1458702548467000,
},
{
"timestamp": 1458702548853000,
}
]
},
{
"traceId": "5982fe77008310cc80f1da5e10147517",
"name": "get-traces",
"id": "ebf33e1a81dc6f71",
"parentId": "bd7a977555f6b982",
"localEndpoint": {
"serviceName": "zipkin-query",
},
"tags": {
// μλ΅
}
}
]
Zipkin μ μν€ν μ²
Zipkin μ ν¬κ² 3κ°μ§μ ννΈλ‘ λλλ€.
- Reporter
- Collector
- Storage & UI
Reporter
- λ§μ΄ν¬λ‘μλΉμ€ λ Έλμ ν¬ν¨λλ©° λ©μμ§κ° λ°μν λλ§λ€ ν΄λΉ λ©μμ§μ Metadata λ₯Ό Zipkin Collector λ‘ λΉλκΈ°μ μΌλ‘ μ μ‘νλ€
- Metadata μλ Timing Data, TraceId, SpanId μ κ°μ μ 보λ€μ΄ ν¬ν¨λλ€
Collector
- λ§μ΄ν¬λ‘μλΉμ€ μ»΄ν¬λνΈλ zipkin daemon μΌλ‘ λ°μ΄ν°λ₯Ό μ μ‘νλλ° μ΄ λ°μ΄ν°λ₯Ό λ°λ λͺ¨λμ 컬λ ν°λΌκ³ λΆλ₯Έλ€.
Storage & UI
- μΉ΄μ°λλΌκ° κΈ°λ³Έμ μΈ Storage Infrastructure λ‘ μ¬μ©λλ€.
- Plug & Play λ°©μμ΄κΈ° λλ¬Έμ Cassandra μ΄μΈμλ Elastic Search & MySQL μ μ°λν μ μλ€
Zipkin μ€ννκΈ°
zipkin μ μμνλ λ°©λ²μ μ¬λ¬κ°μ§ λ°©λ²μ΄ μκ² μ§λ§ λλ docker λ₯Ό μ΄μ©ν΄λ³΄λ € νλ€.
docker run --rm -d -p 9411:9411 openzipkin/zipkin
μ ν΅ν΄μ zipkin μ μ€ννκ³ 9411 ν¬νΈλ‘ μ κ·Όνλ©΄ λ€μκ³Ό κ°μ μΉ λμ보λκ° λνλκ² λλ€
Spring Cloud Sleuth
Zipkin κ³Ό ν¨κ» μ¬μ©λλ Tracer λ λ§μ κ²λ€μ΄ μ‘΄μ¬νλ€.
곡μμ μΌλ‘ Zipkin μ΄ κ°λ°νκ³ μ΄μνλ Zipkin Supported κ³Ό Open Source λ‘ μ΄μλλ Zipkin Community Supported κ° μλ€.
- Zipkin Supported
- brave
- zipkin-js
- zipkin-go
- Zipkin Cummunity Supported
- spring cloud sleuth
- tapper
- appmetrics-zipkin
- htrace
μ΄ μ€μμλ μ°λ¦¬λ Zipkin μ Brave B3-Propagation μ Java ꡬνμ²΄μΈ Spring Cloud Sleuth μ λν΄μ μμλ³Ό κ²μ΄λ€.
Spring Cloud Sleuth λ λΆμ° μΆμ μ μν Spring Boot κΈ°λ°μ auth-configuration μ μ 곡νλ€.
λνμ μΈ Sleuth μ κΈ°λ₯μ λν΄ μ΄μΌκΈ°ν΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€
- Header Propagation μ μ΄μ©νμ¬ Trace μ 보λ₯Ό κΈ°λ‘νλ€.
- TraceId, SpanId λ₯Ό μλμΌλ‘ μμ±ν΄μ€λ€.
- Http μ ν΅ν΄μ Tracing μ 보λ₯Ό Zipkin μΌλ‘ μ μ‘νλ€
- Trace μ λν μ 보λ€μ ν λλ‘ Log Integration μ μ 곡νλ€
Spring Cloud Sleuth μμ Tracer μ Span
Sleuth μλ 2κ°μ§μ ν΅μ¬ μΈν°νμ΄μ€κ° μ‘΄μ¬νλ€.
- Tracer
- Span
Tracer λ Root Span μ μμ±ν μ μλλ‘ λμμ€λ€.
Span μ νλμ μμ
λ¨μλ‘ νΉμ λ
Έλμμ λ°μνλ μΌλ ¨μ κ³Όμ (start & end
) κ° Span μ΄ λλ€.
Span μ Lifecycle
- start
- Span μ΄ μμ±, μμλμμμ μλ―Ένκ³ start timestamp κ° κΈ°λ‘λλ€.
- end
- span μ΄ μ’ λ£λμμμ μλ―Ένκ³ , Span μ Life state κ° end μνμ¬μΌλ§ Zipkin Collector λ‘ μ μ‘μ΄ λλ€.
λ³΄ν΅ Span μ μ¬μ©νκΈ° μν΄μλ Tracer
λ₯Ό autowired νμ¬ μ¬μ©ν μ μλ€.
public class A {
@Autowired
private Tracing tracing;
public void doSomething() {
Tracing current = tracing.current():
// ...
}
}
μμ λ΄μ©λ€μ μ΄νμ μμ μ€μ΅μμ μ‘°κΈ λ μμΈν μμ보λ κ²μΌλ‘ νμ
Zipkin μΌλ‘ Reporting νκΈ°
Spring Cloud Sleuth μμ Span μ΄ λ«νκ² λλ©΄ Zipkin μλ²λ‘ Reporting μ νλ€.
μ΄λ, Sleuth λ₯Ό μ¬μ©νλ€λ©΄ Reporting νλ λ‘μ§μ μ°λ¦¬κ° ꡬμ±νμ§ μμλ λλ€.
RestTemplate, KafkaTemplate, KafkaListener, RedisTemplate λ₯Ό Bean μΌλ‘ λ±λ‘νλ€λ©΄ BeanPostProcessor λ₯Ό ν΅ν΄μ Sleuth κ° Reporting μ μννκΈ° λλ¬Έμ΄λ€.
μ΄ λ€μ μκ°μ μμ Sleuth μ€μ΅μμ λ³Ό μ μμ§λ§ Sleuth λ₯Ό μ¬μ©νμ§ μλ node-express νκ²½μμλ μ΄λ₯Ό μ§μ ꡬνν΄μ Reporting νλ€
Sleuth λ₯Ό μ¬μ©ν κ²½μ° Zipkin μΌλ‘ Report νλ κ³Όμ μ AsyncRepoter μ μν΄ Asynchronous νκ² λμνκΈ° λλ¬Έμ λ³Έ Transaction κ³Όλ 무κ΄νκ² λμνλ€.
μ΄ λ§μ Reporting Span μ λ³΄κ° μ μ€λ μ μλ€λ λ§μ΄λ―λ‘ μ μ€μ λν λλΉλ νμνλ€
Log Integration
Sleuth λ₯Ό μ¬μ©νλ€λ©΄ μ½κ² Log Integration μ΄ κ°λ₯νλ€
Sleuth λ₯Ό μΆκ°νκ² λλ€λ©΄ λ€μκ³Ό κ°μ νμμΌλ‘ λ‘κ·Έκ° μ°νκ² λλ€.
μ¦,
[service-name], [trace-id], [span-id]
ννλ‘ μ°νκ² λλλ°, μ΄ λ§μ TraceId λ‘ λ‘κ·Έλ₯Ό ꡬλΆν μ μκ² λλ€λ κ²μ΄λ€.
μ΄ νΉμ±μ μ΄μ©ν΄μ μΆν Kibana μ κ°μ κ³³μμλ λ‘κ·Έλ₯Ό μ½κ² κ΄λ¦¬ν μ μκ² λλ€.
λκΈ