【云原生】Trace、Metrics、Logging 选型

news2024/12/28 20:29:11

背景

分布式追踪的起源

自从微服务的兴起开始,整个系统架构开始变得极为庞大和复杂,但是服务之间的调用关系,调用消耗时间等等信息却依然是半黑盒的状态。为了能够将调用的链路进行串联,将系统的各种指标数据展示出来以使得系统的链路更加透明便于排查故障,分布式追踪便应运而生。

百花齐放的分布式追踪

Zipkin

Zipkin最初是由Twitter开发并与2012年开源的一款开源追踪系统。Zipkin的使用非常广泛,影响了很多的后来人。他的传输头为X-B3

Skywalking

Skywalking是由国人开发,并且在后续捐赠给了Apache基金会的一个开源项目。现在是Apache基金会的顶级项目。

Pinpoint

Pinpoint由Naver在2012年开发,并于2015年开源。Pinpoint适用于java,php和python。

Jaeger

Jaeger最早是由Uber开发并于2017年开源,后续捐赠给了CNCF基金会。

OpenTracing

OpenTracing 的优势在于制定了一套无关厂商、无关平台的协议标准,使开发人员只需要修改 Tracer 就可以更迅捷的添加或更换底层监控的实现,被追踪的服务只需要调用相关 API 接口,就可被任何实现这套接口的追踪后台支持。也是基于这一点,2016 年云原生计算基金会 CNCF 正式接纳 OpenTracing,顺利成为 CNCF 第三个项目。而前两个项目都已成为云原生及开源领域的事实标准–Kubernetes 和 Prometheus,OpenTracing由CNCF托管,具备较为完善的instrumentation库。

遵循 OpenTracing 协议的产品有 Jaeger、Zipkin、 LightStep 和 AppDash 等追踪组件,并可以轻松集成到 gRPC、Flask、Django 和 Go-kit 等开源框架中。

OpenCensus

OpenCensus由Google发起,最初是Google内部追踪平台,后开源。OpenCensus 提供了统一的测量工具:跨服务捕获跟踪跨度 Span、应用级别指标 Metrics。

• 相较于 OpenTracing 只支持 Traces,OpenCensus 支持 Traces 和 Metrics。

• 相较于 OpenTracing 制定规范,OpenCensus 不仅制定规范,还包含了 Agent 和 Collector。

• 家属团阵容相较 OpenTracing 更加庞大,获得 Google、微软支持。

收集库和应用记录的可观测结果,汇总、导出统计数据,并包括 Recording(记录)、Views(聚合度量查询)两部分。

核心术语介绍

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

• Tags

OpenCensus 允许在记录时将指标与维度相关联。从而能够从不同角度分析测量结果。

• 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。对于运维团队而言,实现单个 exporte 管理并从多语言应用程序中获取数据,将数据发送到所选择的后端。与此同时,尽可能的减少反复启动或部署对于应用的影响。最后,Agent 还附带了“Receivers”。“Receivers”使 Agent 直通后端,去接收可观测数据并将其路由到所选择的 Exporter。比如 Zipkin、Jaeger 或 Prometheus。

• Collector

Collector 作为 OpenCensus 的重要组成部分,由 Go 语言便编写,可以从任何可用 Receivers 的应用中接受流量,而不用关注编程语言以及部署方式,而这个好处显而易见。对于提供 Metrics 和 Trace 的服务或应用而言,只需要一个 Exporters 导出组件,就能从多语言应用中获取数据。

• Exporters

OpenCensus 可以通过各种 Exporter 实现将相关数据上传到各种后端,比如:Prometheus for stats、OpenZipkin for traces、Stackdriver Monitoring for stats and Trace for traces、Jaeger for traces、Graphite for stats。

OpenCensus与OpenTracing

在上述的项目中有两个项目较为特殊:其一是OpenTracing,他制定了一套无关平台的统一的Trace的标准,后续的很多项目例如Jaeger等都是基于此协议,因此他在当时的Trace标准领域具有不小影响力;其二是OpenCensus,他背靠Google,并且它不仅仅实现了Trace,还包括了Metrics,并且他包含了一系列诸如Agent和Collector的方案,可以说是相当完备。

在当时这两大流派可以说是互相有一大票的追随者,一边是以Google和微软领衔的OpenCensus,一边是众多开源项目和厂商使用的OpenTracing,两者可以说是各有优劣,各领风骚。

我们先看看一个典型服务问题排查过程是怎样的:

• 通过各式各样预设报警发现异常(Metrics/Logs)

• 打开监控大盘查找异常现象,并通过查询找到异常模块(Metrics)

• 对异常模块以及关联日志进行查询分析,找到核心的报错信息(Logs)

• 通过详细的调用链数据定位到引起问题的代码(Tracing)

为了能够获得更好的可观测性或快速解决上述问题,Tracing、Metrics、Logs缺一不可。

与此同时,行业中已经有了丰富的开源及商业方案,其中包括:

• Metric:Zabbix、Nagios、Prometheus、InfluxDB、OpenFalcon、OpenCensus

• Tracing:Jaeger、Zipkin、SkyWalking、OpenTracing、OpenCensus

• Logs:ELK、Splunk、SumoLogic、Loki、Loggly。

Opentelemetry

为了更好的将 Traces、Metrics 和 Logs 融合在一起,OpenTelemetry 诞生了。作为 CNCF 的孵化项目,OpenTelemetry 由 OpenTracing 和 OpenCensus 项目合并而成,是一组规范、API 接口、SDK、工具和集成。为众多开发人员带来 Metrics、Tracing、Logs 的统一标准,三者都有相同的元数据结构,可以轻松实现互相关联。

@稀士掘金技术社区

OPENTELEMETRY

@稀土掘金技术社区

Opentelemetry可以说是含着金汤匙出生:OpenTracing支持,OpenCensus支持,刚开始就自带经验丰富的的社区人员,同时背后也有互联网巨头的支持。

OpenTelemetry 与厂商、平台无关,不提供与可观测性相关的后端服务。可根据用户需求将可观测类数据导出到存储、查询、可视化等不同后端,如 Prometheus、Jaeger 、云厂商服务中。

优势

OpenTelemetry 核心优势集中在以下部分:

• 规范的制定和协议的统一

OpenTelemetry 采用基于标准的实现方法。对标准的关注对于 OpenTelemetry 来说尤其重要,因为需要追踪跨语言的互操作性。许多语言都带有类型定义,可以在实现中使用,例如用于创建可重用组件的接口。包括可观测客户端内部实现所需要的规范,以及可观测客户端与外部通信所需实现的协议规范。具体包括:

• API:定义 Metrics、Tracing、Logs 数据的类型和操作。

• SDK:定义 API 特定语言实现需求,定义配置、数据处理和导出概念。

• 数据:定义 OpenTelemetry Line Protocol (OTLP)。虽然在 Opentelemetry中组件支持了 Zipkin v2 或 Jaeger Thrift 协议格式的实现,但都以第三方贡献库形式提供。只有 OTLP 是 Opentelemetry 官方原生支持的格式。

多语言 SDK 的实现和集成

OpenTelemetry 为每个常见语言都实现了对应 SDK,将导出器与 API 结合在一起。SDK 是具体的、可执行的 API 实现。包含 C++、.NET、Erlang/Elixir、Go、Java、JavaScript、PHP、Python、Ruby、Rust、Swift。

OpenTelemetry SDK 通过使用 OpenTelemetry API 使用选择的语言生成可观测数据,并将该数据导出到后端。并允许为公共库或框架增强。用户可以使用 SDK 进行代码自动注入和手动埋点,同时对其他三方库(Log4j、LogBack 等)集成支持;这些包一般都是根据 opentelemetry-specification 里面的规范与定义,结合语言自身的特点去实现在客户端采集可观测数据的基本能力。如元数据在服务间、进程间的传递,Trace 添加监测与数据导出,Metrics 指标的创建、使用及数据导出等。

数据收集系统的实现

在 Tracing 实践中有个基本原则,可观测数据收集过程需要与业务逻辑处理正交。尽量减少可观测客户端对原有业务逻辑的影响,Collector 是基于这个原则。OpenTelemetry 基于 OpenCensus Service 的收集系统,包括 Agent 和 Collector。Collector 涵盖采集(Collect)、转换(Transform)和导出(Export)可观测数据的功能,支持以多种格式(例如 OTLP、Jaeger、Prometheus 等)接收可观测数据,并将数据发送到一个或多个后端。它还支持在输出可观测数据之前,对其进行处理和过滤。Collector contrib 软件包支持更多数据格式和后端。

从架构层面来说,Collector 有两种模式。一种是把 Collector 部署在应用相同的主机内(如Kubernetes 的 DaemonSet),或者部署在应用相同的 Pod 里面(如Kubernetes 中的 Sidecar),应用采集到的遥测数据,直接通过回环网络传递给 Collector。这种模式统称为 Agent 模式。另一种模式是把 Collector 当作一个独立的中间件,应用把采集到的遥测数据往这个中间件里面传递。这种模式称之为 Gateway 模式。两种模式既可以单独使用,也可以组合使用,只需要数据出口的数据协议格式跟数据入口的数据协议格式保持一致。

SigNoz

OpenTelemetry源自OpenSencuc和OpenTracing的合并,它的目标是集成Trace,Metrics,Logging能力来提供可观测性。过去的分布式追踪往往是各做各的,没有固定的标准,各个分布式追踪方案各显神通,使用不同的协议,不同的标准。但是OpenTelemetry不同,它提供了一系列的标准, 是一个与供应商无关的仪器库。它提供了一组工具、API 和 SDK 来创建和管理遥测数据(Trace,Metrics,Logging)。所以我们更倾向选择原生支持 OpenTelemetry 协议的工具。而目前火热的 SigNoz 就是一个好的选择。

SigNoz 是一个全栈开源应用程序性能监控和可观察性工具,旨在原生支持 OpenTelemetry。它还提供了一个快速的 OLAP 数据库——ClickHouse 作为存储后端。带有开箱即用的应用程序指标图表。

compare

SigNoz vs Prometheus

Prometheus is good if you want to do just metrics. But if you want to have a seamless experience between metrics and traces, then current experience of stitching together Prometheus & Jaeger is not great.

Our goal is to provide an integrated UI between metrics & traces - similar to what SaaS vendors like Datadog provides - and give advanced filtering and aggregation over traces, something which Jaeger currently lack.

SigNoz vs Jaeger

Jaeger only does distributed tracing. SigNoz supports metrics, traces and logs - all the 3 pillars of observability.

Moreover, SigNoz has few more advanced features wrt Jaeger:

Jaegar UI doesn’t show any metrics on traces or on filtered traces

Jaeger can’t get aggregates on filtered traces. For example, p99 latency of requests which have tag - customer_type='premium'. This can be done easily on SigNoz

SigNoz vs Elastic

SigNoz Logs management are based on ClickHouse, a columnar OLAP datastore which makes aggregate log analytics queries much more efficient

50% lower resource requirement compared to Elastic during ingestion

We have published benchmarks comparing Elastic with SigNoz. Check it out here

SigNoz vs Loki

SigNoz supports aggregations on high-cardinality data over a huge volume while loki doesn’t.

SigNoz supports indexes over high cardinality data and has no limitations on the number of indexes, while Loki reaches max streams with a few indexes added to it.

Searching over a huge volume of data is difficult and slow in Loki compared to SigNoz

We have published benchmarks comparing Loki with SigNoz. Check it out here

实践

Trace

无需改动代码,只要启动应用的时候加个代理就可以把全链路的数据传进Signoz里了。

java -javaagent:/agent/opentelemetry-javaagent.jar \
-Dotel.logs.exporter=otlp \
-Dotel.exporter.otlp.endpoint=http://172.34.91.29:4317 \
-Dotel.resource.attributes=service.name=service-provider \
-jar service-provider.jar

Logging

  1. 这一块需要侵入应用程序,opentelemetry 使用 jaeger 生成 traceId,并可以和 logback 集成,通过 logback 的 mdc 注入到日志文件中。

          <dependency>
            <groupId>io.opentelemetry.instrumentation</groupId>
            <artifactId>opentelemetry-spring-boot-starter</artifactId>
            <version>1.22.1-alpha</version>
        </dependency>
        <dependency>
            <groupId>io.opentelemetry.instrumentation</groupId>
            <artifactId>opentelemetry-jaeger-spring-boot-starter</artifactId>
            <version>1.22.1-alpha</version>
        </dependency>
        <dependency>
            <groupId>io.opentelemetry.instrumentation</groupId>
            <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
            <version>1.22.1-alpha</version>
        </dependency>

2、需要把我们的日志文件,导入到 Signoz 里。

Collecting Application Logs from Log file | SigNoz

Metrics

Send Metrics to SigNoz | SigNoz

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

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

相关文章

哈希->模拟实现+位图应用

致前行路上的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 1. unordered系列关联式容器 1.1 unordered_map 1.1.1概念介绍&#xff1a; 1.1.2 unordered_map的接口说明 1.2unordered_set 1.3常见面试题oj…

到底什么才是幻读?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

【NLP相关】基于现有的预训练模型使用领域语料二次预训练

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

《七》JavaScript 中的作用域、作用域链、执行上下文、执行上下文栈

JS 引擎会在执行所有代码之前&#xff0c;先在堆内存中创建一个全局对象&#xff08;Global Object、GO&#xff09;&#xff0c;包含 String、Math、Date、parseInt() 等属性和方法。所有作用域都可以访问这个全局对象。 在浏览器中 Global Object 就是 Window 对象。 执行上…

不用机器学习不用大数据,给你讲通ChatGPT的深层原理

ChatGPT现在看来已经异常火爆了&#xff0c;很多人已经熟知&#xff0c;并且开始练习使用或者开始利用他开始实践了。但仍然有很多人在观望&#xff0c;在疑惑&#xff0c;今天狗哥不用那些高端大气的机器学习亦或是大数据还给你讲通ChatGPT深层到底是个啥逻辑。 目录 1. 聊家…

CV——dy83 接昨天的论文中DAM模块:压缩-激励的宽残差网络在图像分类中的应用

压缩-激励的宽残差网络在图像分类中的应用&#xff08;ICIP 2019&#xff09;1. INTRODUCTION2. PROPOSED METHODS2.1 总体框架2.2 通道的重要性3. EXPERIMENTS3.1 Datasets3.2 训练和测试的设置3.3 分类结果及分析4. CONCLUSIONSQUEEZE-AND-EXCITATION WIDE RESIDUAL NETWORKS…

CSS 选择器以及CSS常用属性

目录 &#x1f407;今日良言:可以不光芒万丈,但不要停止发光 &#x1f42f;一、写CSS的三种方法 &#x1f42f;二、CSS选择器的常见用法 &#x1f42f;三、CSS常用属性 &#x1f407;今日良言:可以不光芒万丈,但不要停止发光 &#x1f42f;一、写CSS的三种方法 CSS的基本语…

目标检测开源数据集汇总

导 读本文汇总了一些开源目标检测类的数据集&#xff0c;附下载链接。多显著性对象数据集数据集链接&#xff1a;http://m6z.cn/5AsmXB本数据集共有 1224 张图像来自四个公共图像数据集&#xff1a;COCO、VOC07、ImageNet 和 SUN。Amazon Mechanic Turk 工作人员将每个图像标记…

Firebase入门使用 01

官网 firebase.google.com 解决问题 firebase 帮助解决 数据库 和 API之间的问题 这样我们就可以 集中精力开创应用。 快速上手样例指南 https://github.com/firebase 提供的服务 其中80%用不到&#xff0c;下面是一些我们可以用到的服务。 Authentication:用户认证管理…

Qt安装与使用经验分享;无.pro文件;无QTextCodec file;Qt小试;界面居中;无缝;更换Qt图标;更换Qt标题。

1、切换安装下载源 《Qt安装教程》先推荐一篇安装文章&#xff1a;《Qt安装教程》 Qt 5.15 之后已经不提供离线安装包了&#xff0c;就是那个 3.7G 的 exe 安装包。请看官方说明&#xff0c;所以只能用在线安装包。 1&#xff0c;下载在线安装包 QT 在线安装包链接&#xff…

基于WSL2和Clion搭建Win下C开发环境

系列文章目录 一、基于WSL2和Clion搭建Win下C开发环境 二、make、makeFile、CMake、CMakeLists的使用 三、全面、详细、通俗易懂的C语言语法和标准库 文章目录系列文章目录前言WSL2安装WSL常用命令VSCode连接WSLroot密码以systemd启动配置sshClion结语前言 Win下C语言开发环境…

zabbix-API对接实录:关键基础设施数据清洗和封装函数(php数组函数、数据清洗、数据结构化)

系列文章目录 Zabbix监控系统PHP-API开发测试实录Zabbix监控系统开发(2):JSON多维数组筛选字段是否包含字符串的解决方案Zabbix物联网可视化开发文档 文章目录系列文章目录前言一、zabbix-API数据爬虫二、主机ID封装接口1.封装API接口2.数据处理封装函数三、组ID封装接口1.格式…

汽车 Automotive > T-BOX GNSS高精定位测试相关知识

参考&#xff1a;https://en.wikipedia.org/wiki/Global_Positioning_SystemGPS和GNSS的关系GPS&#xff08;Global Positioning System&#xff09;&#xff0c;全球定位系统是美国军民两用的导航定位卫星系统&#xff0c;GPS包含双频信号&#xff0c;频点L1、L2和L5GNSS&…

RecyclerView ViewType二级

实现效果描述&#xff1a; 1、点击recyclerview中item&#xff0c;列表下方出现其他样式的item&#xff0c;作为子item&#xff0c;如下所示 所需要的java文件和xml文件有&#xff1a; 1、创建FoldAdapteradapter, 在FoldAdapter中&#xff0c;定义两种不同的类型&#xff…

Allegro如何将Waived掉的DRC显示或隐藏操作指导

Allegro如何将Waived掉的DRC显示或隐藏操作指导 在用Allegro做PCB设计的时候,如果遇到正常的DRC,可以用Waive的命令将DRC不显示,如下图 当DRC被Waive掉的时候,如何将DRC再次显示出来。类似下图效果 具体操作如下 点击Display

linux下strace的使用

strace是一款用于跟踪Linux系统调用和信号的工具&#xff0c;可以帮助开发者排除程序运行时的问题。 具体来说&#xff0c;strace可以跟踪一个程序执行时所涉及到的系统调用&#xff0c;包括读写文件、网络通信、进程管理、内存管理等操作&#xff0c;通过分析程序运行过程中发…

JavaWeb--JSP案例

JSP案例8 案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.2.2 编写工具类8.2.3 编写BrandService8.2.4 编写Servlet8.2.5 编写brand.jsp页面8.2.6 测试8.3 添加8.3.1 编写BrandMapper方法8.…

ARM uboot 的移植0-从三星官方 uboot 开始移植的准备工作

一、移植前的准备工作 1、三星移植过的uboot源代码准备 (1) 三星对于 S5PV210 的官方开发板为 SMDKV210&#xff0c;对应的移植过的 uboot 是&#xff1a;三星官方为210移植过的uboot和kernel/android_uboot_smdkv210.tar.bz2。 (2) 这个源代码网上是下载不到的&#xff0c;…

Leetcode.2397 被列覆盖的最多行数

题目链接 Leetcode.2397 被列覆盖的最多行数 Rating &#xff1a; 1719 题目描述 给你一个下标从 0 开始的 m x n二进制矩阵 mat和一个整数 cols&#xff0c;表示你需要选出的列数。 如果一行中&#xff0c;所有的 1 都被你选中的列所覆盖&#xff0c;那么我们称这一行 被覆盖…

RabbitMQ的使用以及整合到SpringBoot中

RabbitMQ的使用以及整合到SpringBoot中 一、比较&#xff1a; (1)、传统请求服务器&#xff1a; (2)、通过MQ去操作数据库&#xff1a; 通过MQ去操作数据库&#xff0c;从而达到削峰的效果&#xff1b; 问题现象&#xff1a; (1)、海量数据&#xff1b; (2)、高并发&#…