首页 > 其他分享 >使用 OpenTelemetry 构建可观测性 01 - 介绍

使用 OpenTelemetry 构建可观测性 01 - 介绍

时间:2023-08-15 17:24:03浏览次数:39  
标签:01 示例 博文 观测 OpenTelemetry 构建 数据 SDK

毫无疑问,在过去几年里,你可能已经多次听到过可观测性这个词。对于很多人来说,很难理解这个词的真正含义。对许多人来说,他们错误地将其等同于"监控"。虽然可观测性的根本定义以及它所包含的一切都不在本系列博文的讨论范围之内,但我强烈建议您购买一本由 Charity Majors (twitter)、Liz Fong-Jones (twitter) 和 George Miranda (twitter) 合著的《可观测性工程》(Observability Engineering)一书。

不过,本系列博文将介绍使用 OpenTelemetry 实现可观测性的完整示例和说明,OpenTelemetry 是 CNCF 的一个项目,致力于让可观测性变得更简单。

什么是 OpenTelemetry?

OpenTelemetry 是几年前 OpenCensus 和 OpenTracing 合并的产物。从那时起,OpenTelemetry(也简称为 "OTel")就很好地将自己定位为在现代软件世界中获取遥测数据且厂商中立的方法。很多人会说 OpenTelemetry 是可观测性的未来,根据我的经验和接触,我倾向于同意这种说法。

OTel 组件

在 OpenTelemetry 中典型的OTel方案可以被细分为几个逻辑组件,他们包括APIs, SDKs,收集器.

APIs and SDKs

在开始使用 OpenTelemetry 时,首先要了解的重要事项之一是该项目如何区分 API 和 SDK。简而言之,API 负责收集遥测数据及其中的所有数据,而 SDK 则负责将这些数据从当前被观测的进程中提取出来,转给另一个实体进行分析。随着我们对这个示例的深入研究,这一点将变得更有意义,但值得理解的是 API 和 SDK 之间的职责分离。

由于它们是关注点分离的,通过什么是观测(API)与如何处理(SDK)来区分它们。它们支持多种编程语言,包括(但不限于):Go、Python、Java、Ruby、JavaScript、.NET 等!有关语言支持的更多信息,请查看埋点文档。我们将在稍后的博文中介绍埋点知识。

Collector

SDK 的职责之一就是从正在被观测的进程中获取数据,但是需要一个地方来汇总接收这些数据。我们将这个独立的进程称为收集器。

收集器的整个工作可分为三个不同阶段:

  • 接收遥测数据
  • 处理遥测数据
  • 导出遥测数据

收集器是一个处理遥测数据的 ETL(Extract, Transform, Load)管道。虽然不一定要使用 OTel 解决方案,不过想要找个一个常用且好用的收集器例子,推荐用 OpenTelemetry Collector,它将是本系列的重点,并将在后面的博文中详细介绍。

Traces, metrics, and logs

在链路追踪和可观测性中,有三方面信息:链路追踪,指标数据和服务日志。虽然我们长期以来一直使用服务日志和指标数据,但是许多人认为链路追踪才是真正解锁可观测性能力的关键。

通过收集具备高基数(基数是指某个属性或维度的唯一值的数量,高基数数据可以认为是提供更全面和详尽的上下文信息)特点的链路追踪数据,我们就具备了不用修改代码也能够快速解答部分问题的能力。分析数据是可以有多种手段,例如说我们可以对比异常数据和常规数据等。

本系列博文将会专注于讲解链路追踪,如果你想进一步了解可观测性,以及三种信息之间差异可以参阅前文提到的《可观测性工程》一书。

示例应用

本系列博文的主要任务是介绍如何使用 OpenTelemetry 来让软件系统具备可观测性。为此,我创建了一个示例应用程序,并在后续文章中说明在应用过程中的一些要点。该应用程序的设计可参见下图:

20230726164314

这是一个购物车应用程序示例,按功能模块分成了不同的web服务:

  • 购物车 - 处理用户购物车数据请求的服务(用 Go 语言编写)
  • 用户服务 - 处理来自购物车服务的用户验证和查询请求(用 Go 语言编写)
  • 定价服务 - 为产品提供更新定价信息服务(用 Python 编写)

后端依赖MySQL对数据进行持久化存储。

使用 OpenTelemetry 的 API 和 SDK 进行埋点。遥测数据是通过 OpenTelemetry Collector 向 Jaeger 发送数据来实现的。

下面是使用 OpenTelemetry 采集并展示分布式链路跟踪数据在 Jaeger 中的示例:

20230726164452

所有代码和构建运行说明都可以在 GitHub 上找到:trstringer/otel-shopping-cart

总结

希望通过上面介绍让您现在对 OpenTelemetry 已经有所了解,知道它由哪些组件构成,以及我们将如何在本系列的其余部分深入实施。这仅仅是个开始!请继续关注本系列博文的其余部分,了解如何使用 OpenTelemetry 来让应用程序具备可观测性。

本文翻译自:https://trstringer.com/otel-part1-intro/

扩展阅读:

标签:01,示例,博文,观测,OpenTelemetry,构建,数据,SDK
From: https://www.cnblogs.com/ulricqin/p/17631878.html

相关文章

  • 漏洞复现报告:CVE-2017-7103 JQuery框架XSS漏洞
    1.简介jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。jQuery设计的目的是为了写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。据一项调查报告,在对4......
  • RTaW-Pegase构建可预测QoS的TSN网络架构
    1.设计下一代面向服务的E/E架构当今汽车上多达数以百计的ECU(电子控制单元),MCU(微控制处理器单元)及其上面运行着的大量的嵌入式软件代码,以及复杂的CAN、LIN、FlexRay等整车通讯网络决定了汽车不同于其他的IOT设备或智能手机。汽车上的电子电气架构一直在朝着为智能化和体验服务的方......
  • 通过docker构建nginx标准镜像
    跟之前的文章类似,只是这里构建的是标准镜像。通过docker构建nginx alpine镜像公众号:毛毛虫的小小蜡笔 通过docker构建nginxalpine镜像第一步:创建Dockerfile文件// 到data目录cd /data// 创建docker目录mkdir docker// 创建Dockerfile文件touch Dockerf......
  • 基于eBPF技术构建一种应用层网络管控解决方案
    引言随着网络应用的不断发展,在linux系统中对应用层网络管控的需求也日益增加,而传统的iptables、firewalld等工具难以针对应用层进行网络管控。因此需要一种创新的解决方案来提升网络应用的可管理性。本文将探讨如何使用eBPF技术构建一种应用层网络管控解决方案,为linux系统上的网络......
  • ARCHICAD 26(建筑设计软件) v26.4019英文版
    ARCHICAD26是一款领先的建筑设计软件,为建筑师、设计师和工程师提供了全面的工具和功能,用于创建、分析和可视化复杂的建筑项目。点击获取ARCHICAD26 ARCHICAD26建立在先前版本的成功基础上,为用户提供了更强大、更高效的建筑设计工具。首先,ARCHICAD26引入了新的Param-O......
  • 异构计算场景下构建可信执行环境
     本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第4期 | 异构计算场景下构建可信执行环境》演讲嘉宾 | 金意儿回顾整理 | 廖   涛排版校对 | 李萍萍嘉宾简介金意儿,华为可信计算首席科学家,IEEE硬件安全与可信专委会联***,OpenHarmony技术指导委员会......
  • 浅谈无线物联网能耗在线监测系统的构建--安科瑞张田田
    摘要:为加强能耗管理,改变人工抄表的现状,柴里煤矿利用信息化技术、网络技术、数据库实时技术,建立了能耗在线监测平台,对能源介质的生产、输送和消耗及供能、用能设备状态进行动态监控和数字化管理,通过实施运行,实现了能源的科学调度,能损隐患及时排查,规避了用能浪费,具有较高的推广应用价......
  • ChatGPT 问答00015 Java中如何判断字符串中含有3个以上日语字符
    要判断一个字符串中是否包含3个或更多日语字符,可以使用Java的正则表达式进行匹配,并配合计数器来统计匹配到的日语字符数量。以下是一个示例的Java代码:importjava.util.regex.*;publicclassMain{publicstaticvoidmain(String[]args){Stringstr="Hell......
  • day06 - 哈希表part01
    242. 有效的字母异位词讲解classSolution{public:boolisAnagram(strings,stringt){if(s.length()!=t.length())returnfalse;map<char,int>map_s;map<char,int>map_t;for(inti=0;i<s.length()......
  • ADM4016I The index indexName on the source table source-table does not match any
    ADM4016I Theindex indexName onthesourcetable source-table doesnotmatchanypartitionedindexesonthetargettable target-table .ALTERTABLEATTACHprocessingcontinues.https://www.ibm.com/docs/en/db2/10.5?topic=messages-adm0000-adm5999LastUp......