SkyWalking分布式链路追踪部署初探
SkyWalking是一款分布式系统中用于提供分布式追踪功能的开源软件。
从5.x开始,项目进化为一个功能完备的APM(Application Performance Management)系统。被用于追踪、监控和诊断分布式系统,特别是使用微服务架构,云原生或容器技术。提供以下主要功能:
分布式追踪和上下文传输
应用、实例、服务性能指标分析
根源分析
应用拓扑分析
应用和服务依赖分析
慢服务检测
性能优化
它的主要特性如下:
多语言探针或类库
Java自动探针,追踪和监控程序时,不需要修改源码。
社区提供的其他多语言探针
.NET Core
Node.js
多种后端存储: ElasticSearch, H2
支持OpenTracing
Java自动探针支持和OpenTracing API协同工作
轻量级、完善功能的后端聚合和分析
现代化Web UI
日志集成
应用、实例和服务的告警
本文主要记录一下如何在windows开发环境下搭建并集成Skywalking的agent实现应用的链路追踪功能。
下载安装SkyWalking的二进制包
在如下地址选择对应的环境下载SkyWalking的二进制包。笔者是windows因此直接下载zip包。
解压二进制包
解压后打开文件夹如下
启动收集器及UI管理界面
SkyWalking 的启动包括两部分,一个是 SkyWalking Collector ,一个是 SkyWalking UI。
bat 为 windows 环境使用,sh 为 linux 环境使用,我们可以分别启动collectorService 和 webappService,也可以通过 startup 一次性全部启动,从 startup 中的命令可以知道其实就是分别启动 collectorService 和 webappService。
这里为了方便直接使用startup启动收集服务和webUI服务。
启动后效果如下
应用集成
由于SkyWalking使用了javaagent作为应用集成方式,应用不需要硬编码即可方便的集成链路追踪能力,这里主要是javaagent的class文件的改写原理,不展开讲解了。
笔者使用了一个springboot应用,打成jar之后,通过 java -jar 方式启动,完整命令如下
java
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar
-jar app.jar
生产环境配置
上面的配置为本地配置,默认将数据上传至本地的Collector, 在生产环境中,需要指定collector的地址,并标记本服务名称,便于在
页面看到调用链信息。
java
-javaagent:/path/skywalking-agent/skywalking-agent-6.0.0-GA/skywalking-agent.jar \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=$sw_agent_collector_backend_services -DSW_LOGGING_LEVEL=$sw_logging_level -DSW_AGENT_NAME=$app_name \
-Dspring.profiles.active=prod \
-jar /app/pmsupbasecore.jar
参数可以使用环境变量指定,对应的解释如下
配置名称 | 解释 |
---|---|
SW_AGENT_COLLECTOR_BACKEND_SERVICES | skywalking的collector地址 |
SW_LOGGING_LEVEL | skywalking的日志等级 |
SW_AGENT_NAME | 应用名称 |
效果验证
这里简单的看下笔者实验的代码
@Controller
public class TestController {
private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);
private static final String MESSAGE = "{\"code\":\"400\",\"msg\":\"FAIL\",\"desc\":\"触发限流\"}";
@ResponseBody
@RequestMapping("ratelimiter")
@RateLimiter(key = "ratedemo:1.0.0", limit = 5, expire = 10, message = MESSAGE)
public String sendPayment(HttpServletRequest request) throws Exception {
this.publish();
return "正常请求";
}
@Resource(name = "rocketMQSimpleProducerAgent")
RocketMQSimpleProducerAgent rocketMQProducerAgent;
@PostConstruct
void init() throws Exception {
rocketMQProducerAgent.init(new RocketMQProducerConfig(
"group-snowalker",
"172.30.83.100:9876"
)).start();
}
public void publish() {
ObjectMapper objectMapper = new ObjectMapper();
for (int i = 0; i < 10; i++) {
try {
MessageBean msg = new MessageBean("rocketmq-simple-msg-test",
"SNOWALKER_TEST",
"SNOWALKER_TEST-TAG",
"localhost.localdomain",
"测试消息简单发送------第" + i + "次",
"10",
"simple-msg-test-" + i);
String message = objectMapper.writeValueAsString(msg);
Message sendMessage = new Message(
msg.getTopicName(), msg.getTagName(), message.getBytes());
rocketMQProducerAgent.getProducer().send(sendMessage, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
LOGGER.info("消息id={}, 发送结果={}" ,sendResult.getMsgId(), sendResult.getSendStatus());
}
@Override
public void onException(Throwable throwable) {
LOGGER.info("消息主题={}, 消息体={}" ,sendMessage.getTopic(), new String(sendMessage.getBody()));
throwable.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
通过访问路径 http://localhost:8080/ratelimiter 路径,往RocketMQ中发送消息,并返回Redis中的限流结果。这里主要访问了三个组件:
- springboot应用
- rocketmq
- redis
发送若干次请求后,打开SkyWalking的UI看到效果如下:
可以看到,SkyWalking支持对redis、rocketMQ的监控,更多的支持列表请参考该链接:支持列表
小结
到这里,我们就搭建并运行完成windows开发环境下的skywalking,更多的使用还需要我们继续探索。