SkyWalking 簡介
隨着容器技術的不斷髮展,從單體應用到微服務框架,對於應用的可觀測性需求越來越高。除了傳統的日誌和指標監控方法,應用的調用鏈追蹤OpenTracing API成爲了當前微服務框架診斷問題必不可少的方法。
本文主要介紹一種分佈式調用鏈追蹤系統Skywalking的簡單使用方法,用於廣大朋友參考。
SkyWalking 是一個觀察性分析平臺和應用性能管理系統。提供分佈式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA語言探針支持Envoy + Istio構建的Service Mesh。從官網的介紹來看,SkyWalking不單單只是調用鏈追蹤系統,還關注應用的性能消耗,用於分析應用的效率以及報警。
架構圖
整個系統分爲4部分:
Agent:採集tracing(調用鏈數據)和metric(指標)信息並上報
OAP:收集tracing和metric信息通過analysis core模塊將數據放入持久化容器中(ES,H2(內存數據庫),mysql等等),並進行二次統計和監控告警
存儲:採集到的調用鏈追蹤信息會存儲到ES,MySQL,H2等存儲系統
UI:前後端分離,前端負責呈現,並將查詢請求封裝爲graphQL提交給後端,後端通過ribbon做負載均衡轉發給OAP集羣,再將查詢結果渲染展示。
效果圖如下:
SkyWalking 容器安裝部署
SkyWalking在物理機或者虛擬機環境下安裝部署的步驟,大家可自行百度,本文僅介紹如何用Docker環境,快速搭建SkyWalking用於體驗SkyWalking的功能。
工具:
- Docker 19.03.8
- Docker Compose 1.25.4
- 操作系統 Mac OS
- 準備部署SkyWalking的docker-compose.yml文件內容
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
container_name: elasticsearch
restart: always
ports:
- 9200:9200
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
oap:
image: apache/skywalking-oap-server:7.0.0-es7
container_name: oap
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ui:
image: apache/skywalking-ui:7.0.0
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: oap:12800
- 執行docker-compose 命令啓動應用
#切換到包含skywalking docker-compose.yml 文件目錄下
docker-compose up -d
- 查看運行狀態,全是up表示啓動成功
MacBook-Pro:skywalking root$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------
elasticsearch /usr/local/bin/docker-entr ... Up 0.0.0.0:9200->9200/tcp, 9300/tcp
oap bash docker-entrypoint.sh Up 0.0.0.0:11800->11800/tcp, 1234/tcp, 0.0.0.0:12800->12800/tcp
ui bash docker-entrypoint.sh Up 0.0.0.0:8080->8080/tcp
- 本地訪問,瀏覽器輸入 http://localhost:8080/
SpringBoot應用
本文以springboot框架應用爲例,嘗試體驗無侵入式應用調用鏈追蹤的效果,代碼傳送門,https://github.com/fanyanming2016/sky-springboot
。
@RestController
public class HelloWorldController {
@RequestMapping("/")
public String sayHello() {
return "Hello,SkyWalking!";
}
}
代碼功能很簡單,僅僅返回一個字符串,沒有其他任何手動埋點的邏輯。
調用鏈追蹤數據流
- SkyWalking Agent 以Sidecar的形式部署在應用運行的環境中
- Agent上報埋點信息到OPA系統,並存儲到ES
- UI層查看埋點信息
虛擬機環境自動調用鏈追蹤
虛擬機環境實現應用調用鏈追蹤,僅僅需要用maven工具編譯好應用jar包,執行java命令即可。
java -javaagent:/your-agent-path/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=sk-docker -Dskywalking.collector.backend_service=localhost:11800 -jar springboot-helloworld-1.0-SNAPSHOT.jar
命令參數解釋:
- -javaagent:指的skywalking agent坐在目錄,使得java應用在啓動前被攔截,同時修改應用字節碼,達到自動埋點的功能
- -Dskywalking.agent.service_name:指定被埋點的應用名
- -Dskywalking.collector.backend_service:指定OPA地址
容器環境自動調用鏈追蹤
構建基礎鏡像
容器環境與虛擬機環境相比,需要編寫應用Dockerfile,並需要包含skywalking agent 工具的基礎鏡像。簡要說明下構建基礎鏡像步驟。
- 下載skywalking 二進制包並解壓
wget https://www.apache.org/dyn/closer.cgi/skywalking/6.3.0/apache-skywalking-apm-7.0.0.tar.gz && tar -zxvf apache-skywalking-apm-7.0.0.tar.gz
MacBook-Pro:apache-skywalking-apm-bin-es7 root$ ls
Dockerfile LICENSE README.txt bin licenses tools
Dockerfile.tomcat NOTICE agent config oap-libs webapp
- 在解壓的根目錄下,編寫dockerfile
FROM openjdk:8-jre-alpine
ENV LANG=C.UTF-8
ENV TZ=Asia/Shanghai
COPY agent/ /skywalking/agent/
- 構建基礎鏡像
# SkyWalking Agent 同目錄下執行
docker build -t openjdk:sk-8-jre .
構建SpringBoot應用鏡像
# 項目根目錄下執行
docker build -t sk-test:v0.1 .
運行應用
docker run -e SW_COLLECTOR_SERVERS={你的ip}:11800 -e SW_SERVICE_NAME=docker-boot -p 10010:10010 docker-boot:v0.1
效果圖
瀏覽器訪問應用
UI查看調用鏈結果
http://localhost:8080/
從效果圖可以看出,針對SpringBoot框架的java應用,可以在不用更改代碼的情況下,實現Java應用的調用鏈追蹤。
結束語
本文通過SpringBoot框架的java應用,驗證SkyWalking自動實現Java應用的自動調用鏈追蹤,可見對於以Java技術棧爲主的企業來說,SkyWalking能夠覆蓋大部分使用場景,可以實現各種RPC框架、微服務、雲計算、大數據等複雜系統,橫跨多個模塊/服務/容器的應用,都可以嘗試SkyWalking方案,實現更加實時/準實時的瞭解線上服務的運行情況的目的。