作者: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 插装版本的转换过程。
你可以通过关注我们的其他一些博客来自行检测基础版本,而不是简单地启动已检测的版本。 这将教给你的不仅仅是查看已经构建的版本。
- Python:自动检测、手动检测
- Java:自动检测、手动检测
- Node.js:自动检测、手动检测
- .NET:自动检测、手动检测
先决条件
-
Docker 和 Compose
-
Elastic Cloud Cluster(开始免费试用)
在启动示例应用程序之前,请确保你已设置 Elastic 部署详细信息。 使用必要的凭据填充 .env 文件(位于与撰写文件相同的目录中)。 你可以从 Cloud UI 和 Kibana® 中的 /app/home#/tutorial/apm 路径下复制这些内容。
云用户界面
Kibana APM 教程
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. cd Elastiflix
2. docker-compose -f docker-compose.yml up -d --no-build
2. Elastic 检测版本
1. cd Elastiflix
2. docker-compose -f docker-compose-elastic.yml up -d --no-build
3. OpenTelemetry 检测版本
1. cd Elastiflix
2. docker-compose -f docker-compose-elastic-otel.yml up -d --no-build
启动所需版本后,在 localhost:9000 浏览该应用程序。 我们还在 localhost:8089 上部署了一个负载生成器,你可以在其中增加并发用户数。 请注意,负载生成器直接与节点后端服务通信。 如果你想从 javascript 前端生成 RUM 数据,那么你必须手动浏览到 localhost:9000 并访问几个页面。
模拟和故障场景
在现实世界中,应用程序会受到不同条件、随机错误和错误配置的影响。 我们整合了其中一些来模拟潜在的现实生活情况。 你可以在此处找到可能的环境变量列表。
非检测场景
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 检测场景
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 检测场景
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 运行。
查看现有的撰写文件,然后简单地复制每种服务类型的片段之一。
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 包含服务的所有可能的排列。
- 子目录的命名格式为 langauge−langauge-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