当前位置: 代码网 > it编程>编程语言>Java > SpringCloud集成Micrometer Tracing的代码工程

SpringCloud集成Micrometer Tracing的代码工程

2024年12月05日 Java 我要评论
1.什么是 micrometer tracing?micrometer tracing 是一个用于微服务架构的追踪库,它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息。它是 mi

1.什么是 micrometer tracing?

micrometer tracing 是一个用于微服务架构的追踪库,它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息。它是 micrometer 库的一部分,micrometer 是一个用于应用程序监控的指标收集工具,支持多种监控系统,如 prometheus、graphite 和 influxdb。

micrometer tracing 旨在帮助开发者和运维人员理解微服务之间的交互,识别性能瓶颈,并提高系统的可观察性。通过追踪请求的生命周期,micrometer tracing 可以提供详细的调用链信息,帮助团队快速定位问题。

micrometer tracing 的优势

  • 简单易用:micrometer tracing 提供了简单的注解和 api,使得在应用程序中添加追踪变得非常容易。
  • 与 micrometer 生态系统集成:作为 micrometer 的一部分,micrometer tracing 可以与其他监控工具无缝集成,提供全面的监控解决方案。
  • 灵活的采样策略:用户可以根据需求自定义采样策略,以平衡追踪的详细程度和性能开销。
  • 丰富的上下文信息:通过 tags 和 span,用户可以获得丰富的上下文信息,帮助快速定位问题。

micrometer tracing 的核心概念

  • span:span 是追踪的基本单位,表示一个操作的开始和结束。每个 span 都有一个唯一的标识符(span id),并且可以包含父 span 的信息,从而形成一个调用链。

  • trace:trace 是由多个 span 组成的,表示一个请求在系统中的完整生命周期。每个 trace 都有一个唯一的标识符(trace id),可以用来追踪整个请求的路径。

  • tags:tags 是附加到 span 上的键值对,用于提供额外的上下文信息,例如服务名称、方法名称、状态码等。tags 可以帮助用户更好地理解和分析追踪数据。

  • sampler:sampler 决定哪些请求将被追踪。可以根据请求的特征(如请求类型、服务名称等)配置采样策略,以减少性能开销。

2.环境搭建

pull images

docker pull openzipkin/zipkin

run docker

docker run -d -p 9411:9411 openzipkin/zipkin

web ui

http://localhost:9411

3.代码工程

实验目标

在 spring cloud 应用程序中使用 micrometer tracing

添加依赖

pom.xml 中添加 micrometer tracing 和 spring cloud sleuth 的依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactid>springcloud-demo</artifactid>
        <groupid>com.et</groupid>
        <version>1.0-snapshot</version>
    </parent>
    <modelversion>4.0.0</modelversion>

    <artifactid>spring-cloud-sleuth</artifactid>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-actuator</artifactid>
        </dependency>
        <dependency>
            <groupid>io.micrometer</groupid>
            <artifactid>micrometer-tracing</artifactid>
        </dependency>
        <dependency>
            <groupid>io.micrometer</groupid>
            <artifactid>micrometer-tracing-bridge-otel</artifactid>
        </dependency>
        <dependency>
            <groupid>io.opentelemetry</groupid>
            <artifactid>opentelemetry-exporter-zipkin</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-aop</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-aop</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>
        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
        </dependency>
    </dependencies>

</project>

配置类

package com.et.config;

import io.micrometer.observation.observationregistry;
import io.micrometer.observation.aop.observedaspect;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration
public class observedaspectconfiguration {

    @bean
    public observedaspect observedaspect(observationregistry observationregistry) {
        observationregistry.observationconfig().observationhandler(new simplelogginghandler());
        return new observedaspect(observationregistry);
    }
}

package com.et.config;

import io.micrometer.observation.observation;
import io.micrometer.observation.observationhandler;
import lombok.extern.slf4j.slf4j;

@slf4j
public class simplelogginghandler  implements observationhandler<observation.context> {
    @override
    public void onstart(observation.context context) {
        observationhandler.super.onstart(context);
        log.info("starting context {} ", context);
    }

    @override
    public void onerror(observation.context context) {
        observationhandler.super.onerror(context);
    }

    @override
    public void onevent(observation.event event, observation.context context) {
        observationhandler.super.onevent(event, context);
    }

    @override
    public void onscopeopened(observation.context context) {
        observationhandler.super.onscopeopened(context);
    }

    @override
    public void onscopeclosed(observation.context context) {
        observationhandler.super.onscopeclosed(context);
    }

    @override
    public void onscopereset(observation.context context) {
        observationhandler.super.onscopereset(context);
    }

    @override
    public void onstop(observation.context context) {

        observationhandler.super.onstop(context);
        log.info("stopping context {} ", context);
    }

    @override
    public boolean supportscontext(observation.context context) {
        return true;
    }
}

为了使tracking的newspan注解生效,需要额外配置如下

package com.et.config;

import io.micrometer.tracing.tracer;
import io.micrometer.tracing.annotation.defaultnewspanparser;
import io.micrometer.tracing.annotation.imperativemethodinvocationprocessor;
import io.micrometer.tracing.annotation.methodinvocationprocessor;
import io.micrometer.tracing.annotation.newspanparser;
import io.micrometer.tracing.annotation.spanaspect;
import org.springframework.beans.factory.beanfactory;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration(proxybeanmethods = false)
public class spanaspectconfiguration {

  @bean
  newspanparser newspanparser() {
    return new defaultnewspanparser();
  }

  @bean
  methodinvocationprocessor methodinvocationprocessor(
      newspanparser newspanparser, tracer tracer, beanfactory beanfactory) {
    return new imperativemethodinvocationprocessor(
        newspanparser, tracer, beanfactory::getbean, beanfactory::getbean);
  }

  @bean
  spanaspect spanaspect(methodinvocationprocessor methodinvocationprocessor) {
    return new spanaspect(methodinvocationprocessor);
  }
}

启用 tracing:

在 spring boot 的主类上添加 @enableaspectjautoproxy 注解,以启用 aop 支持:

package com.et;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.context.annotation.enableaspectjautoproxy;

@springbootapplication
@enableaspectjautoproxy

public class springcloudapplication {

    public static void main(string[] args) {
        springapplication.run(springcloudapplication.class, args);
    }
}

使用注解:

在需要追踪的方法上使用 @newspan 注解,以创建新的 span。例如:

package com.et.service;

import io.micrometer.tracing.annotation.newspan;
import lombok.extern.slf4j.slf4j;
import org.springframework.stereotype.service;

/**
 * @author liuhaihua
 * @version 1.0
 * @classname demoservice
 * @description todo
 * @date 2024/12/03/ 17:37
 */
@service
@slf4j
public class demoservice {
    @newspan
    public string sayhello(string name){
        log.info("hello "+name);
        return "hello "+name;
    }
}

controller

package com.et.controller;

import io.micrometer.tracing.spanname;
import io.micrometer.tracing.annotation.newspan;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;

@restcontroller
@slf4j

public class mycontroller {
    @autowired
    com.et.service.demoservice demoservice;
    @getmapping("/hello")
    @newspan
    @spanname("customspanname")
    public string hello() {
        log.info("into controller ");
        return demoservice.sayhello("jack");
    }
}

application.yml

spring.application.name: demo-tracing

server:
  port: 8088
  servlet:
    context-path: /app
logging.pattern.level: "%5p [${spring.application.name:},%x{traceid:-},%x{spanid:-}]"
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0

以上只是一些关键代码

4.测试

启动spring cloud应用

访问rest api

访问http://127.0.0.1:8088/app/hello,控制台输出日志

2024-12-03t18:18:30.845+08:00 info [demo-tracing,d0f7eb048278e2374cf99e898d8cffb9,59da48fe2de9af72] 13304 --- [demo-tracing] [nio-8088-exec-4] [d0f7eb048278e2374cf99e898d8cffb9-59da48fe2de9af72] com.et.controller.mycontroller : into controller 
2024-12-03t18:18:30.846+08:00 info [demo-tracing,d0f7eb048278e2374cf99e898d8cffb9,62a3992306bc6344] 13304 --- [demo-tracing] [nio-8088-exec-4] [d0f7eb048278e2374cf99e898d8cffb9-62a3992306bc6344] com.et.service.demoservice : hello jack

查看追踪数据:

micrometer tracing 会自动收集追踪数据,并将其发送到配置的zipkin。你可以使用这些数据来分析请求的性能和调用链。

5.结论

micrometer tracing 是一个强大的工具,可以帮助开发者和运维人员更好地理解和监控微服务架构中的请求流。通过简单的配置和使用,micrometer tracing 可以显著提高系统的可观察性,帮助团队快速识别和解决性能问题。在现代微服务架构中,采用 micrometer tracing 是提升应用程序性能和可靠性的有效手段。

以上就是springcloud集成micrometer tracing的代码工程的详细内容,更多关于springcloud集成micrometer tracing的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com