Spring Cloud Sleuth with MySQL

问题描述

我很难找到任何合适的例子来证明我找出痕迹并将其存储在本地的 MysqL 数据库中。 我使用 zipkin 服务器来可视化我对微服务的分布式跟踪。 如果有人在最​​新版本的 gradle 中使用 Spring Cloud Sleuth,请交出可以帮助我的完美示例。

这是我的代码

build.gradle

plugins {
    id 'org.springframework.boot' version '2.2.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}
ext {
    set('springCloudVersion',"Hoxton.SR4")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
    implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage',module: 'junit-vintage-engine'
    }
    implementation group: 'MysqL',name: 'mysql-connector-java',version: '8.0.16'

    // https://mvnrepository.com/artifact/io.zipkin.zipkin2/zipkin-storage-MysqL-v1
    implementation group: 'io.zipkin.zipkin2',name: 'zipkin-storage-MysqL-v1',version: '2.23.2'
    
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc
    implementation group: 'org.springframework.boot',name: 'spring-boot-starter-jdbc',version: '2.5.0'

}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

application.properties

server.port=8083
spring.application.name=service1
#logging.level.org.springframework.web.servlet.dispatcherServlet=DEBUG
spring.sleuth.sampler.percentage=1.0
spring.zipkin.enabled=true
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.enabled=true

spring.zipkin.storage.type=MysqL
spring.datasource.url=jdbc:MysqL://localhost:3306/zipkin
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.schema=classpath:MysqL.sql
spring.datasource.initialization-mode=always
spring.jpa.show-sql=true
spring.sleuth.web.enabled=true

spring.zipkin.sender.type=web

控制器类

@RestController
@Slf4j
@requiredArgsConstructor
public class SpaceShipRestController {

    private final RestTemplate restTemplate;

    @GetMapping("/service1")
    public String service1() {
        log.info("service1 start");
        String service2 = restTemplate.getForObject("http://localhost:8090/service2",String.class);
        String service3 = restTemplate.getForObject("http://localhost:9090/service3",String.class);
        log.info("call" + service2 + "and" + service3);
        return "calling service2";
    }
}

应用程序类

@SpringBootApplication
@EnableAutoConfiguration
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    @Primary
    public MysqLStorage MysqLStorage(DataSource datasource) {
        return MysqLStorage.newBuilder().datasource(datasource).executor(Runnable::run).build();
    }
}

我已经使用 zipkin-server-2.23.2-exec jar 在端口 localhost:9411 作为认端口启动服务器 在 cmd 上使用此命令。 java -jar zipkin-server-2.23.2-exec

我的 zipkin 已启动并且工作正常,我只是坚持将跟踪记录存储在我的 MysqL 数据库中,表正在正确创建。但是记录是空的。 我不知道为什么我认为我缺少任何配置。 我关注了 this 文章,因为他们显示数据库中存储跟踪。 任何人都可以向我建议我要评估的地方。

My zipkin UI looks like

My MySQL DB

解决方法

请使用 Spring Cloud Sleuth 3.1.0-SNAPSHOT(通过 2021.0.0-SNAPSHOT 火车,我们应该在 6 月 AFAIR 有 M1)。您可以在此处找到示例 https://github.com/spring-cloud-samples/spring-cloud-sleuth-samples/tree/3.1.x/data(请记住这部分 https://github.com/spring-cloud-samples/spring-cloud-sleuth-samples/blob/3.1.x/data/pom.xml#L33-L38)和文档 https://docs.spring.io/spring-cloud-sleuth/docs/3.1.0-SNAPSHOT/reference/html/integrations.html#sleuth-jdbc-integration。为了您的方便,我复制下面的代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.sleuthsamples</groupId>
    <artifactId>data</artifactId>
    <version>1.0.0-SLEUTH</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <spring-cloud.version>2021.0.0-SNAPSHOT</spring-cloud.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- Either p6spy or datasource-proxy -->
        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.9.1</version>
            <scope>runtime</scope>
        </dependency>
        <!-- Either p6spy or datasource-proxy -->
        <!-- <dependency>
            <groupId>net.ttddyy</groupId>
            <artifactId>datasource-proxy</artifactId>
            <version>1.7</version>
            <scope>runtime</scope>
        </dependency> -->

                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-sleuth</artifactId>
                </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/release</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-plugin-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-plugin-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/release</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

如果不想使用快照,则需要使用 Brave 的 p6spy 支持 https://github.com/openzipkin/brave/tree/master/instrumentation/p6spy 。请将 io.zipkin.brave:brave-instrumentation-p6spy 添加到类路径并更改项目自述文件中显示的属性