일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- java static resources
- Istio
- jpa auto increment
- sidecar
- spring cloud load balancer
- spring boot hot swapping
- Spring boot
- redis cluster
- redis ha
- tracing tool
- <iframe src="http://erea.tistory.com/attachment/cfile21.uf@997995485B2F785A3292EE.svg"></iframe>
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect x="10" y="10" height="100" width="100" style="stroke:#ff0000; fill: #0000ff"/> </svg>
- Spring Cloud Config
- spring boot ssl
- msa 4.0
- intelij devtools
- spring boot jks
- spring boot http client
- sidecar patern
- high availabillty
- Spring Cloud Bus
- Service Mesh
- kubernates
- Distributed Tracing System
- spring boot ssl verify skip
- intelij spring boot devtools
- spring cloud zuul
- MySQL
- spring cloud api gateway
- spring boot 2.0 ssl
- Today
- Total
erea
Jaeger (Distributed Tracing System) 본문
Overview
jaeger란? Uber Technologies에서 만든 분산형 추적시스템 오픈소스로서 마이크로 서비스 기반 분산 시스템 모니터링을 할수가 있다.
현재는 CNCF(Cloud Native Computing Foundation)의 프로젝트이다.
- 분산형 추적시스템에 대표적인 오픈소스로는 zipkin, jagger, appdash 가 대표적이다.
- 분산 컨텍스트 전파
- 분산 트랜잭션 모니터링
- 근본 원인 분석
- 서비스 의존성 분석
- 성능 / 대기 시간 최적화
Installation
client
application.yml
compile group: 'io.opentracing.contrib', name:'opentracing-spring-web-autoconfigure', version: '0.0.4' compile group: 'com.uber.jaeger', name: 'jaeger-core', version: '0.27.0
jaegerConfig.java
import com.uber.jaeger.Configuration; import com.uber.jaeger.samplers.ProbabilisticSampler; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @org.springframework.context.annotation.Configuration public class JaegerConfig { @Value("trace.url") String JaggerUrl; @Bean public io.opentracing.Tracer jaggerTracer() { return new Configuration("ios", new Configuration.SamplerConfiguration(ProbabilisticSampler.TYPE, 1, JaggerUrl), new Configuration.ReporterConfiguration()).getTracer(); } }--
Server
Helm chart
value.yaml
# Default values for jaeger. # Default values for jaeger. # This is a YAML-formatted file. # Jaeger values are grouped by component. Cassandra values override subchart values provisionDataStore: cassandra: false elasticsearch: true tag: 1.9.0 storage: # allowed values (cassandra, elasticsearch) type: elasticsearch cassandra: host: cassandra port: 9042 user: user password: password elasticsearch: scheme: http host: elasticsearch port: 9200 user: elastic password: changeme nodesWanOnly: false # Begin: Override values on the Cassandra subchart to customize for Jaeger cassandra: image: tag: 3.11.3 persistence: # To enable persistence, please see the documentation for the Cassandra chart enabled: false config: cluster_name: jaeger seed_size: 1 dc_name: dc1 rack_name: rack1 endpoint_snitch: GossipingPropertyFileSnitch # End: Override values on the Cassandra subchart to customize for Jaeger # Begin: Default values for the various components of Jaeger # This chart has been based on the Kubernetes integration found in the following repo: # https://github.com/jaegertracing/jaeger-kubernetes/blob/master/production/jaeger-production-template.yml # # This is the jaeger-cassandra-schema Job which sets up the Cassandra schema for # use by Jaeger schema: annotations: {} image: jaegertracing/jaeger-cassandra-schema pullPolicy: IfNotPresent # Acceptable values are test and prod. Default is for production use. mode: prod resources: {} # limits: # cpu: 500m # memory: 512Mi # requests: # cpu: 256m # memory: 128Mi ## Additional pod labels ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} # Begin: Override values on the Elasticsearch subchart to customize for Jaeger elasticsearch: image: tag: "5.4" cluster: name: "tracing" data: persistence: enabled: false rbac: create: false agent: enabled: true annotations: {} image: jaegertracing/jaeger-agent pullPolicy: IfNotPresent collector: host: null port: null cmdlineParams: {} daemonset: useHostPort: false service: annotations: {} # List of IP ranges that are allowed to access the load balancer (if supported) loadBalancerSourceRanges: [] type: LoadBalancer # zipkinThriftPort :accept zipkin.thrift over compact thrift protocol zipkinThriftPort: 5775 # compactPort: accept jaeger.thrift over compact thrift protocol compactPort: 6831 # binaryPort: accept jaeger.thrift over binary thrift protocol binaryPort: 6832 # samplingPort: (HTTP) serve configs, sampling strategies samplingPort: 5778 resources: {} # limits: # cpu: 500m # memory: 512Mi # requests: # cpu: 256m # memory: 128Mi nodeSelector: {} podAnnotations: {} ## Additional pod labels ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} ## Allow the scheduling on tainted nodes (requires Kubernetes >= 1.6) ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ tolerations: [] useHostNetwork: false dnsPolicy: ClusterFirst collector: enabled: true annotations: {} image: jaegertracing/jaeger-collector pullPolicy: IfNotPresent dnsPolicy: ClusterFirst cmdlineParams: {} replicaCount: 1 service: annotations: {} # List of IP ranges that are allowed to access the load balancer (if supported) loadBalancerSourceRanges: [] type: ClusterIP # tchannelPort: used by jaeger-agent to send spans in jaeger.thrift format tchannelPort: 14267 # httpPort: can accept spans directly from clients in jaeger.thrift format httpPort: 14268 # can accept Zipkin spans in JSON or Thrift zipkinPort: 9411 healthCheckPort: 14269 resources: {} # limits: # cpu: 1 # memory: 1Gi # requests: # cpu: 500m # memory: 512Mi nodeSelector: {} podAnnotations: {} ## Additional pod labels ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} ## Allow the scheduling on tainted nodes (requires Kubernetes >= 1.6) ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ tolerations: [] query: enabled: true annotations: {} image: jaegertracing/jaeger-query pullPolicy: IfNotPresent dnsPolicy: ClusterFirst cmdlineParams: {} healthCheckPort: 16687 basePath: / replicaCount: 1 service: annotations: {} type: ClusterIP # List of IP ranges that are allowed to access the load balancer (if supported) loadBalancerSourceRanges: [] # queryPort: externally accessible port for UI and API queryPort: 80 # targetPort: the internal port the UI and API are exposed on targetPort: 16686 ingress: enabled: false annotations: {} # Used to create an Ingress record. # hosts: # - chart-example.local # annotations: # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" # tls: # Secrets must be manually created in the namespace. # - secretName: chart-example-tls # hosts: # - chart-example.local resources: {} # limits: # cpu: 500m # memory: 512Mi # requests: # cpu: 256m # memory: 128Mi nodeSelector: {} podAnnotations: {} ## Additional pod labels ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} ## Allow the scheduling on tainted nodes (requires Kubernetes >= 1.6) ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ tolerations: [] spark: enabled: false annotations: {} image: jaegertracing/spark-dependencies tag: latest pullPolicy: Always schedule: "49 23 * * *" successfulJobsHistoryLimit: 5 failedJobsHistoryLimit: 5 resources: {} # limits: # cpu: 500m # memory: 512Mi # requests: # cpu: 256m # memory: 128Mi nodeSelector: {} ## Additional pod labels ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ podLabels: {} ## Allow the scheduling on tainted nodes (requires Kubernetes >= 1.6) ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ tolerations: [] # End: Default values for the various components of Jaeger hotrod: enabled: false replicaCount: 1 image: repository: jaegertracing/example-hotrod tag: latest pullPolicy: Always service: annotations: {} name: hotrod type: ClusterIP # List of IP ranges that are allowed to access the load balancer (if supported) loadBalancerSourceRanges: [] externalPort: 80 internalPort: 8080 ingress: enabled: false # Used to create Ingress record (should be used with service.type: ClusterIP). hosts: - chart-example.local annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" tls: # Secrets must be manually created in the namespace. # - secretName: chart-example-tls # hosts: # - chart-example.local resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi tracing: host: null port: 6831
local docker
docker run --rm -it --network=host jaegertracing/all-in-one
Zipikin vs Jaeger
Launguage
|
Zipkin |
Jaeger |
C++ |
Unofficial |
Official |
C# |
Official |
Official |
Go |
Official |
Official |
Java | Official | Official |
Python |
Unofficial |
Official |
Ruby |
Official |
Unofficial |
Scala |
Official |
Unofficial(or use the Java library) |
Node.js |
Official |
Official |
PHP |
Unofficial |
Unofficial |
Framework & Library
zipkin의 경우 인기있는 프레임워크를 지원하고 데이터베이스 드라이버와 같은 라이브러리를 지원한다.
jagger의 경우 Open Tracinginstrumentation libraries 를 활용한 다양한 라이브러리로 구현이 가능하다
jager는 또 gRPC, Thrift 및 AWS SDK 도구가 포함되어있다.
둘다 백엔드는 카산드라와 엘라스틱서치를 지원한다.
Jaeger는 CNCF의 일부로 당연히 kubernetes환경에 적합하게 설계되어있다.
helm 차트 템플릿 과 Envoy 또는 Isito 와 같은 서비스 프록시를 Jaeger Suppoter와 함께 사용하면 컨테이너에서 호출을 추적하는 것이
용이하다.
즉 k8s 통합환경에서 분산 추적에 맞게 설계되어있다.
Zipkin은 Docker 이미지와 Java 라이브러리를 제공Jaeger와 달리 Zipkin은 수집기, 저장소, API 및 UI가 포함 된 단일 프레임워크이다.
Conclusion
production환경이 kubernetes면 무조건 jaeger를 단일 환경 및 모놀리틱 시스템에는 zipkin을 고려해볼만 하다
즉 컨테이너 환경에는 jaeger로 가야되는게 맞는거 같다.
또한 jaeger안에는 expoter로 zipkin도 있기때문에 zipkin도 통합할수 있다.
즉 jaeger를 써보고 맞지않는다면 zipkin을 고려해보면 좋겠다.
'devops > msa' 카테고리의 다른 글
Microservice 4.0 (Istio Service Mesh and Serverless) (0) | 2018.10.11 |
---|---|
istio (0) | 2018.10.11 |