随着容器技术的不断发展,从单体应用到微服务框架,对于应用的可观测性需求越来越高。除了传统的日志和指标监控方法,应用的调用链追踪OpenTracing API成为了当前微服务框架诊断问题必不可少的方法。
本文主要介绍一种分布式调用链追踪系统Skywalking的简单使用方法,用于广大朋友参考。
SkyWalking 是一个观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA语言探针支持Envoy + Istio构建的Service Mesh。从官网的介绍来看,SkyWalking不单单只是调用链追踪系统,还关注应用的性能消耗,用于分析应用的效率以及报警。
Agent:采集tracing(调用链数据)和metric(指标)信息并上报
OAP:收集tracing和metric信息通过analysis core模块将数据放入持久化容器中(ES,H2(内存数据库),mysql等等),并进行二次统计和监控告警
存储:采集到的调用链追踪信息会存储到ES,MySQL,H2等存储系统
UI:前后端分离,前端负责呈现,并将查询请求封装为graphQL提交给后端,后端通过ribbon做负载均衡转发给OAP集群,再将查询结果渲染展示。
效果图如下:
SkyWalking在物理机或者虚拟机环境下安装部署的步骤,大家可自行百度,本文仅介绍如何用Docker环境,快速搭建SkyWalking用于体验SkyWalking的功能。
工具:
- Docker 19.03.8
- Docker Compose 1.25.4
- 操作系统 Mac OS
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
#切换到包含skywalking docker-compose.yml 文件目录下
docker-compose up -d
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
本文以springboot框架应用为例,尝试体验无侵入式应用调用链追踪的效果,代码传送门,https://github.com/fanyanming2016/sky-springboot
。
@RestController
public class HelloWorldController {
@RequestMapping("/")
public String sayHello() {
return "Hello,SkyWalking!";
}
}
代码功能很简单,仅仅返回一个字符串,没有其他任何手动埋点的逻辑。
虚拟机环境实现应用调用链追踪,仅仅需要用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
命令参数解释:
容器环境与虚拟机环境相比,需要编写应用Dockerfile,并需要包含skywalking agent 工具的基础镜像。简要说明下构建基础镜像步骤。
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
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 .
# 项目根目录下执行
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://localhost:8080/
从效果图可以看出,针对SpringBoot框架的java应用,可以在不用更改代码的情况下,实现Java应用的调用链追踪。
本文通过SpringBoot框架的java应用,验证SkyWalking自动实现Java应用的自动调用链追踪,可见对于以Java技术栈为主的企业来说,SkyWalking能够覆盖大部分使用场景,可以实现各种RPC框架、微服务、云计算、大数据等复杂系统和横跨多个模块/服务/容器的应用的调用链追踪,实现更加实时/准实时的了解线上服务的运行情况的目的。