监控与观测

随着软件应用从单片架构向分布式微服务体系转变,应用监控(Monitoring)和观测(Observability)的需求也随之提升。两者存在相同的定义,目的都是为了发现应用程序中的问题。但还是有差别:

  • 监控:目的是为了捕获已知的问题,并将其显示在仪表盘上,用以了解其发生问题的原因和其发生的具体时间;
  • 观测:采用更底层的方式,即开发人员通过调试代码的方式从而了解程序的内部状态。为了帮助监控应用程序的未知问题的最新发展。

在这里插入图片描述
应用观测的三大支柱:

  • 指标(metrics):指出是否存在问题,通常是通过告警「发现」
  • 调用链(traces):标明问题点在哪里,「定位」
  • 日志(logs):协助定位产生问题的根本原因,「分析」

在这里插入图片描述
应用可观测的好处:

  • 找出潜在隐患
  • 降低告警疲劳
  • 更快发布产品
  • 提高自动化程度
  • 提高开发生产力

OpenTracing

OpenTracing,制定一套无关厂商、无关平台的协议标准,使开发人员只需要修改Tracer就可以更迅捷的添加或更换底层监控的实现。2016年CNCF正式接纳OpenTracing,顺利成为CNCF第三个项目,前两个项目都已成为云原生及开源领域的事实标准:Kubernetes和Prometheus。由此也可以看到行业对于可观测及统一标准的重视程度。GitHub。

OpenTracing由API规范、实现该规范的框架和库,以及项目文档组成,并进行以下努力:

  • 后台无关的API接口标准化:被追踪的服务只需要调用相关API接口,就可被任何实现这套接口的追踪后台支持;
  • 对跟踪最小单位Span管理标准化:定义开始Span,结束Span和记录Span耗时的API;
  • 进程间跟踪数据传递方式标准化:定义API方便追踪数据的传递;
  • 多语言应用支持;多跟踪器支持,Zipkin、LightStep、Appdash;可轻松集成到gRPC、Flask、DropWizard、Django和Go Kit等框架中。

术语

包括:

  • Traces:记录经过分布式系统的请求活动,一个Trace是Spans的有向无环图;
  • Spans:一个Trace中表示一个命名的,基于时间的操作。Spans嵌套形成Trace树。每个Trace包含一个根Span,描述端到端的延迟,其子操作也可能拥有一个或多个子Spans;
  • Metrics:在运行时捕获的关于服务的原始度量数据。Observer支持通过异步API来采集数据,每个采集间隔采集一个数据;
  • Context:一个Span包含一个Span Context,它是一个全局唯一的标识,表示每个Span所属的唯一请求,以及跨服务边界转移Trace信息所需的数据。OpenTelemetry也支持correlation context,可以包含用户定义的属性。correlation context不是必要的,组件可以选择不携带和存储该信息;
  • Context Propagation:表示在不同的服务之间传递上下文信息,通常通过HTTP首部。除Tracing外,还可用于执行A/B测试。支持通过多个协议的Context Propagation来避免可能发生的问题,但需要注意的是,在自己的应用中最好使用单一的方法;
  • References:Spans之间建立连接的描述,目前有两种类型,ChildOf和FollowsFrom。

Maven

io.opentracing是官方核心库,包含主要的接口和规范,如Tracer、Span、SpanContext等,其下的artifactId包括:

  • opentracing-api:定义OpenTracing的核心API;
  • opentracing-util:提供帮助工具,如GlobalTracer;
  • opentracing-noop:提供无操作的实现,用于无跟踪时的默认行为。

最后发布日期停留在2019年5月份,Maven依赖如下:

<dependency><groupId>io.opentracing</groupId><artifactId>opentracing-api</artifactId><version>0.33.0</version>
</dependency>
<dependency><groupId>io.opentracing</groupId><artifactId>opentracing-noop</artifactId><version>0.33.0</version>
</dependency>

io.opentracing.contrib是OpenTracing社区贡献的扩展库组件,用于与各种第三方框架和工具进行集成。目的是简化OpenTracing与常见工具和框架的集成,降低接入成本。

其下的artifactId包括:

  • opentracing-tracerresolver:帮助在运行时解析和加载具体的Tracer实现,如Jaeger或Zipkin;
  • opentracing-spring-cloud:为Spring Cloud应用提供OpenTracing集成;
  • opentracing-jdbc:为JDBC提供数据库调用的自动跟踪;
  • opentracing-kafka:用于跟踪Kafka消息的生产和消费。

一张图感受一下到底有多少个artifactId:
在这里插入图片描述
最后发布日期停留在2019年6月份。

Jaeger和OpenTracing

Jaeger是最早实现OpenTracing API的分布式追踪系统之一,由Uber开发,后来捐赠给CNCF。

Jaeger 1.x和2.x版本都支持OpenTracing API,可直接使用opentracing-api库进行分布式追踪开发。

OpenCensus

官网,其发起者是谷歌,也就是最早提出Tracing概念的公司,可理解为Google Dapper的社区版。和OpenTracing最大的不同在于除Tracing外,还包括Metrics指标监控;并不是单纯的规范制定,还包括数据采集的Agent、Collector等。有众多追随者,如微软。GitHub。

除沿用OpenTracing的相关术语之外,OpenCensus也定义一些新术语:

  • Tags:允许在记录时将指标与维度相关联。从而能够从不同角度分析测量结果;
  • Stats:收集库和应用记录的可观测结果,汇总、导出统计数据,并包括Recording、Views(聚合度量查询)两部分;
  • Trace:除Opentracing所提供的Span属性之外,OpenCensus还支持Parent SpanId、Remote Parent、Attributes、Annotations、Message Events、Links等属性;
  • Agent:OpenCensus Agent是一个守护进程,允许OpenCensus的多语言部署使用Exporter。与传统上为每个语言库和每个应用程序删除和配置OpenCensus Exporter不同,使用OpenCensus Agent,只需为其目标语言单独启用OpenCensus Agent Exporter。对于运维团队而言,实现单个Exporter管理并从多语言应用程序中获取数据,将数据发送到所选择的后端。与此同时,尽可能的减少反复启动或部署对于应用的影响。Agent还附带Receivers,使Agent直通后端,去接收可观测数据并将其路由到所选择的Exporter。如Zipkin、Jaeger或Prometheus。
  • Collector:OpenCensus的重要组成部分,由Go编写,可从任何可用Receivers的应用中接受流量,而不用关注编程语言以及部署方式。对于提供Metrics和Trace的服务或应用而言,只需要一个Exporters导出组件,就能从多语言应用中获取数据。对于开发者而言,只需要管理维护单个Exporter,所有应用都使用OpenCensus Exporter发送数据。开发人员自由选择将数据发送到业务所需的后端,并随时进行更好。为了解决通过网络发送大量数据可能需要处理发送失败的问题,Collector具有缓冲和重试功能,可确保数据完整性与可用性。
  • Exporters:OpenCensus 可通过各种 Exporter 实现将相关数据上传到各种后端,比如:Prometheus for stats、OpenZipkin for traces、Stackdriver Monitoring for stats and Trace for traces、Jaeger for traces、Graphite for stats。

遵循OpenCensus协议的产品有Prometheus、SignalFX、Stackdriver和Zipkin。

OpenTelemetry

OpenTracing项目在2019年停止更新,后续其功能被OpenTelemetry,简称OTel,所取代。GitHub。

遥测数据(Telemetry Data)是跨科学领域的通用术语,描述一种从远程位置收集数据集用于测量系统健康状况的行为。在DevOps中,系统指的就是软件应用,要收集的数据就是日志、调用链和指标。

架构简图
在这里插入图片描述

在OpenTracing基础上引入的术语:

  • Metrics:在运行时捕获的关于服务的原始度量数据。Observer支持通过异步API来采集数据,每个采集间隔采集一个数据;

OpenTracing、OpenCensus和OpenTelemetry

特性OpenTracingOpenCensusOpenTelemetry
简介最早的分布式追踪标准,定义统一的接口和规范,允许用户切换具体的追踪器Google发起,支持Tracing,Metrics,并提供数据采集Agent和CollectorOpenTracing和OpenCensus合并后产物,目的是构建一个统一的、全面的可观测性标准,支持分布式追踪和指标采集
覆盖范围仅支持分布式追踪,不涉及Metrics或Logs支持Traces、Metrics,但不包含Logs支持分布式追踪、指标、日志;提供自动代码注入和Collector(Agent/Gateway模式)
生态兼容性CNCF托管,被Jaeger、Zipkin等支持微软等公司加入支持,生态较强;缺乏统一的CNCF支持成为CNCF的标准,可被更多工具支持;兼容OpenTracing和OpenCensus,提供平滑迁移路径
标准化程度API标准SDK+采集架构统一API+SDK+协议
数据采集依赖第三方实现自带Agent/Collector自带OTLP Collector
当前状态2019年停止发布Release,GitHub于2023年5月24日归档GitHub于2023年8月1日归档活跃开发中,逐步取代OpenTracing和OpenCensus

对应替代关系:

  • io.opentracing:opentracing-apiio.opentelemetry:opentelemetry-api
  • io.opentracing:opentracing-utilio.opentelemetry:opentelemetry-sdk
  • io.opentracing.contrib:opentracing-tracerresolver→无直接替代,OpenTelemetry提供标准化的SDK初始化方式;
  • 其他io.opentracing.contrib库可被OpenTelemetry的自动检测和集成工具替代。

迁移指南:OpenTelemetry项目提供从OpenTracing迁移到OpenTelemetry的官方指南,其中列举关键变化和替代组件。

<dependency><groupId>io.opentelemetry.javaagent</groupId><artifactId>opentelemetry-javaagent-api</artifactId><version>0.16.1</version><scope>runtime</scope>
</dependency>

Jaeger和OpenTelemetry

互补:

  • OpenTelemetry:专注于数据采集和标准化,包括API、SDK、Collector;
  • Jaeger:Jaeger Exporter将数据从OpenTelemetry Collector或SDK导出到Jaeger后端;专注于追踪数据的存储、分析和可视化。

OTLP

OpenTelemetry Protocol,OpenTelemetry定义的标准数据格式。OTLP取代旧版协议(如Jaeger或Zipkin的专用协议),成为OpenTelemetry默认导出格式。

核心特性:

  • 多数据类型支持:统一传输跟踪、指标和日志;
  • 多传输协议:默认使用gRPC,支持HTTP/JSON;
  • 高效编码:基于Protocol Buffers的二进制编码,减少带宽占用;
  • 端到端可靠性:内置重试、队列和批处理机制。

架构
在这里插入图片描述

OTLP协议的关键优势:

  • 统一三种遥测数据的传输方式;
  • 通过PB实现高性能序列化;
  • 灵活的传输层支持(gRPC/HTTP)。

Jaeger

版本

在这里插入图片描述
版本1.*2.*,同时在更新release发布中。

版本区别:

在Jaeger 1.x中

  • 前端API:
    Jaeger提供完整的分布式追踪生态,包括一个实现OpenTracing标准的客户端(通过jaeger-client库)。开发者可以直接调用Jaeger的API(如JaegerTracer)来生成和发送追踪数据。
  • 后端处理:
    Jaeger同时作为追踪系统的后端,包含以下组件:
    • Agent:接收应用程序发来的Span数据;
    • Collector:处理和存储追踪数据到数据库;
    • Query:提供数据查询和UI可视化。

Jaeger 1.x是全栈式分布式追踪解决方案,包括前端API和后端功能。

在Jaeger 2.x中:

  • 前端API的弱化:不再专注于提供客户端API,而是转向支持OpenTelemetry的标准API和SDK。应用程序需要直接调用OpenTelemetry的API(如Tracer、Span),而不是依赖Jaeger的API。官方建议是使用OpenTelemetry SDK进行追踪数据的采集。
  • 后端功能的强化:Jaeger 2.x专注于成为分布式追踪的后端系统,处理追踪数据的接收、存储和可视化:
    • Collector:支持OpenTelemetry数据格式,兼容多种传输协议,如gRPC和HTTP;
    • 存储:支持多种存储后端,如ES、Cassandra、Kafka等;
    • Query和UI:继续提供可视化和分析功能,让开发者能查询和分析追踪数据。

Jaeger版本与OpenTracing、OpenTelemetry

1.x版本:

  • 支持OpenTracing API,用户通过io.opentracingio.opentracing.contrib配置Jaeger作为追踪器;
  • 完全依赖OpenTracing的规范和生态。

2.x版本:

  • 增加对OpenTelemetry的支持,同时兼容OpenTracing;
  • 提供新的组件和数据管道,集成OpenTelemetry Collector;
  • 主要作为分布式追踪的后端使用(Collector、存储、查询等),不再专注于前端API的实现;
  • 推荐使用OpenTelemetry API,而不是继续使用OpenTracing。

推荐阅读

  • https://www.echo.cool/docs/category/opentelemetry-教程
  • 从Opentracing、OpenCensus到OpenTelemetry,看可观测数据标准演进史
  • OpenTracing文档中文版翻译-吴晟
  • https://github.com/1046102779/opentracing

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下使用原始socket收发数据包

在Linux系统中&#xff0c;使用非原始的socket&#xff0c;可以收发TCP或者UDP等网络层数据包。如果要处理网络层以下的数据包&#xff0c;比如ICMP、ARP等&#xff0c;或者更底层&#xff0c;比如链路层数据包&#xff0c;就得使用原始socket了。 创建socket 创建socket要使用…

暑期自学嵌入式——Day05补充(C语言阶段)

接续上文&#xff1a;暑期自学嵌入式——Day05&#xff08;C语言阶段&#xff09;-CSDN博客 主页点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博…

.NET Core EFCore零基础快速入门简单使用

一、什么是 Entity Framework (EF) Core Entity Framework (EF) Core 是轻量化、可扩展和跨平台版的对象关系映射程序 (O/RM)数据访问技术&#xff0c;。 它将开发人员从编写大量 SQL 语句中解放出来。 二、EF的相关程序包 Microsoft.EntityFrameworkCore 核心程序包&#x…

AAC音频格式

目录 AAC音频格式介绍 主要特点 技术优势 常见文件扩展名 应用领域 AAC与PCM的区别与优势对比 基本概念差异 主要技术区别 各自优势 PCM的优势 AAC的优势 应用场景选择 AAC音频数据格式解析 1. AAC 文件格式 (1) ADIF (Audio Data Interchange Format) (2) ADT…

pom.xml文件中的${}变量从哪里传值

在 Maven 的 pom.xml 文件中&#xff0c;${} 格式的变量&#xff08;称为属性占位符&#xff09;的值来源主要有以下几种途径&#xff1a; 1. ​内置属性&#xff08;Maven 预定义&#xff09;​​ ${project.basedir}&#xff1a;项目根目录${project.version}&#xff1a;项…

【人工智能】项目案例分析:使用TensorFlow进行大规模对象检测

🏆🏆欢迎大家来到我们的天空🏆🏆 🏆 作者简介:我们的天空 🏆《头衔》:大厂高级软件测试工程师,阿里云开发者社区专家博主,CSDN人工智能领域新星创作者。 🏆《博客》:人工智能,深度学习,机器学习,python,自然语言处理,AIGC等分享。 所属的专栏:TensorF…

C++---cout、cerr、clog

在C编程里&#xff0c;cout、cerr和clog是标准库提供的重要输出流对象&#xff0c;在数据输出方面发挥着关键作用。 一、cout&#xff1a;标准输出流 cout 是 std::ostream 类的对象&#xff0c;其作用是向标准输出设备&#xff08;一般是控制台&#xff09;输出数据。它和 C 语…

脉冲神经网络(Spiking Neural Network, SNN)与知识蒸馏(Knowledge Distillation, KD)

目录 脉冲神经网络&#xff08;Spiking Neural Network, SNN&#xff09; 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09; 三种类别 三种变体 脉冲神经网络&#xff08;Spiking Neural Network, SNN&#xff09; 收到生物神经系统的启发&#xff0c;设计的&a…

使用Java完成下面项目

第一题&#xff1a;从控制台输入十个学生的成绩&#xff0c;使用list集合来保存数据&#xff0c; 遍历并打印其中成绩不及格的成绩&#xff0c;打印最高成绩&#xff0c;最低成绩&#xff0c;并计算及格率代码如下public class Home1 {public static void main(String[] args) …

龙虎榜——20250718

上证指数今天上涨收阳线&#xff0c;继续在5天均线保持强势上涨&#xff0c;个股下跌稍多&#xff0c;大盘股上涨为主。深证指数收小阳线&#xff0c;继续在5天均线上&#xff0c;总体保持强势&#xff0c;调整更多是小票。2025年7月18日龙虎榜行业方向分析1. 医药医疗• 代表标…

2025年华为认证之HCIE-云计算方向的报考流程

一、先搞明白&#xff1a;HCIE - 云计算认证到底是啥&#xff1f; HCIE - 云计算&#xff08;华为认证 ICT 专家 - 云计算&#xff09;是华为体系里云计算领域的顶级认证&#xff0c;说白了&#xff0c;就是证明你有能力搞定大型企业的云平台设计、部署和运维。现在政企、金融…

什么是私有化部署企业即时通讯?吱吱企业即时通讯安全吗?

在企业数字化转型加速的今天&#xff0c;沟通工具的选择已经从满足简单沟通&#xff0c;升级为“安全、高效、可控”。其中&#xff0c;“私有化部署企业即时通讯”成为许多中小型企业、跨国企业以及数据敏感型企业的核心需求。 那么&#xff0c;究竟什么是私有化部署&#xff…

Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框

在 Vue3 项目中&#xff0c;我们经常会用到 ElNotification 作为消息提醒组件&#xff0c;尤其是在异步操作、任务完成或用户需要交互确认时。然而&#xff0c;Element Plus 默认的 Notification 是非交互式的&#xff0c;不能直接嵌入按钮或事件。 今天我们来实现一个带自定义…

下载webrtc M114版本源码只能使用外网googlesource源-命令版

声网、国内源都不行&#xff0c;只能外网googlesource源&#xff01;&#xff01;&#xff01; 二、创建 Ubuntu 容器&#xff08;带目录挂载&#xff09; 拉取Ubuntu镜像 docker pull ubuntu:22.04创建并启动容器&#xff08;挂载Windows目录到容器&#xff09; docker run -i…

Linux运维新手的修炼手扎之第21天

Nginx服务和Tomcat服务1 负载均衡语法格式&#xff1a;upstream[一个或多个]rootubuntu24-13:~# vim /etc/nginx/conf.d/vhost.confupstream group1 {server 10.0.0.16;}upstream group2 {server 10.0.0.14;}server {listen 80;server_name sswang1.magedu.com;location / {pro…

TrOCR: 基于Transformer的光学字符识别方法,使用预训练模型

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" TrOCR: 基于Transformer的光学字符识别方法&#xff0c;使用预训练模型 摘要 文本识别是文档数字化中的一个长期研究问题。现有方法通常基于CNN进行图像理解&#xff0c;基于RNN进行字符级文本生成。此外&#…

西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技

概要2025年6月&#xff0c;西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访我司。庭田科技总经理聂春文携销售团队对西门子代表团表示热烈欢迎&#xff0c;并就当前业务发展方向及未来行业聚焦领域与代表团展开深入交流。 聂春文总经理及销售团队陪同西门…

在 Jenkins 中使用 SSH 部署密钥

本文档介绍了如何在 Jenkins 中配置 SSH 部署密钥&#xff0c;以便更稳定地拉取 Git 仓库代码&#xff0c;避免常见的 RPC 错误。 1. 背景 在使用 Jenkins 进行持续集成时&#xff0c;常常需要从 Git 仓库拉取代码。如果使用 HTTP/HTTPS 协议&#xff0c;有时会遇到 RPC 错误&…

小红书采集工具:无水印图片一键获取,同步采集笔记与评论

我用python语言开发了一款名为“爬xhs图片软件”的工具&#xff0c;该工具不仅能采集图片&#xff0c;还可获取笔记数据、评论数据等内容。 软件界面长这个样子&#xff1a; 采集到的图片&#xff1a;演示视频&#xff1a;https://live.csdn.net/v/485813介绍文章、想你所想&am…

Java行为型模式---命令模式

命令模式基础概念命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。命令模式…