# 阿里云 OpenTelemetry 实践
> 本文部分内容参考 https://opentelemetry.io/
## 基本概念
### 分布式链路追踪
**分布式链路追踪(Distributed Traces)**,更常见的说法是**链路追踪(Trace)**,用于记录由应用程序或最终用户提出的请求在多服务架构(如微服务或 serverless 应用程序)中所传播的路径。
如果没有链路追踪,要想找出分布式系统中性能问题的原因是很困难的。
链路追踪提高了我们的应用或系统健康状况的可见性,让我们能够调试难以在本地重现的行为。链路追踪对于分布式系统来说是必不可少的,因为这些系统通常有非确定性的问题,或者过于复杂而无法在本地重现。
链路追踪使调试和理解分布式系统变得不那么困难,因为它分解了一个请求在分布式系统中流动时发生的情况。
一个链路追踪是由一个或多个 **Span** 组成的。第一个 Span 代表根 Span。每个根 Span 代表一个请求从开始到结束。父级 Span 下面的 Span 提供了一个更深入的背景,即在一个请求中发生了什么(或者说哪些步骤构成了一个请求)。
许多提供链路观测的后端将一个 Traces 可视化为瀑布图,看起来可能是这样的。
![瀑布图](https://opentelemetry.io/img/waterfall_trace.png)
瀑布图显示了根 Span 和其子 Span 之间的父子关系。当一个 Span 封装了另一个 Span,这也代表了一种嵌套关系。
### Span
一个 Span 代表一个工作单位或操作单位。它跟踪一个请求所做的具体操作,描绘出在执行该操作的时间内所发生的事情。
Span 包含名称、与时间相关的数据、结构化的日志信息和其他元数据(如属性,Attributes),以提供关于它所追踪的操作的信息。
下面是一个 Span 中的信息类型的例子。
| Key | Value |
| :--------------: | :-------------------------------------------------------------------------------------------------------------------: |
| net.transport | IP.TCP |
| net.peer.ip | 10.244.0.1 |
| net.peer.port | 10243 |
| net.host.name | localhost |
| http.method | GET |
| http.target | /cart |
| http.server_name | frontend |
| http.route | /cart |
| http.scheme | http |
| http.host | localhost |
| http.flavor | 1.1 |
| http.status_code | 200 |
| http.user_agent | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 |
## 背景
### 链路追踪为什么重要
微服务架构使开发者能够更快、更独立地构建和发布软件,因为他们不再受制于与单体架构相关的复杂的发布流程。
随着这些分布式系统的扩展,开发人员越来越难看到自己的服务是如何依赖或影响其他服务的,特别是在部署后或停运期间,速度和准确性至关重要。
并且,链路追踪带来的可观察性使开发者和运营商二者都能进一步明确系统的状态。
### 链路追踪的各种实践
为了使一个系统可以被观察到,它必须被**插桩(instrumented)**。也就是说,代码必须发出跟踪、度量和日志,这些数据也被称为**遥测数据**。然后,这些数据必须被发送到**观测者(Observability)** 后端。现在有很多观测者后端,从一些开源工具(如 Jaeger 和 Zipkin)到商业 SaaS 产品。
过去,对代码进行检测的方式会有所不同,因为每个观测者后端都有自己的检测库和代理,用于向工具发送数据。
这意味着向观测者后端发送数据时没有标准化的数据格式。此外,如果一个公司选择更换观测者后端,就意味着他们必须重新对其代码进行测量,并配置新的代理,以便能够向所选择的新工具发射遥测数据。
由于缺乏标准化,最终的结果是缺乏数据的可移植性,并给用户带来了维护插桩库的负担。
认识到标准化的需要,云计算社区走到一起,两个开源项目诞生了。OpenTracing(云原生计算基金会(CNCF)项目)和 OpenCensus(谷歌开源社区项目)。
- **OpenTracing** 提供了一个供应商中立的 API,用于将遥测数据发送到观测者后端;不过,它依赖于开发者实现自己的库来满足规范。
- **OpenCensus** 提供了一套特定语言的库,开发者可以用它来检测他们的代码,并将其发送到他们支持的任何一个后端。
### OpenTelemetry 的诞生
为了拥有一个单一的标准,OpenCensus 和 OpenTracing 在 2019 年 5 月被合并为 OpenTelemetry(简称 OTel)。作为一个 CNCF 的孵化项目,OpenTelemetry 吸取了两个项目的精华,并去其糟粕。
OTel 的目标是提供一套标准化的、厂商无关的 SDK、API 和工具,用于提取、转换和发送数据到观测者后端。
### OpenTelemetry 能做什么
- 每种编程语言都有一个单一的、与供应商无关的插桩库,支持自动和手动插桩。
- 提供一个单一的供应商中立的采集器二进制文件,可以以各种方式部署。
- 一个端到端的实现,以生成、发送、收集、处理和导出遥测数据。
- 完全控制你的数据,能够通过配置将数据并行地发送到多个目的地。
- 开放标准的语义约定,以确保供应商的数据收集不受影响
- 能够平行地支持多种上下文传播格式,以确保随着标准的发展,程序代码能够顺利迁移。
- 无论你在链路中处于什么位置,都能保证你的下游链路对你可见。
由于支持各种开源和商业协议、格式和上下文传播机制,以及为 OpenTracing 和 OpenCensus 项目提供兼容,在项目中采用 OpenTelemetry 是很容易的。
不过,与 Jaeger 、 Zipkin 等不同。OpenTelemetry 并不提供观测后端,它更类似于一种统一的 API ,用于给不同的观测后端提供数据。
## 实践
### 目的
以阿里云作为观测者(Observability)后端,OpenTelemetry 为遥测接口。实现一个如下图所示的链路追踪:
<center>
_拓扑图_
![topo.png](https://s2.loli.net/2023/01/29/fBDAjmePxlHKgUG.png)
_节点列表_
![Severs.png](https://s2.loli.net/2023/01/29/Qk3pRxSA6TIZyOV.png)
| Node Name | Language | Instrumentation |
| :---------: | :------: | :----------------: |
| otlp-server | Golang | Manual |
| otlp-client | Golang |
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
基于 OpenTelemetry 的链路追踪实践(阿里云平台).zip (44个子文件)
资料总结
PHP
nginx
www
composer.json 462B
composer.phar 2.71MB
index.php 2KB
composer.lock 78KB
conf
conf.d
otel-test-php.conf 498B
Dockerfile 343B
Python
otel_shell.txt 452B
app_pure.py 554B
LICENSE 1KB
Go
client
go.mod 2KB
go.sum 48KB
Makefile 33B
Dockerfile 725B
README.md 45B
main.go 4KB
server
go.mod 1KB
go.sum 47KB
Makefile 33B
Dockerfile 725B
README.md 45B
main.go 10KB
Java
otlp
HELP.md 1KB
mvnw.cmd 7KB
pom.xml 3KB
src
test
java
com
jzyx
otlp
OtlpApplicationTests.java 203B
main
resources
application.properties 388B
java
com
jzyx
otlp
OtlpApplication.java 302B
controller
OtlpController.java 556B
target
classes
application.properties 388B
com
jzyx
otlp
controller
OtlpController.class 1KB
OtlpApplication.class 727B
otlp-0.0.1-SNAPSHOT.jar 29.8MB
test-classes
com
jzyx
otlp
OtlpApplicationTests.class 525B
maven-status
maven-compiler-plugin
compile
default-compile
createdFiles.lst 0B
inputFiles.lst 134B
testCompile
default-testCompile
createdFiles.lst 41B
inputFiles.lst 67B
otlp-0.0.1-SNAPSHOT.jar.original 4KB
surefire-reports
com.jzyx.otlp.OtlpApplicationTests.txt 317B
TEST-com.jzyx.otlp.OtlpApplicationTests.xml 23KB
maven-archiver
pom.properties 56B
alicloud.sh 318B
mvnw 10KB
README.md 18KB
共 44 条
- 1
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功