玩轉SkyWalking7.0-SpringBoot框架應用自動埋點

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集羣,再將查詢結果渲染展示。
效果圖如下:
UI

SkyWalking 容器安裝部署

SkyWalking在物理機或者虛擬機環境下安裝部署的步驟,大家可自行百度,本文僅介紹如何用Docker環境,快速搭建SkyWalking用於體驗SkyWalking的功能。

工具:
- Docker 19.03.8
- Docker Compose 1.25.4
- 操作系統 Mac OS

  1. 準備部署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
  1. 執行docker-compose 命令啓動應用
#切換到包含skywalking docker-compose.yml 文件目錄下
docker-compose up -d
  1. 查看運行狀態,全是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
  1. 本地訪問,瀏覽器輸入 http://localhost:8080/

SpringBoot應用

本文以springboot框架應用爲例,嘗試體驗無侵入式應用調用鏈追蹤的效果,代碼傳送門,https://github.com/fanyanming2016/sky-springboot

@RestController
public class HelloWorldController {
    @RequestMapping("/")
    public String sayHello() {
        return "Hello,SkyWalking!";
    }
}

代碼功能很簡單,僅僅返回一個字符串,沒有其他任何手動埋點的邏輯。

調用鏈追蹤數據流

  1. SkyWalking Agent 以Sidecar的形式部署在應用運行的環境中
  2. Agent上報埋點信息到OPA系統,並存儲到ES
  3. 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 工具的基礎鏡像。簡要說明下構建基礎鏡像步驟。

  1. 下載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
  1. 在解壓的根目錄下,編寫dockerfile
FROM openjdk:8-jre-alpine
ENV LANG=C.UTF-8
ENV TZ=Asia/Shanghai
COPY agent/ /skywalking/agent/
  1. 構建基礎鏡像
# 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

效果圖

瀏覽器訪問應用

http://127.0.0.1:10010/
在這裏插入圖片描述

UI查看調用鏈結果

http://localhost:8080/
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
從效果圖可以看出,針對SpringBoot框架的java應用,可以在不用更改代碼的情況下,實現Java應用的調用鏈追蹤。

結束語

本文通過SpringBoot框架的java應用,驗證SkyWalking自動實現Java應用的自動調用鏈追蹤,可見對於以Java技術棧爲主的企業來說,SkyWalking能夠覆蓋大部分使用場景,可以實現各種RPC框架、微服務、雲計算、大數據等複雜系統,橫跨多個模塊/服務/容器的應用,都可以嘗試SkyWalking方案,實現更加實時/準實時的瞭解線上服務的運行情況的目的。

參考文獻

  1. https://skywalking.apache.org/
  2. https://www.infoq.cn/article/javaagent-illustrated
  3. https://docs.docker.com/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章