基于docker部署skywalking实现全链路监控
一、概述
简介
skywalking是一个开放源码的,用于收集、分析,聚合,可视化来自于不同服务和本地基础服务的数据的可观察的平台, skywalking提供了一个简单的方法来让你对你的分布式系统甚至是跨云的服务有清晰的了解。 它更像是一个现代的系统性能管理,特别为分布式系统而设计。
功能
skywalking提供了在很多不同的场景下用于观察和监控分布式系统的方式。 首先,像传统的方法,skywalking为java,c#,Node.js等提供了自动探针代理. 同时,它为Go,C++提供了手工探针。 随着本地服务越来越多,需要越来越多的语言,掌控代码的风险也在增加, Skywalking可以使用网状服务探针收集数据,以了解整个分布式系统。 通常,skywalking提供了观察service,service instance,endpoint的能力。
- service: 一个服务
- Service Instance: 服务的实例(1个服务会启动多个节点)
- Endpoint: 一个服务中的其中一个接口
架构图
二、快速部署
环境说明
操作系统:centos 7.6
docker版本:19.03.12
ip地址:192.168.31.146
配置:4核8g
下载镜像
docker pull elasticsearch:7.5.1
docker pull apache/skywalking-oap-server:6.6.0-es7
docker pull apache/skywalking-ui:6.6.0
说明:使用最新版本的elasticsearch和skywalking-oap-server镜像,启动会有问题。
因此,必须使用上述版本才可以。
下载源码包,下面会用到agent
https://archive.apache.org/dist/skywalking/6.6.0/apache-skywalking-apm-6.6.0.tar.gz
安装elasticsearch
修改系统参数
vi /etc/sysctl.conf
调整参数
vm.max_map_count=262144
刷新参数
sysctl -p
启动elasticsearch
docker run -d --name=es7
-p 9200:9200 -p 9300:9300
-e "discovery.type=single-node" elasticsearch:7.5.1
等待30秒左右,查看docker日志,如果有出现
"publish_address {172.17.0.2:9300}, bound_addresses {0.0.0.0:9300}"
说明启动成功了。
创建持久化目录,并重启启动elasticsearch
mkdir -p /data/elasticsearch
docker cp es7:/usr/share/elasticsearch/data /data/elasticsearch/
docker cp es7:/usr/share/elasticsearch/logs /data/elasticsearch/
docker rm -f es7
docker run -d --name=es7
--restart=always
-p 9200:9200 -p 9300:9300
-e "discovery.type=single-node"
-v /data/elasticsearch/data:/usr/share/elasticsearch/data
-v /data/elasticsearch/logs:/usr/share/elasticsearch/logs
elasticsearch:7.5.1
安装oap
注意:等待elasticsearch完全启动之后,再启动oap
docker run --name oap --restart always -d
--restart=always
-e TZ=Asia/Shanghai
-p 12800:12800
-p 11800:11800
--link es7:es7
-e SW_STORAGE=elasticsearch
-e SW_STORAGE_ES_CLUSTER_NODES=es7:9200
apache/skywalking-oap-server:6.6.0-es7
说明:这里指定elasticsearch 来存储数据
安装ui
docker run -d --name skywalking-ui
--restart=always
-e TZ=Asia/Shanghai
-p 8088:8080
--link oap:oap
-e SW_OAP_ADDRESS=oap:12800
apache/skywalking-ui:6.6.0
注意:这里映射的端口为8088,防止端口冲突。
三、spring-boot实例部署
项目地址
这里一个SpringBootDemo为例,github地址:
https://github.com/solochen84/SpringBootDemo
制作jar包
找一台安装了jdk1.8和maven的服务器,使用maven构建命令进行打包
mvn clean package
打包好之后,会在target目录,生成jar包,文件名为:spring-boot-demo-0.0.1-SNAPSHOT.jar
启动jar包
原来的启动方式为:
java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar
那么使用skywalking agent,启动命令为:
java -javaagent:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=xxxtest -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar /opt/spring-boot-demo-0.0.1-SNAPSHOT.jar
说明:
-javaagent 指定agent包位置。这里我将apache-skywalking-apm-6.6.0.tar.gz解压到/opt目录了,因此路径为:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name 指定服务名
-Dskywalking.collector.backend_service 指定skywalking oap地址,由于在本机,地址为:127.0.0.1:11800
-jar 指定jar包的路径,这里我直接放到/opt/目录了。
访问ui
http://192.168.31.146:8088/
效果如下:
因为机制为懒加载,所以当只有你调用该java接口时,页面上才有显示。所以第一次访问时,数据是没有的。
访问demo接口
SpringBootDemo启动端口为:8080,api接口有3个
GET /
GET /?name=cheney
GET /random
页面多刷新几次接口
http://192.168.31.146:8080/
http://192.168.31.146:8080/?name=cheney
http://192.168.31.146:8080/randomAbout
仪表盘
刷新ui页面,选择最近15分钟的。
拓扑图
点击拓扑图,选择最近15分钟的
可以看到xxxtest,就是我们定义的服务名称
追踪
同样,可是查看最近15分钟的。
告警
查看最近15分钟的。
指标
这里可以选定3个指标,进行对比。
本文参考链接:
https://blog.csdn.net/OptimusPP/article/details/106425807
- Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- iOS runtime探究(五): 从runtime开始深入weak实现机理你要知道的runtime都在这里
- Java8 Lambda表达式与Stream API (二): Stream API的使用你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- Python Garbage Collection 与 Objective-C ARCPython GC 与 Objective-C ARC
- SpringMVC DispatcherServlet执行流程及源码分析你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里
- iOS runtime探究(三): 从runtime开始理解OC的属性property你要知道的runtime都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)1
- KVC 使用方法详解及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)2
- 神经网络-感知器
- NSNotificationCenter 通知的使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里
- Protocol与Delegate 使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里
- iOS多线程——你要知道的GCD都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
- NSCopying和NSCoding对象序列化反序列化基础详解你要知道的NSCopying、NSCoding协议及对象序列化和反序列化都在这里
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RocketMQ使用过滤器filterServer(4.3版本后)
- Python+Appium运行简单的demo,你需要理解Appium运行原理!
- 网站日志分析完整实践【技术创造101训练营】
- HTML前端知识
- 掌握 AST,轻松落地关键业务「技术创作101训练营」
- 一文轻松学会linux字符设备驱动
- leetcode树之N叉树的前序遍历
- 2020-09-20:如何判断一个数是质数?
- 金九银十Android面试复习题集:关于四大组件中的Activity你了解多少?
- HaseMap的循环姿势你真的懂了吗?
- 历经14天自定义3个注解解决项目的3个Swagger难题
- VUE开发–获取DOM对象和组件对象(十九)
- RASP攻防 —— RASP安全应用与局限性浅析
- JavaScript 交换值的奇思妙想
- Docker体验(一)