OpenShift 4 - 可观测性之用 OpenTelemetry+Jaeger 实现 Distributed Tracing

news2024/11/23 7:14:51

《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在支持 OpenShift 4.13 的环境中验证

文章目录

  • 技术架构
  • 部署 Distributed Tracing 运行环境
  • 安装测试应用并进行观测跟踪
  • 参考

说明

  • 本文使用的测试应用采用的是 “手动 Instrumentation” 方式在应用代码中通过 OpenTelemetry 的 API 获取的跟踪数据。应用代码 https://github.com/rbaumgar/otelcol-demo-app/blob/main/src/main/java/org/acme/opentelemetry/TracedResource.java
  • 非侵入式的 “自动 Instrumentation” 实现方式可参见《OpenShift 4 - 可观测性之 Distributed Tracing - 通过向被观测应用注入OpenTelemetry Agent 实现自动跟踪(附视频)》

技术架构

在这里插入图片描述

部署 Distributed Tracing 运行环境

  1. 使用OpenShift 集群管理员安装 OpenShift distributed tracing platform Operator,安装过程默认选项即可。在 OpenShift distributed tracing platform Operator 中包含 Jaeger 环境。
  2. 创建 jaeger-demo 项目,并授权 developer 用户为该项目的 admin。
$ oc new-project jaeger-demo
$ oc policy add-role-to-user admin developer -n jaeger-demo 
  1. 用 developer 登录 OpenShift。
$ oc login -u developer
  1. 基于以下 YAML 在 jaeger-demo 项目中创建 Jaeger 对象。
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: my-jaeger
  namespace: jaeger-demo
spec: {}
  1. 执行命令确认 Jaeger 运行环境,其中 my-jaeger-collector 的服务可以接收来自架构图中 Otel 采集的数据。说明:由于本文只是演示,因此只将 my-jaeger-collector 收集的数据存放在内存中。
$ oc get svc -n jaeger-demo
NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                    AGE
my-jaeger-agent                   ClusterIP   None           <none>        5775/UDP,5778/TCP,6831/UDP,6832/UDP                        3h33m
my-jaeger-collector               ClusterIP   10.217.4.151   <none>        9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP   3h33m
my-jaeger-collector-headless      ClusterIP   None           <none>        9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP   3h33m
my-jaeger-query                   ClusterIP   10.217.4.108   <none>        443/TCP,16685/TCP                                          3h33m
 
$ oc get pod -n jaeger-demo
NAME                                    READY   STATUS    RESTARTS   AGE
my-jaeger-74c489cb94-mb8vb          2/2     Running   0          52m
  1. 可以在 OpenShift 控制台中可以看到 4317 端口提供的是 grpc-otel 协议组合的服务。
    在这里插入图片描述
  2. 点击上图 my-jaeger 右上方的箭头,可以看到 Jaeger 的控制台。
    在这里插入图片描述

安装测试应用并进行观测跟踪

  1. 基于以下 YAML 部署测试应用。
    说明:测试应用使用了手动 Instrumentation 方式获取的跟踪数据,应用代码参见 https://github.com/rbaumgar/otelcol-demo-app/blob/main/src/main/java/org/acme/opentelemetry/TracedResource.java
    注意:其中在 Deployment 中对 OTELCOL_SERVER 参数使用了以上 my-jaeger-collector 服务的地址。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: otel-demo-app
  template:
    metadata:
      labels:
        app: otel-demo-app
    spec:
      containers:
        - image: quay.io/rbaumgar/otelcol-demo-app-jvm
          imagePullPolicy: IfNotPresent
          name: otel-demo-app
          env:
            - name: OTELCOL_SERVER
              value: 'http://my-jaeger-collector:4317'  
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: web
  selector:
    app: otel-demo-app
  type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  path: /
  to:
    kind: Service
    name: otel-demo-app
  port:
    targetPort: web
  1. 执行以下命令访问测试应用。
$ export URL=$(oc get route otel-demo-app -o jsonpath='{.spec.host}')
$ curl $URL/hello
hello 
$ curl $URL/sayHello/demo1
hello: demo1
$ curl $URL/sayRemote/demo2
hello: demo2 from http://otel-demo-app-jaeger-demo.apps-crc.testing/
  1. 在 Jaeger 控制台中查看 my-service,然后查看跟踪到的结果。
    在这里插入图片描述
    可以进入 sayRemote 查看跟踪到的服务调用。
    在这里插入图片描述

参考

https://www.opensourcerers.org/2022/04/18/using-opentelemetry-and-jaeger/
https://github.com/rbaumgar/otelcol-demo-app/blob/main/README.md
https://medium.com/@akashjoffical08/implement-distributed-tracing-with-jaeger-opentelemetry-on-kubernetes-3e35cb77b536
https://docs.openshift.com/container-platform/4.13/distr_tracing/distr_tracing_install/distr-tracing-deploying-jaeger.html
https://www.aneasystone.com/archives/2022/11/opentelemetry-observability.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雕爷学编程】Arduino动手做(85)---LCD1602液晶屏模块6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

02 linux 基础(2)

shell 基本维护命令 获取联机帮助 使用 man 命令可以找到特定的联机帮助页&#xff0c;并提供简短的命令说明。一般语法格式为&#xff1a; 联机帮助页提供了指定命令 commandname 的相关信息&#xff0c;包括&#xff1a;名称、函数、语法以及可选参数描述等。无论帮助有多长…

PyAutoGUI

概述 PyAutoGUI是一个纯Python开发的跨平台GUI自动化工具&#xff0c;它是通过程序来控制计算机的键盘和鼠标的操作&#xff0c;从而实现自动化功能。所谓的GUI是指图形用户界面&#xff0c;即通过图形方式来显示计算机的界面&#xff0c;早期的计算机是以命令行界面来操作&am…

Vector3.Cross

上期介绍了Vector.Dot可以用来判断敌人处于自身的前方or后方&#xff0c;那么这期就是通过叉乘来判断敌人处于自身的左方or右方 public class CrossTest : MonoBehaviour {public GameObject sphere;public GameObject cube;// Start is called before the first frame updatev…

性能测试工具 Locust + Boomer In Docker

目录 前言&#xff1a; 背景 启动 Locust-master Boomer 调试模式启动 boomer locust worker 模式启动 get 请求 post 请求 指定请求头 直接使用 curl 命令 动态读取 csv --json-value-type 说明 前言&#xff1a; Locust 是一种开源的性能测试工具&#xff0c;可…

【js小游戏案例】纯前端实现飞机大战,附带源码

技能&#xff1a; 使用html js css实现飞机大战小游戏 需求&#xff1a; 我军飞机左右移动&#xff0c;并且按空格 可以发射炮弹&#xff0c;敌方飞机从上往下飞&#xff0c;接触到我方炮弹 飞机被歼灭&#xff0c;我军接触到敌军飞机也将会被歼灭&#xff0c;我方飞机吃到道…

【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

文章目录 前言一、 整体1.命名空间:2构造函数&#xff1a;1普通构造2迭代器构造3初始化字符构造4拷贝构造&#xff1a; 3析构函数 二、成员函数实现1.大小1当前大小(size())2总体容量(capacity()) 2.返回头尾迭代器1begin&#xff08;&#xff09;2end&#xff08;&#xff09;…

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。 文章一次性讲解两种案例&#xff0c;回归与分类。回归案例中&#xff0c;作者选用了一个经典的股票数据。分类案例中&#xff0c;选用的是公用的UCI数据集。 BP神经网络…

达芬奇密码

《达芬奇密码》是一款由德国人发明的桌游&#xff0c;游戏由2-4个人组成。每个玩家执有一定的数字牌&#xff0c;玩家需隐藏你的数字密码&#xff0c;猜透对手的密码&#xff0c;推测可能的答案&#xff0c;打败对手。 24 块塑料立牌&#xff0c;12 个黑色和12个白色。每块上数…

7-25作业

思维导图 QT窗口代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<< this->size();this->resize(1000,800);//设置宽高this->setFixedSize(1000,800);//固定宽高//窗口标题this->setWindowTitle("跟党走…

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

【Linux】进程通信 — 管道

文章目录 &#x1f4d6; 前言1. 通信背景1.1 进程通信的目的&#xff1a;1.2 管道的引入&#xff1a; 2. 匿名管道2.1 匿名管道的原理&#xff1a;2.2 匿名管道的创建&#xff1a;2.3 父子进程通信&#xff1a;2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务&#xff1a;2.5…

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

写在前面 工作中遇到&#xff0c;简单整理人脸识别中&#xff0c;对于模糊程度较高的图像数据&#xff0c;识别率低&#xff0c;错误率高。虽然使用 AdaFace 模型&#xff0c;对低质量人脸表现尤为突出。但是还是需要对 模糊程度高的图像进行丢弃处理当前通过阈值分类&#xff…

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…

Mysql-MHA高可用

MHA高可用配置及故障切换 一.MySQL MHA 1.什么是MHA &#xff08;&#xff11;&#xff09;MHA (Master High Availability) 是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 &#xff08;&#xff12;&#xff09;MHA的出现就是解决MySQL 单点的问题。 &#xff…

elementui el-table折叠表格,点击主表数据展开从表明细

用element-ui 的el-table实现&#xff1a;主表table可实现展开行显示关联的明细表table的列表数据&#xff0c;效果图如下 <el-tableref"tableData"v-loading"listLoading":data"tableData"row-key"id"borderstripehighlight-curr…

idea中设置maven本地仓库和自动下载依赖jar包

1.下载maven 地址&#xff1a;maven3.6.3 解压缩在D:\apache-maven-3.6.3-bin\apache-maven-3.6.3\目录下新建文件夹repository打开apache-maven-3.6.3-bin\apache-maven-3.6.3\conf文件中的settings.xml编辑&#xff1a;新增本地仓库路径 <localRepository>D:\apache-…

十二、数据结构——二叉树基本概念及特点

数据结构中的二叉树 目录 一、二叉树的基本概念 二、二叉树的特点 三、二叉树的分类 四、二叉树的存储结构 (一)、顺序存储 (二)、链式存储 一、二叉树的基本概念 二叉树是一种重要的数据结构&#xff0c;它是每个节点最多有两个子节点的树结构。在二叉树中&#xff0c;每个…

【源码解析】SpringBoot循环依赖源码解析II

前言 前面已经写过循环以来的分析&#xff0c;对循环依赖有一些了解&#xff0c;【源码解析】Spring循环依赖和三级缓存。简单回顾一下&#xff1a; Spring可以解决Autowired注入的循环依赖 Spring解决不了构造器注入的循环依赖 使用Aysnc注解会导致循环依赖。提前暴露的Bea…