Skip to content

hellices/2023openinfradays_otel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

2023openinfradays_otel

  • 본 페이지는 2023년도 OpenInfra Community Days Korea 2023에서 시연한 내용을 직접 구성해볼 수 있도록 준비한 자료입니다.
  • 구성에 대하여 문의는 이슈를 통해 주시면 최대한 답변드리겠습니다.

Opentelemetry와 Grafana, prometheus 등을 활용한 대시보드 구성

  • server, client 두 개의 서비스를 기동하여 서비스 간 통신을 그라파나 대시보드를 통해 모니터링/디버깅하는 예제를 구성해 볼 수 있습니다.
  • 두 서버는 각각 opentelemetry instrument sdk를 javaagent에 설정하여 기동합니다.
  • opentelemetry sdk(.jar)는 다음과 같은 역할을 수행합니다.
  1. metric을 노출시켜 prometheus에서 scraping 가능하도록 합니다.
  2. log 내에 trace_id를 보내줍니다.(java mdc - mapped diagnostic context 활용)
  3. trace정보를 수집 가능한 서버로 전송합니다.

00. 프로젝트 구성

path 용도
/client client application 빌드용
/grafana 대시보드 템플릿
/loki loki helm chart value
/otel opentelemetry autoinstrumentation을 위한 custom resource definition
/prometheus prometheus helm chart value
/server server application 빌드용
/tempo tempo helm chart value

01. pre-req. 각주 참고하여 설치

  • kubernetes1 * 참고
  • helm2
  • java 173
  • vs code4 or gradle5

02. monitoring tool install

진행 시 로컬PC의 docker desktop과 kubernetes를 사용하므로 기동중이어야 함.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts

kubectl create namespace metric
helm upgrade -i prometheus prometheus-community/prometheus -f ./prometheus/values.yaml -n metric
helm upgrade -i  grafana grafana/grafana -n metric
helm upgrade -i  -f loki/values.yaml loki grafana/loki -n metric
helm upgrade -i  promtail grafana/promtail -n metric
helm upgrade -i  -f tempo/values.yaml tempo grafana/tempo -n metric

prometheus : cpu, memory 데이터 수집 + server_http_duration_bucket 과 exemplars 로 지연 api 확인 metric 저장소
promtail + loki : promtail이 로그를 수집(logstash 또는 fluentd 대체 가능), loki에 저장(elasticsearch 등 대체 가능) log 저장소
tempo : 분산추적을 위한 저장소. (zipkin&jaeger 등으로 대체 가능) trace 저장소
grafana : 위 세 종류의 telemetry를 조합하여 시각화.

03. application deploy

  • server, client application은 아래와 같이 커맨드라인으로 빌드하거나 vs code에서 gradle extension을 설치해서 빌드한다.

  • database(h2)는 server와 같이 기동되며 인메모리로 실행

  • vs code -> extension -> gradle for java 설치

  • jib 빌드는 링크를 참고

  • server 는 otel Autoinstrumentation 방식으로 배포하였으며 다음과 같은 작업 필요.

helm으로 otel operator 설치 Autoinstrumentation을 위한 crd(custom resource definition)설치 server 배포

  • client의 경우 opentelemetry.jar를 docker image에 추가하는 방식으로 진행.

autoinstrumentation과 docker build 중 택일 가능

# client application 배포
cd client
sudo ./gradlew jibDockerBuild
kubectl apply -f ./kube.yaml

# server app 배포 전 opentelemetry autoinstrumentation을 위한 환경 셋팅
cd ..
kubectl create namespace otel
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm upgrade -i opentelemetry-operator open-telemetry/opentelemetry-operator -n otel --set admissionWebhooks.certManager.enabled=false --set admissionWebhooks.autoGenerateCert=true --wait
kubectl apply -f otel/crd.yaml

# server application 배포
cd server
sudo ./gradlew jibDockerBuild
kubectl apply -f ./kube.yaml

04. application test

kubectl port-forward svc/spring-client 8080:8080 -n metric

another shell

curl localhost:8080/call # 전체 조회
curl "localhost:8080/call/one?name=microsoft" # 단건 조회. 응답 5초 지연
curl "localhost:8080/call/one?name=google" # 단건 조회. 응답 5초 지연
curl "localhost:8080/call/abc" # 404 error
curl "localhost:8080/call/404" # client -> server 호출 시 오류 페이지 조회. client에서는 not found 리턴

05. grafana setting

# grafana admin password 확인
kubectl get secret --namespace metric grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 
# grafana 접속
kubectl port-forward svc/grafana 7777:80 -n metric

http://localhost:7777 에 접속한다.
ID : admin / password : 위에서 확인
connections > data sources > Loki, Prometheus, Tempo를 각각 설정

06. datasource configuration

  • tempo -> url(http://tempo:3100)
  • Service graph -> datasource에 prometheus 추가.
  • 이 때 prometheus는 remote write(-- web.enable-remote-write-receiver)가 활성화되어 있어야 하고 tempo에서 service graph 기능(metricsGenerator)이 켜져야 한다.(각각 value.yaml 참고)

07. dashboard import

  • grafana -> dashboards -> new -> import
  • ./grafana/dashboard.json add

08. 삭제

helm delete tempo -n metric
helm delete promtail -n metric
helm delete prometheus -n metric
helm delete opentelemetry-operator -n otel
helm delete loki -n metric
helm delete grafana -n metric
kubectl delete -f otel/crd.yaml
kubectl delete -f server/kube.yaml
kubectl delete -f client/kube.yaml
kubectl delete namespace otel
kubectl delete namespace metric

Footnotes

  1. docker desktop 설치, kubernetes 활성화 : 설정 -> kubernetes -> Enable Kubernetes

  2. helm install

  3. temurin java

  4. vs code

  5. gradle

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages