Observability:通过示例应用程序开始使用 OpenTelemetry 检测

作者:Luca Wintergerst

应用程序性能管理 (APM) 已经超越了传统的监控,成为开发人员的重要工具,可以在代码级别提供对应用程序的深入洞察。 通过 APM,团队不仅可以检测问题,还可以了解其根本原因,从而优化软件性能和最终用户体验。 现代环境呈现出各种各样的 APM 工具和提供不同解决方案的公司。 此外,OpenTelemetry 正在成为 APM 的开放摄取标准。 借助 OpenTelemetry,DevOps 团队可以采用一致的方法来收集和获取遥测数据。

Elastic® 提供自己的 APM Agents,可用于检测你的代码。 此外,Elastic 还原生支持 OpenTelemtry

找出差异并了解如何使用这些工具来检测应用程序可能具有挑战性。 这就是我们的示例应用程序 Elastiflix(电影搜索 UI)发挥作用的地方。 我们精心设计它是为了演示 OTEL 和 Elastic APM 的细微差别,指导你完成 APM 工具的过程,并展示如何根据你的喜好使用其中之一。

示例应用程序

我们刻意让电影搜索用户界面保持简单。 它显示一些电影,有一个搜索栏,并且在撰写本文时,只有一个真正的功能:你可以将电影添加到你的收藏夹列表中。

服务、语言和检测

我们的应用程序有一些不同的服务:

  • javascript-frontend:React 前端,与节点服务和 Elasticsearch® 对话
  • node-server:节点后端,与其他后端服务通信
  • dotnet-login:返回随机用户名的登录服务

我们用几种不同的语言重新实现了 "favorite" 服务,因为我们不想给应用程序的架构带来额外的复杂性。

  • Go-favorite:Go 服务,在 Redis 中存储最喜欢的电影列表
  • Java-favorite:在 Redis 中存储喜爱的电影列表的 Java 服务
  • Python-favorite:在 Redis 中存储喜爱的电影列表的 Python 服务

除此之外,还有一些其他的支持容器:

  • Movie-data-loader:将电影数据库加载到 Elasticsearch 集群中
  • Redis:用作数据存储来跟踪用户的收藏夹
  • Locust:与节点服务对话以引入人工负载的负载生成器

与其他一些示例应用程序存储库相比,主要区别在于我们用多种语言对其进行了编码,每种语言版本都显示了几乎所有可能的检测类型:

为什么采用这种方法?

虽然示例应用程序可以很好地了解工具的工作原理,但它们通常只展示一个版本,让开发人员自己找到所有必要的修改。 我们采取了不同的方法。 通过提供多个版本,我们打算弥合知识差距,使开发人员能够轻松查看和理解从非插装代码到 Elastic 或 OTEL 插装版本的转换过程。

你可以通过关注我们的其他一些博客来自行检测基础版本,而不是简单地启动已检测的版本。 这将教给你的不仅仅是查看已经构建的版本。

先决条件

在启动示例应用程序之前,请确保你已设置 Elastic 部署详细信息。 使用必要的凭据填充 .env 文件(位于与撰写文件相同的目录中)。 你可以从 Cloud UI 和 Kibana® 中的 /app/home#/tutorial/apm 路径下复制这些内容。

云用户界面

Kibana APM 教程

ini 复制代码
1.  ELASTIC_APM_SERVER_URL="https://foobar.apm.us-central1.gcp.cloud.es.io"
2.  ELASTIC_APM_SECRET_TOKEN="secret123"
3.  ELASTICSEARCH_USER
4.  ELASTICSEARCH_PASSWORD="changeme"
5.  ELASTICSEARCH_URL="https://foobar.es.us-central1.gcp.cloud.es.io"

启动应用程序

你可以灵活地以三种不同的方式启动我们的示例应用程序,每种方式对应不同的仪器场景。

我们提供公共 Docker 映像,你可以在提供 --no-build 标志时使用它们。 否则,镜像将从你的计算机上的源代码构建,这将需要大约 5-10 分钟。

  1. 非检测版本

markdown 复制代码
1.  cd Elastiflix
2.  docker-compose -f docker-compose.yml up -d --no-build

2. Elastic 检测版本

markdown 复制代码
1.  cd Elastiflix
2.  docker-compose -f docker-compose-elastic.yml up -d --no-build

3. OpenTelemetry 检测版本

markdown 复制代码
1.  cd Elastiflix
2.  docker-compose -f docker-compose-elastic-otel.yml up -d --no-build

启动所需版本后,在 localhost:9000 浏览该应用程序。 我们还在 localhost:8089 上部署了一个负载生成器,你可以在其中增加并发用户数。 请注意,负载生成器直接与节点后端服务通信。 如果你想从 javascript 前端生成 RUM 数据,那么你必须手动浏览到 localhost:9000 并访问几个页面。

模拟和故障场景

在现实世界中,应用程序会受到不同条件、随机错误和错误配置的影响。 我们整合了其中一些来模拟潜在的现实生活情况。 你可以在此处找到可能的环境变量列表。

非检测场景

ini 复制代码
1.  # healthy
2.  docker-compose -f docker-compose.yml up -d

4.  # pause redis for 5 seconds, every 30 seconds
5.  TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose.yml up -d

7.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
8.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose.yml up -d

10.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
11.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose.yml up -d

13.  # throw error in nodejs service, 50% of the time
14.  THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose.yml up -d 

Elastic 检测场景

ini 复制代码
1.  # healthy
2.  docker-compose -f docker-compose-elastic.yml up -d

4.  # pause redis for 5 seconds, every 30 seconds
5.  TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose-elastic.yml up -d 

7.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
8.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose-elastic.yml up -d

10.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
11.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose-elastic.yml up -d

13.  # throw error in nodejs service, 50% of the time
14.  THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose-elastic.yml up -d 

OpenTelemetry 检测场景

ini 复制代码
1.  # healthy
2.  docker-compose -f docker-compose-elastic-otel.yml up -d

4.  # pause redis for 5 seconds, every 30 seconds
5.  TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose-elastic-otel.yml up -d 

7.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
8.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose-elastic-otel.yml up -d

10.  # add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
11.  TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose-elastic-otel.yml up -d

14.  # throw error in nodejs service, 50% of the time
15.  THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose-elastic-otel.yml up -d 

混合 Elastic 和 OTel

由于应用程序具有所有可能排列的服务,并且 "favorite" 服务甚至是用多种语言编写的,因此你还可以以混合模式运行它们。

你还可以并行运行其中一些,就像我们对 "favorite" 服务所做的那样。

Elastic 和 OTel 完全兼容,因此你可以运行一些使用 OTel 检测的服务,而其他服务则使用 Elastic APM Agent 运行。

查看现有的撰写文件,然后简单地复制每种服务类型的片段之一。

ini 复制代码
 1.    favorite-java-otel-auto:
2.      build: java-favorite-otel-auto/.
3.      image: docker.elastic.co/demos/workshop/observability/elastiflix-java-favorite-otel-auto:${ELASTIC_VERSION}-${BUILD_NUMBER}
4.      depends_on:
5.        - redis
6.      networks:
7.        - app-network
8.      ports:
9.        - "5004:5000"
10.      environment:
11.        - ELASTIC_APM_SECRET_TOKEN=${ELASTIC_APM_SECRET_TOKEN}
12.        - OTEL_EXPORTER_OTLP_ENDPOINT=${ELASTIC_APM_SERVER_URL}
13.        - OTEL_METRICS_EXPORTER=otlp
14.        - OTEL_RESOURCE_ATTRIBUTES=service.version=1.0,deployment.environment=production
15.        - OTEL_SERVICE_NAME=java-favorite-otel-auto
16.        - OTEL_TRACES_EXPORTER=otlp
17.        - REDIS_HOST=redis
18.        - TOGGLE_SERVICE_DELAY=${TOGGLE_SERVICE_DELAY}
19.        - TOGGLE_CANARY_DELAY=${TOGGLE_CANARY_DELAY}
20.        - TOGGLE_CANARY_FAILURE=${TOGGLE_CANARY_FAILURE}

使用源代码

Repository 包含服务的所有可能的排列。

  • 子目录的命名格式为 <math xmlns="http://www.w3.org/1998/Math/MathML"> l a n g a u g e − langauge- </math>langauge−serviceName-(elastic|otel)-(auto|manual)。 例如,python-favorite-otel-auto 是一个 Python 服务。 它的名字是 "favorite",它使用 OpenTelemetry 进行检测,使用自动检测。
  • 现在,你可以将此目录与 python-favorite 目录下提供的该服务的非检测版本进行比较。

这可以让你轻松理解两者之间的区别。 此外,你还可以使用非检测版本从头开始,尝试自己一步一步实现检测。

结论

监控不仅仅是观察; 这是关于理解和优化。 我们的示例应用程序旨在指导你使用 Elastic APM 或 OpenTelemetry,为你提供构建弹性和高性能应用程序的工具。

原文:Getting started with OpenTelemetry instrumentation with a sample application | Elastic Blog

相关推荐
喝醉酒的小白7 分钟前
ES 集群 A 和 ES 集群 B 数据流通
大数据·elasticsearch·搜索引擎
炭烤玛卡巴卡11 分钟前
初学elasticsearch
大数据·学习·elasticsearch·搜索引擎
it噩梦14 分钟前
es 中使用update 、create 、index的区别
大数据·elasticsearch
Mitch3112 小时前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch3112 小时前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
喝醉酒的小白4 小时前
Elasticsearch(ES)监控、巡检及异常指标处理指南
大数据·elasticsearch·搜索引擎
孤水寒月6 小时前
Git忽略文件.gitignore
git·elasticsearch
LKAI.13 小时前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
it噩梦1 天前
elasticsearch中使用fuzzy查询
elasticsearch
喝醉酒的小白1 天前
Elasticsearch相关知识@1
大数据·elasticsearch·搜索引擎