如何使用Opentelemetry+jaeger对Go与Java项目实现分布式链路追踪

本文介绍![如何使用Opentelemetry+jaeger实现分布式链路追踪]

关于opentelemetry的介绍可以看下面的文章

 https://blog.csdn.net/qq_62368250/article/details/143516314

本文中相关图片以及源代码地址

https://github.com/wuchenyanghaoshuai/others/blob/main/step39/README.md
如果有在测试用有任何使用当中的问题请与我联系

1. 安装CertManager 首选 step01

# 地址在 https://cert-manager.io/docs/installation/kubectl
# 请注意我部署的时候k8s集群1.23.1 如果是低于我这个版本的话,会对go环境支持的不是这么友好
# 去官方github去下载跟k8s集群版本对应的yaml文件,我这里使用的是v1.13.6
# 可以先wget下来,然后查看yaml里的具体内容然后再apply
# 如果你的空k8s版本低于1.19.0 可以去github里寻找低版本的yaml,一般会有版本对照表

2. 安装Jaeger all-in-one模式 step02

# 我这里使用的ingress暴露的,你也可以使用nodeport或者ingress暴露
# 关于image,我这里使用的是官方的镜像转存到阿里云cr的

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jaeger
  template:
    metadata:
      labels:
        app: jaeger
    spec:
      containers:
      - name: jaeger
        image: jaegertracing/all-in-one:latest
        # image: registry.cn-hangzhou.aliyuncs.com/wuchenyang/jaegertracing-all-in-one:latest # 阿里云镜像
        env:
        - name: COLLECTOR_OTLP_ENABLED
          value: "true"
        ports:
        - containerPort: 16686
        - containerPort: 14268
---
apiVersion: v1
kind: Service
metadata:
  name: jaeger
spec:
  selector:
    app: jaeger
  type: ClusterIP
  ports:
    - name: ui
      port: 16686
      targetPort: 16686
    - name: collector
      port: 14268
      targetPort: 14268
    - name: http
      protocol: TCP
      port: 4318
      targetPort: 4318
    - name: grpc
      protocol: TCP
      port: 4317
      targetPort: 4317      
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-jager
  namespace: default
spec:
  ingressClassName: nginx
  rules:
    - host: jager.wuchenyangzhendehaoshuai.com
      http:
        paths:
          - backend:
              service:
                name: jaeger
                port:
                  number: 16686
            path: /
            pathType: ImplementationSpecific

3. 安装opentelemetry-operator step03

#opentelemetry-operator与k8s版本有关,需要根据k8s版本进行安装,具体看具体看下面的地址
# https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/compatibility.md
# 如果你的k8s集群高于1.23 直接看这个md里的对照表就行,如果低于1.23,需要看下面的地址(本人1.23.1)里的对照关系
# https://github.com/open-telemetry/opentelemetry-operator/tree/v0.85.0 || k8s 1.22.1
# 然后在tag里找到v0.100.0 的installation manifest for kubernetes 右键复制链接地址 ,然后在终端wget 即可
# 在终端执行
kubectl apply -f opentelemetry-operator-v0.100.0.yaml
# 查看是否安装成功
kubectl get pod -n opentelemetry-operator-system

# 如果下载不了image可以使用我的镜像(我pull下来tag的)
#registry.cn-hangzhou.aliyuncs.com/wuchenyang/kube-rbac-proxy:v0.13.1
#registry.cn-hangzhou.aliyuncs.com/wuchenyang/opentelemetry-operator:0.100.0
#实际使用的时候也可以将镜像pull下来,tag成官方的image

4. 部署otel-collector 跟Instrumentation step04


# cat 04otlp/Instrumentation.yaml
#这个因为我是java的demo所以下面那块写了java,如果是python或者go去官方照文档即可都是一样的,这里刚刚好有一个go的demo跟一个java的demo
# 有了这个配置以后,你可以在你的deploy里添加一个annotation instrumentation.opentelemetry.io/inject-java: "true"
#下面有我的deployoy 配置
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: instrumentation-sample
spec:
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  env:
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: otel-collector.default:4318
  java:    
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: http://otel-collector.default:4317
  go:    
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: http://otel-collector.default:4318
#其他配置的代码
java:  # Java 特定配置
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: "http://otel-collector.default:4317"  # gRPC 端点(可选覆盖全局)
  python:  # Python 特定配置
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: "http://otel-collector.default:4317"  # gRPC 端点(可选覆盖全局)
  go:  # Go 特定配置(实验性 eBPF)
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: "http://otel-collector.default:4318"  # gRPC 端点(可选覆盖全局)
# cat 04otlp/otlp.yaml
#这个配置就是otel-collector的配置,这里我使用的是jaeger的exporter,你也可以使用其他的exporter
#因为jager的后端没有配置es等存储,我这里使用的本机,所以数据保存不了30天往上
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config:
    receivers:
      otlp:
        protocols:
          grpc: {}
          http: {}
    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 10s
    exporters:
      otlp/jaeger:
        endpoint: "jaeger.default:4317"
        tls:
          insecure: true
    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]  # 添加 processors
          exporters: [otlp/jaeger]

5. 部署Java-Demo step05

#可以直接使用我的yaml
#svc那块你可以直接用ingress或者nodeport都可以,我是用了ingress,本地做了域名映射
#可以清晰的看到下面的yaml使用了annotation instrumentation.opentelemetry.io/inject-java: "true"
#如果是go项目的话需要添加instrumentation.opentelemetry.io/inject-go: "true",还有一个需要注意的地方,go项目需要单独提权限,而且是必须的
# 具体看官方文档的267行-287行,https://github.com/open-telemetry/opentelemetry-operator/blob/v0.85.0/README.md
#```yaml
#securityContext:
#    capabilities:
#     add:
#     - SYS_PTRACE
#    privileged: true
#    runAsUser: 0
#```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-demo
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  replicas: 1
  selector:
    matchLabels:
      app: java-demo
  template:
    metadata:
      labels:
        app: java-demo
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9180"
        prometheus.io/path: /metrics
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
        - name: java-demo
          image: registry.cn-hangzhou.aliyuncs.com/wuchenyang/java-demo:test-b0cbb8
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 20
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 2
          resources:
            requests:
              memory: "512Mi"
              cpu: "0.5"
            limits:
              memory: "1024Mi"
              cpu: "1"
          env:
          - name: "JAVA_OPTS"
            value: "-Xms1g -Xmx1g -javaagent:/data/agent/skywalking-agent.jar -javaagent:/data/agent/jmx_prometheus_javaagent-0.14.0.jar=9180:/data/agent/jmx_exporter.yml"
          - name : PROFILE
            value: test
---
apiVersion: v1
kind: Service
metadata:
  name: java-demo
spec:
  selector:
    app: java-demo
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30000
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-java-demo
spec:
  ingressClassName: nginx
  rules:
  - host: test.wuchenyangzhendehaoshuai.com
    http:
      paths:
      - backend:
          service:
            name: java-demo
            port:
              number: 8080
        path: /
        pathType: ImplementationSpecific

6. 访问java-demo以及jaeger-ui

浏览器输入 http://test.wuchenyangzhendehaoshuai.com/

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击页面选择数据选择提交

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浏览器输入 http://jager.wuchenyangzhendehaoshuai.com/

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查询刚刚提提交动作m的trace

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7. Go项目demo step06

注意

如果你要使用我的go程序,需要提前在你的环境里准备好mysql环境,并且创建好数据库,表结构可以参考我的sql文件,具体看docker目录中详细解释
由于go的ebpf插桩在operator的0.88版本开始,我的k8s版本为1.23.1,所以我本次使用的是v0.100.0,做测试的时候,一定要看好自己的k8s版本与operator版本的对应关系
按照官方文档,需要在注解里添加主程序的位置
Go 自动注入的实现依赖于 eBPF(uprobe),但当前环境不支持所需的内核功能。
由于我的系统使用的是centos7.9,内核版本默认的是3.10.x,所以需要升级内核版本,要不然的话在go自动插桩的时候那个会直接报错,但是不会影响服务正常
如果你是centos7.9的话得需要升级一下,如果你的内核高于我这个版本5.2.x就可以,则不需要
go跟java服务不一样的地方在于java是以initcontainer的方式,go是sidcar的方式,go项目启动以后是2/2的方式,如果你kubectl get pods 去看的话
升级步骤如下(所有节点都需要执行):
  参考文档: https://www.jb51.net/article/265146.htm
  下载地址: http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/
  wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.6.14-1.el7.elrepo.x86_64.rpm
  wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-5.6.14-1.el7.elrepo.x86_64.rpm
  rpm -ivh *.rpm
  grub2-set-default 0
  grub2-mkconfig -o /boot/grub2/grub.cfg
  reboot
  [root@km ~]# uname -r
  5.6.14-1.el7.elrepo.x86_64
# 我是使用ingress暴露,可以根据自身情况选择使用nodeport,
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gin-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gin-demo
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge:
      maxUnavailable: 0
  minReadySeconds: 5
  revisionHistoryLimit: 10
  template:
    metadata:
      labels:
        app: gin-demo
      annotations:
        instrumentation.opentelemetry.io/inject-go: "true"
        instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/app/main"
        instrumentation.opentelemetry.io/container-names: "gin-demo"
    spec:
      containers:
      - name: gin-demo
        image: registry.cn-hangzhou.aliyuncs.com/wuchenyang/gin-demo:v4
        securityContext:
          privileged: true
          runAsUser: 0
        imagePullPolicy: Always
        ports:
        - containerPort: 8081
        readinessProbe:
          httpGet:
            path: /ping
            port: 8081
          initialDelaySeconds: 20
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 2
        resources:
          requests:
            memory: "256Mi"
            cpu: 0.5
          limits:
            memory: "512Mi"
            cpu: 1
---
apiVersion: v1
kind: Service
metadata:
  name: gin-demo-service
  namespace: default
spec:
  ports:
  - name: http
    port: 8081
    targetPort: 8081
    protocol: TCP
  type: NodePort
  selector:
    app: gin-demo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-gin-demo
spec:
  ingressClassName: nginx
  rules:
  - host: gin.wuchenyangzhendehaoshuai.com
    http:
      paths:
      - backend:
          service:
            name: gin-demo-service
            port:
              number: 8081
        path: /
        pathType: ImplementationSpecific

8. 访问Go项目以及jaeger-ui

浏览器输入 gin.wuchenyangzhendehaoshuai.com

登录后台系统(用户名密码为admin/password),默认是/login页面,也可以直接/home跳过登录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浏览器输入 jaeger.wuchenyangzhendehaoshuai.com,选择相对应的服务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/985022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2001-2024年我国逐年植被净初级生产力(NPP)数据

植被净初级生产力(Net Primary Productivity,NPP)是生态学中的一个重要概念,表示单位面积植被在特定时间内吸收的净光合有机物,是衡量生态系统中植物通过光合作用所产生的有机物质减去植物呼吸作用消耗的有机物质的量&…

靶场(七)---靶场精做小白思考

启程: 先扫一遍全端口发现,有很多tcp端口全部被关闭了,于是我又去看看他们的udp端口,发现也是半死不活的样子,那没办法只能把udp端口当作备选方案(其实这个udp什么用都没有就是关闭的状态不用关&#xff0…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…

【设计模式】设计模式的分类与组织

文章目录 前言一、设计模式的分类1. 目的准则2. 范围准则 二、设计模式的细分1.创建型模式的细分2.结构型模式的细分3.行为型模式的细分 三、设计模式的关联结论 前言 在软件开发中,设计模式是一种解决特定问题的最佳实践。由于设计模式种类繁多,理解它…

Vue3实战学习(Element-Plus常用组件的使用(输入框、下拉框、单选框多选框、el-image图片))(上)(5)

目录 一、Vue3工程环境配置、项目基础脚手架搭建、Vue3基础语法、Vue3集成Element-Plus的详细教程。(博客链接如下) 二、Element-Plus常用组件使用。 &#xff08;1&#xff09;el-input。(input输入框) <1>正常状态的el-input。 <2>el-input的disable状态。 <3…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 这个错误通常是由于 Matplotlib 的后端配置问题引起的。具体来说&#xff0c;Matplotlib 在尝试加载某个后端时&#xff0c;发现该后端模块中缺少必要的属性&#xff08;如 FigureCanvas&#xff09;&a…

网络安全基础与应用习题 网络安全基础答案

1.列出并简要给出SSH的定义。 正确答案&#xff1a; 答&#xff1a;6.10传输层协议&#xff1a;提供服务器身份验证、数据保密性和数据完整性&#xff0c;并具有前向保密性&#xff08;即&#xff0c;如果在一个会话期间密钥被破坏&#xff0c;则知识不会影响早期会话的安全性&…

文件上传复现

1、什么是文件上传漏洞&#xff1f; 答&#xff1a;文件上传漏洞是指攻击者通过上传恶意文件到服务器、从而执行任意代码、获取系统权限或者破坏系统安全的漏洞、常见于允许用户上传文件的Web应用程序中。 2. 文件上传漏洞形成原因 未验证文件类型&#xff1a;未对上传文件的…

【网络安全工程】任务12:网络安全设备

目录 一、防火墙​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 二、入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 三、防病毒网关​ ​1、作用​ 2、配置方式​ 3、存在的漏洞​ …

Docker容器与宿主机目录映射深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Docker容器与宿主机目录映射基础原理 在深入了解如何查询 Docker 容器目录在宿主机的映射目录之前&#xff0c;有必要先明晰其背后的基础原理。Docker 容器通过挂载&#xff08;mount&#xff09;机制将宿主机的…

DeepSeek+Maxkb+Ollama+Docker搭建一个AI问答系统

DeepSeekMaxkbOllamaDocker搭建一个AI问答系统 文章目录 DeepSeekMaxkbOllamaDocker搭建一个AI问答系统前言一、创建同一内网的网络二、拉取两个镜像三、启动Ollama以及调试Maxkb4.Maxkb创建一个应用并建立知识库5、应用效果总结 前言 我觉得只要是使用Docker技术&#xff0c;…

决策树,Laplace 剪枝与感知机

1.决策树 决策树是一种用于分类任务的监督学习算法。它基于特征的划分来做出决策&#xff0c;每个节点表示一个特征&#xff0c;每条分支代表该特征的可能取值&#xff0c;每个叶子节点代表分类结果。 用通俗的话来说&#xff0c;决策树就像一个**"如果……那么……&quo…

使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏

前言&#xff1a;如今&#xff0c;借助先进的人工智能模型与便捷的云平台&#xff0c;即便是新手开发者&#xff0c;也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型&#xff0c;具备强大的功能与潜力&#xff0c;而蓝耘智算云平台则为其提供了稳定高效的运行环境…

标准卷积(Standard Convolution)

标准卷积的基础操作图解&#xff1a; 卷积之后尺寸公式&#xff1a; 输入尺寸&#xff1a;WH卷积核尺寸&#xff1a;Fw​Fh​填充大小&#xff1a;P步长&#xff1a;S 输出尺寸 WoutHout可以通过以下公式计算&#xff1a; 其中[x]表示向下取整。 实例&#xff1a; 输入图像…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…

ArcGIS Pro中字段的新建方法与应用

一、引言 在地理信息系统&#xff08;GIS&#xff09;的数据管理和分析过程中&#xff0c;字段操作起着至关重要的作用。 无论是进行地图制作、空间分析还是数据统计&#xff0c;字段都是承载属性信息的基本单元。 ArcGIS Pro作为一款功能强大的GIS软件&#xff0c;为用户提…

企业如何选择网站模版快速建站?

企业想拥有一个专业和功能齐全的官网事关重要。然而&#xff0c;对于新手用户&#xff0c;从基础开始创建网站可能是一件较为复杂和麻烦的过程。今天的文章从零开始给介绍一下如何搭建网站。 一、先确定建站的主题 用户在开始建站前明确自己建站的目的、是为了宣传网站、还是销…

Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节

Phi-4-Multimodal 是一种参数高效的多模态模型&#xff0c;通过 LoRA 适配器和模式特定路由器实现文本、视觉和语音/音频的无缝集成。训练过程包括多阶段优化&#xff0c;确保在不同模式和任务上的性能&#xff0c;数据来源多样&#xff0c;覆盖高质量网络和合成数据。它的设计…

北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

爬取动态数据,爬取持久化数据

1. 动态内容与静态内容的区别 动态内容通常指通过 JavaScript 渲染或异步加载的数据。静态内容则是页面加载时直接可见的内容&#xff0c;通常通过 HTML 直接获取。很多现代网站都使用 JavaScript 动态渲染页面内容&#xff08;例如 AJAX 请求&#xff09;。 头条网站的热榜内…