文章目录
  1. 1. 下载安装SkyWalking的二进制包
  2. 2. 解压二进制包
  3. 3. 启动收集器及UI管理界面
  4. 4. 应用集成
  5. 5. 生产环境配置
  6. 6. 效果验证
  7. 7. 小结

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中的限流结果。这里主要访问了三个组件:

  1. springboot应用
  2. rocketmq
  3. redis

发送若干次请求后,打开SkyWalking的UI看到效果如下:

效果1

效果2

效果3

可以看到,SkyWalking支持对redis、rocketMQ的监控,更多的支持列表请参考该链接:支持列表

小结

到这里,我们就搭建并运行完成windows开发环境下的skywalking,更多的使用还需要我们继续探索。

文章目录
  1. 1. 下载安装SkyWalking的二进制包
  2. 2. 解压二进制包
  3. 3. 启动收集器及UI管理界面
  4. 4. 应用集成
  5. 5. 生产环境配置
  6. 6. 效果验证
  7. 7. 小结
Fork me on GitHub