玩转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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章