一、Skywalking概述

1、Skywalking介绍

Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。

Skywalking是一个国产的开源框架,2015年由吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。

2、Skywalking架构图

整个架构,分成上、下、左、右四部分

1)上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。Agent 收集 SkyWalking Tracing 数据,传递给服务器。

2)下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。

3)右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。

4)左部分 SkyWalking UI :负责提供控台,查看链路等等。

SkyWalking 三个核⼼部分

Agent(探针):Agent 运⾏在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC ⽅式上报给 SkyWalking 后端。

OAP:SkyWalking 的后端服务,⼀个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,进⾏流式分析,最终将分析得到的结果写⼊持久化存储中,另⼀个是负责响应 SkyWalking UI 界⾯发送来的查询请求。

UI 界⾯:展示查询结果。

SkyWalking Agent实现原理

SkyWalking Agent是通过Java Agent的方式随着应用程序一起启动,然后通过Byte Buddy库动态插入埋点信息收集Trace信息。Java Agent本质上就是⼀个Jar包,它会调⽤ Instrumentation API,来修改已经加载到JVM中的字节码。Instrumentation API由JVM提供⽤来修改已加载类的⼯具,可以提供Java语⾔编写的插桩功能,动态修改运⾏时代码的能⼒。

Java Agent具有两种加载⽅式

静态加载

这种⽅式下,在应⽤程序的任何代码被执⾏之前,就加载Agent以修改字节码。静态加载需要使⽤JVM 的-javaagent参数:

java -javaagent:agent.jar -jar application.jar
# 可以同时加载多个Agents
java -javaagent:agentA.jar -javaagent:agentB.jar application.jar

动态加载

这种⽅式下,Agent可以在运⾏时动态按需的加载。动态加载需要调⽤Java Attach API。

// 根据PID查找⽬标JVM,并连接到JVM 
VirtualMachine jvm = VirtualMachine.attach(jvmPid); 
// 加载Agent 
jvm.loadAgent(agentFile.getAbsolutePath()); 
// 取消到JVM的连接 
jvm.detach();

Instrumentation

      Instrumentation是java提供的修改已经加载到JVM中字节码的API。使⽤ Instrumentation,开发者可以构建⼀个独⽴于应⽤程序的代理程序(Agent),⽤来监测和协助运⾏在 JVM 上的程序,甚⾄能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运⾏时虚拟机监控和Java 类操作了,这样的特性实际上提供了⼀种虚拟机级别⽀持的 AOP 实现⽅式,使得开发者⽆需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。JVM级别AOP。

        在JDK 1.6以前,instrument只能在JVM刚启动开始加载类时生效,而在JDK 1.6之后,instrument支持了在运行时对类定义的修改。在 Java SE 6 ⾥⾯,instrumentation 包被赋予了更强⼤的功能:启动后的instrument、本地代码 (native code)instrument,以及动态改变 classpath 等等。这些改变,意味着 Java 具有更强的动态控制、解释能⼒,它使得 Java 语⾔变得更加灵活多变。

二、Docker环境下使用docker-compose部署Skywalking

1、相关组件及版本

序号

组件

版本

备注

1

skywalking-oap-server

8.9.1

2

elasticsearch

7.17.6

3

skywalking-ui

8.9.1

4

apache-skywalking-java-agent

8.15.0

2、创建目录赋予权限

mkdir elasticsearch
cd elasticsearch
mkdir logs
mkdir data
chmod 775 logs
chmod 775 data

3、准备docker-compose.yml文件

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.17.6
    container_name: elasticsearch
    restart: always
    ports:
      - 9200:9200
    environment:
      - "TAKE_FILE_OWNERSHIP=true" #volumes 挂载权限 如果不想要挂载es文件改配置可以删除
      - "discovery.type=single-node" #单机模式启动
      - "TZ=Asia/Shanghai" # 设置时区
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置jvm内存大小
    volumes:
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
      - ./elasticsearch/data:/usr/share/elasticsearch/data
     #- ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ulimits:
      memlock:
        soft: -1
        hard: -1
  skywalking-oap-server:
    image: apache/skywalking-oap-server:8.9.1
    container_name: skywalking-oap-server
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch  # 指定ES版本
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      TZ: Asia/Shanghai
    #volumes:
     #- ./oap/conf/alarm-settings.yml:/skywalking/config/alarm-settings.yml
  skywalking-ui:
    image: apache/skywalking-ui:8.9.1
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap-server
    links:
      - skywalking-oap-server
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: http://skywalking-oap-server:12800
      TZ: Asia/Shanghai

3、执行启动服务命令

docker-compose up -d

4、访问UI地址http:${IP}:8080

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐