码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于OpenTelemetry实现Java微服务调用链跟踪


    合集 - 开发与运维(26)
    1.面试官:你能简单聊聊MyBatis执行流程02-022.一文详解应用安全防护ESAPI02-043.一个线程,从“生”到“死”经历的过程02-054.KubeEdge v1.16.0 版本发布!10项新增特性02-055.解密JavaChassis3:易扩展的多种注册中心支持02-066.解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件02-087.想设计一个高并发的消息中间件前,先熟悉一下这些知识点02-178.华为云GES助力九洲平台:探索确定性运维的新实践02-179.0-overlay和underlay,这两种容器网络你分得清吗02-1810.教你用Rust实现Smpp协议02-18
    11.基于OpenTelemetry实现Java微服务调用链跟踪02-19
    12.揭开华为云ADN提高网络质量的秘密02-1913.详解网络知识:iptables规则02-1914.实例详解在Go中构建流数据pipeline02-2115.面试官让我讲讲MySQL三大核心日志实现原理02-2116.华为云帕鲁服务器-云耀云容器版,到底强在哪?02-2217.掌握云容器网络:何为ipvs02-2218.一文带你了解容器探针02-2319.教你如何判断Java代码中异步操作是否完成02-2620.深入解析Python并发编程的多线程和异步编程02-2721.教你如何用Keepalived和HAproxy配置高可用 Kubernetes 集群02-2822.容器化环境中,JVM最佳参数配置实践02-2923.关于Python中math 和 decimal 模块的解析与实践02-2924.运维一款月变更70+次的服务,是一种什么体验?03-0125.详解Python中sys模块的功能与应用03-0426.教你用Ubuntu快速搭建饥荒服务器03-04
    收起

    本文分享自华为云社区《基于OpenTelemetry实现Java微服务调用链跟踪》,作者: 可以交个朋友。

    一 背景

    随着业务的发展,所有的系统都会走向微服务化体系,微服务进行拆分后,服务的依赖关系变得复杂,如果出现了错误和异常,定位的过程将会变得复杂,一个请求可能需要调用很多个服务,所以微服务架构中,分布式链路跟踪的实现至关重要,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见。如何快速查询整个请求链路上的信息并呈现出来是解决排查问题复杂度的根本方法。

    image.png

    二 简介

    Java 是世界上最流行的编程语言之一,很多大小项目都是通过Java进行微服务的开发来实现。
    本篇博客将以springboot微服务为例,通过使用opentelemetry-java SDK 进行自动埋点以代码无侵入的方式实现微服务的分布式跟踪能力。

    三 实践演示

    demo项目一共3个service:foo-svc、bar-svc 、loo-svc 。
    项目源码可前往:https://github.com/HFfleming/springboot-trace-demo/tree/autoconfigure

    访问效果如下:

    image.png

    3.1 前提条件

    已创建k8s 集群,可使用CCE集群平台作为基础环境。

    k8s 集群中已安装opentelemetry-collector组件

    k8s 集群中已安装jaeger作为分布式跟踪数据展示的平台

    3.2 集成opentelemetry-java-instrumentation

    OpenTelemetry 提供了 Java agent(opentelemetry-java-instrumentation)。当附加到应用程序中时,它会修改各种流行库和框架的字节码以捕获遥测数据。可以以多种格式导出遥测数据。还可以通过命令行参数或环境变量配置代理和导出器。最终结果是无需更改代码即可从 Java 应用程序收集遥测数据。

    下载otel-java jar包并添加到容器镜像中

    前往官方仓库 https://github.com/open-telemetry/opentelemetry-java-instrumentation 下载opentelemetry-javaagent.jar

    通过环境变量配置java agent和otlp导出器

    • 通过环境变量的形式配置java agent:ENV JAVA_TOOL_OPTIONS="-javaagent:/usr/app/opentelemetry-javaagent.jar"

    • 服务名称: ENV OTEL_SERVICE_NAME="foo-svc"

    • 使用otlp协议的导出器:ENV OTEL_TRACES_EXPORTER="otlp"

    • 关闭java agent的指标 otlp导出器: ENV OTEL_METRICS_EXPORTER="none"

    • 关闭java agent的日志 otlp导出器: ENV OTEL_LOGS_EXPORTER="none"

    • 指定OTLP导出器的端点,跨ns的场景下建议写上otel的ns:ENV OTEL_EXPORTER_OTLP_ENDPOINT="http://opentelemetry-collector.tracing.svc.cluster.local:4317"

      除了环境变量的形式,也可通过jvm参数形式进行agent和导出器的配置。
      详细配置或者欲开启更多导出信息可参考: https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure

    容器镜像制作

    建议重新制作镜像,将opentelemetry-javaagent等otlp基础配置打包在镜像中。后续如果有变动,也可通过deployment中env字段进行修改覆盖。

    镜像Dockerfile文件可参照如下:

    复制代码
    #基于官方的Maven镜像
    FROM maven:3.8.7-openjdk-18-slim AS build
    
    #将本地代码复制到Docker容器中的 /usr/src/app 目录下
    COPY src /usr/src/foo-app/src
    COPY pom.xml /usr/src/foo-app
    COPY opentelemetry-javaagent.jar /usr/src/foo-app
    
    # 在容器的 /usr/src//foo-app 目录下,运行mvn clean package 命令,构建项目
    RUN mvn -f /usr/src/foo-app/pom.xml clean package
    
    # 使用官方的openjdk 镜像作为基础镜像
    FROM  openjdk:19-jdk-slim
    
    # 将打包生成的jar文件复制到容器中
    COPY --from=build /usr/src/foo-app/target/*.jar  /usr/app/foo-app.jar
    COPY --from=build /usr/src/foo-app/opentelemetry-javaagent.jar /usr/app/opentelemetry-javaagent.jar
    
    # 声明服务运行在8080端口
    EXPOSE 8080
    
    # 通过环境变量的形式配置java agent并且通过环境变量传递配置属性
    ENV JAVA_TOOL_OPTIONS="-javaagent:/usr/app/opentelemetry-javaagent.jar"
    # 服务的k8s servicename
    ENV OTEL_SERVICE_NAME="foo-svc"
    # 使用的是otlp协议的导出器
    ENV OTEL_TRACES_EXPORTER="otlp"
    # 关闭java agent的指标 otlp导出器
    ENV OTEL_METRICS_EXPORTER="none"
    ## 关闭java agent的日志 otlp导出器
    ENV OTEL_LOGS_EXPORTER="none"
    # 指定OTLP导出器的端点,跨ns的场景下建议写上otel的ns
    ENV OTEL_EXPORTER_OTLP_ENDPOINT="http://opentelemetry-collector.tracing.svc.cluster.local:4317"
    
    #指定docker容器的启动命令
    ENTRYPOINT ["java", "-jar","/usr/app/foo-app.jar"]
    复制代码

    镜像推送至镜像仓库,可使用SWR容器镜像仓库

    docker build 构建完镜像后,然后docker push 至镜像仓库。
    本人demo项目镜像如下,可供读者调试使用:
    foo-svc: swr.cn-north-4.myhuaweicloud.com/k8s-solution/foo-svc:v2
    bar-svc: swr.cn-north-4.myhuaweicloud.com/k8s-solution/bar-svc:v2
    loo-svc: swr.cn-north-4.myhuaweicloud.com/k8s-solution/loo-svc:v2

    在k8s集群中部署demo项目

    image.png

    其中loadgenerator服务是个客户端工具用于访问demo项目。访问信息如下:

    image.png

    相比之前没有集成opentelemetry-javaagent.jar ,访问信息请求头多了traceparent信息,很明显该信息就是分布式跟踪所需要使用到的

    3.3 OpenTelemetry配置遥测数据的接受和导出

    在上述环境变量中,通过otlp-grpc协议进行java微服务遥测数据导出的。所以在opentelemetry-collector中的receivers接收器配置中需要配置otlp grpc规则进行数据的接受:

    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: ${env:MY_POD_IP}:4317

    otel接受到数据后,需要将数据处理后进行导出。导出后端可以是jaeger,通过jaeger进行分布式跟踪数据的展示,需要需要在opentelemery-collector中配置exporter导出器

    复制代码
    exporters:
      debug: {}  #导出器配置log,可记录导出行为
      otlp:
        endpoint: jaeger-collector.hu.svc.cluster.local:4317 #jaeger的otlp-grpc端口
        tls:
          insecure: true
    复制代码

    需要注意此处导出器后端jaeger使用的协议为otlp,如果jaeger-collector service未配置该端口,则会导出失败,建议检查jaeger相关service的配置。

    - name: otlp-grpc
      port: 4317
      protocol: TCP
      targetPort: 4317

    通过pipeline启用otel采集器中配置的各种组件。上面配置了接收器和导出器,如果不在pipeline中声明,则不会启用该组件。启用方式参考:

    复制代码
    service: # 用于根据接收器、处理器、导出器和扩展部分中的配置来配置收集器中启用的组件
      extensions:
      - health_check
      pipelines:
        traces:
          exporters:
          - debug
          - otlp
          processors:
          - memory_limiter
          - batch
          receivers:
          - otlp
    复制代码

    完整配置参考如下,这些配置以configmap形式挂载到otel-collector容器中使用。

    复制代码
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: opentelemetry-collector
      namespace: tracing
    data:
      relay: |
        exporters:
          debug: {}
          otlp:
            endpoint: jaeger-collector.hu.svc.cluster.local:4317
            tls:
              insecure: true
        extensions:
          health_check:
            endpoint: ${env:MY_POD_IP}:13133
    
        processors:
          batch: {}
          memory_limiter:
            check_interval: 5s
            limit_percentage: 80
            spike_limit_percentage: 25
    
        receivers:
          otlp:
            protocols:
              grpc:
                endpoint: ${env:MY_POD_IP}:4317
    
        service:
          extensions:
          - health_check
          pipelines:
            traces:
              exporters:
              - debug
              - otlp
              processors:
              - memory_limiter
              - batch
              receivers:
              - otlp
    
          telemetry:
            metrics:
              address: ${env:MY_POD_IP}:8888
    复制代码

    配置更新后,重启otel-collector容器。查看otel容器日志可以看到otel已经以配置的规则进行工作。

    image.png

    3.4 Jaeger查看调用链跟踪数据

    访问jaeger UI,UI端口为16686。可以看到jaeger已经接收到trace信息,目前已有4条trace,每条trace均有8个span信息。

    image.png

    查看详细span信息,不仅可以看到服务级别的调用,还能看到方法级别的调用,以及方法级别的耗时。

    image.png

     

    点击关注,第一时间了解华为云新鲜技术~

     

  • 相关阅读:
    CentOS 7 安装 openGauss 3.0 企业版(单节点)
    php file_get_contents https 请求 伪造user_agent
    java线性并发编程介绍-锁
    解释器风格架构C# 代码
    C++初阶:C/C++内存管理
    社交电商如何运营推广?
    【LeetCode】Day108-和为 K 的子数组
    js:如何使用JavaScript函数小作业
    [手写系列] 带你实现一个简单的Promise
    测试工程师-入门指南
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/18020541
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号