文章目錄
- 下載下傳包
- 配置
- 啟動運作
- idea配置運作skywalking的程式配置jvm參數
- 建立spring-cloud-skywalking-demo項目
- 修改pom.xml
- 建立logback-spring.xml
- 建立application.yml
- 修改SpringCloudSkywalkingDemoApplication
- 建立IndexController
- 建立ProfileController
- 建立UserController
- 建立UserMapper
- 建立User
- 建立UserService
- 建立UserServiceImpl
- 驗證Spring Cloud Skywalking是否工作
下載下傳包
APM為v8.9.1 Agents為v8.10.0
如下圖(示例):
百度雲盤分享:
連結:https://pan.baidu.com/s/16zpZHcKqSoui3HUiUrqGnQ?pwd=2022
提取碼:2022
配置
資料庫使用預設的H2資料庫,我使用預設配置,暫時不作修改
application.yml的storage可以選擇資料庫
如下圖(示例):
如果需要修改通路端口可以在這裡修改
如下圖(示例):
webapp的webapp.yml修改server.port即可,我這裡還是用的預設的
啟動運作
運作前需要保證電腦組態了JAVA_HOME
如下圖(示例):
輕按兩下檔案直接運作
如下圖(示例):
通路http://127.0.0.1:8080
如下圖(示例):
idea配置運作skywalking的程式配置jvm參數
如下圖(示例):
①配置VM options(skywalking-agent.jar所在位置):-javaagent:E:/skywalking/skywalking-agent/skywalking-agent.jar
注意事項:由于Skywalking 預設是不支援 Spring Cloud Gateway ,若為Cloud服務,需要将optional-plugins目錄中最新的apm-spring-cloud-gateway*放入plugins目錄中
②配置 Program arguments(Your_ApplicationName為目前的服務名稱):-Dskywalking.agent.service_name=Your_ApplicationName
③配置指向寫傳入連結路資料的伺服器位址-Dskywalking.collector.backend_service=localhost:11800
文章目錄
- 下載下傳包
- 配置
- 啟動運作
- idea配置運作skywalking的程式配置jvm參數
- 建立spring-cloud-skywalking-demo項目
- 修改pom.xml
- 建立logback-spring.xml
- 建立application.yml
- 修改SpringCloudSkywalkingDemoApplication
- 建立IndexController
- 建立ProfileController
- 建立UserController
- 建立UserMapper
- 建立User
- 建立UserService
- 建立UserServiceImpl
- 驗證Spring Cloud Skywalking是否工作
建立spring-cloud-skywalking-demo項目
項目代碼:https://gitee.com/java_wxid/java_wxid/tree/master/demo/spring-cloud-skywalking-demo 項目結構如下(示例):
修改pom.xml
代碼如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-skywalking-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-skywalking-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.17</version>
</dependency>
<!-- mybatis自動配置依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- SkyWalking 工具類 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.10.0</version>
</dependency>
<!-- apm-toolkit-logback-1.x -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.10.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
建立logback-spring.xml
代碼如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" debug="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<!--日志存放路徑-->
<property name="PATH" value="logs"/>
<property name="FILE_NAME" value="${spring.application.name}"/>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>
%black(%d{ISO8601}) [%tid] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</encoder>
</appender>
<!--trace-->
<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/${FILE_NAME}_trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/${FILE_NAME}_trace.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>60</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %highlight([%-5level]) %green([%15.15thread]) %cyan([%logger:%line])--%mdc{client} %msg%n</pattern>
</encoder>
</appender>
<!--error-->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/${FILE_NAME}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/${FILE_NAME}_error.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>60</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %highlight([%-5level]) %green([%15.15thread]) %cyan([%logger:%line])--%mdc{client} %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="info">
<appender-ref ref="Console" />
<appender-ref ref="TRACE_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
建立application.yml
代碼如下(示例):
server:
port: 8199
spring:
application:
name: springboot-skywalking-demo
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://139.224.137.74:3306/syncdemo?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: ca0a997ee4770063
修改SpringCloudSkywalkingDemoApplication
代碼如下(示例):
package com.example.springcloudskywalkingdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;
@MapperScan("com.example.springcloudskywalkingdemo.dao")
@SpringBootApplication
public class SpringCloudSkywalkingDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudSkywalkingDemoApplication.class, args);
}
}
建立IndexController
代碼如下(示例):
package com.example.springcloudskywalkingdemo.controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@RestController
public class IndexController {
@RequestMapping("/")
public String hello(){
return "hello fox";
}
@RequestMapping("/notify")
public String notify(@RequestBody Object obj){
//TODO 告警資訊,給技術負責人發短信,釘釘消息,郵件,微信通知等
System.err.println(obj.toString());
return "notify successfully";
}
}
建立ProfileController
代碼如下(示例):
package com.example.springcloudskywalkingdemo.controller;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@RestController
public class ProfileController {
@RequestMapping("/profile")
public String profile(){
process();
return "success";
}
@Trace
private void process(){
ExecutorService executorService = Executors.newFixedThreadPool(2);
CountDownLatch countDownLatch = new CountDownLatch(2);
executorService.submit(new Runnable() {
@Override
public void run() {
countDownLatch.countDown();
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
// countDownLatch.countDown();
}
});
try {
countDownLatch.await(500, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
建立UserController
代碼如下(示例):
package com.example.springcloudskywalkingdemo.controller;
import com.example.springcloudskywalkingdemo.entity.User;
import com.example.springcloudskywalkingdemo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Optional;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/info/{id}")
public User info(@PathVariable("id") Integer id){
if(id==4){
throw new IllegalArgumentException("參數異常");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return userService.getById(id);
}
@RequestMapping("/list")
public List<User> list(){
//TraceContext可以綁定key-value
TraceContext.putCorrelation("name", "liaozhiwei");
Optional<String> op = TraceContext.getCorrelation("name");
log.info("name = {} ", op.get());
//擷取跟蹤的traceId
String traceId = TraceContext.traceId();
log.info("traceId = {} ", traceId);
return userService.list();
}
}
建立UserMapper
代碼如下(示例):
package com.example.springcloudskywalkingdemo.dao;
import com.example.springcloudskywalkingdemo.entity.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@Repository
public interface UserMapper {
@Select("select * from user")
List<User> list();
@Select("select * from user where id=#{id}")
User getById(Integer id);
}
建立User
代碼如下(示例):
package com.example.springcloudskywalkingdemo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
}
建立UserService
代碼如下(示例):
package com.example.springcloudskywalkingdemo.service;
import com.example.springcloudskywalkingdemo.entity.User;
import java.util.List;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
public interface UserService {
List<User> list();
User getById(Integer id);
}
建立UserServiceImpl
代碼如下(示例):
package com.example.springcloudskywalkingdemo.service.impl;
import com.example.springcloudskywalkingdemo.dao.UserMapper;
import com.example.springcloudskywalkingdemo.entity.User;
import com.example.springcloudskywalkingdemo.service.UserService;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhiwei Liao
* @Description
* @Date create in 2022/9/12 0012 21:03
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Trace
@Tag(key = "list", value = "returnedObj")
@Override
public List<User> list(){
return userMapper.list();
}
@Trace
@Tags({@Tag(key = "param", value = "arg[0]"),
@Tag(key = "user", value = "returnedObj")})
@Override
public User getById(Integer id){
return userMapper.getById(id);
}
}
驗證Spring Cloud Skywalking是否工作
調用接口
如下圖(示例):
TID查詢的追蹤ID
如下圖(示例):
調用鍊路顯示