应用程序性能管理 (APM) 已经超越了传统的监控,成为开发人员必不可少的工具,可以深入了解代码级别的应用程序。借助 APM,团队不仅可以检测问题,还可以了解其根本原因,从而优化软件性能和最终用户体验。现代环境提供了各种 APM 工具和公司,它们提供不同的解决方案。此外,OpenTelemetry 正在成为 APM 的开放摄取标准。借助 OpenTelemetry,DevOps 团队可以使用一致的方法来收集和摄取遥测数据。
Elastic® 提供自己的 APM 代理,可用于检测您的代码。此外,Elastic 还原生支持 OpenTelemtry。
了解差异以及如何使用这些工具检测应用程序可能具有挑战性。这就是我们的示例应用程序 Elastiflix(一个用于电影搜索的 UI)的用武之地。我们精心设计了它来演示 OTEL 和 Elastic APM 的细微差别,指导您完成 APM 仪表化过程,并展示如何根据您的偏好使用其中一种或另一种。
示例应用程序
我们特意使电影搜索 UI 非常简单。它显示了一些电影、一个搜索栏,并且在撰写本文时,只有一个实际功能:您可以将电影添加到您的收藏夹列表中。
服务、语言和仪表化
我们的应用程序有几个不同的服务
- javascript-frontend:一个 React 前端,与节点服务和 Elasticsearch® 通信
- node-server:节点后端,与其他后端服务通信
- dotnet-login:一个返回随机用户名的登录服务
我们使用几种不同的语言重新实现了“收藏夹”服务,因为我们不想给应用程序的架构引入额外的复杂性。
- Go-favorite:一个 Go 服务,用于在 Redis 中存储收藏夹电影列表
- Java-favorite:一个 Java 服务,用于在 Redis 中存储收藏夹电影列表
- Python-favorite:一个 Python 服务,用于在 Redis 中存储收藏夹电影列表
此外,还有一些其他支持容器
- Movie-data-loader:将电影数据库加载到您的 Elasticsearch 集群中
- Redis:用作数据存储,用于跟踪用户的收藏夹
- Locust:一个负载生成器,与节点服务通信以引入人工负载
与其他一些示例应用程序存储库相比,主要区别在于我们使用多种语言进行了编码,每个语言版本都展示了几乎所有可能的仪表化类型
为什么采用这种方法?
虽然示例应用程序可以很好地了解工具的工作原理,但它们通常只展示一个版本,让开发人员自己查找所有必要的修改。我们采取了不同的方法。通过提供多个版本,我们旨在弥合知识差距,使开发人员能够轻松地查看和理解从非仪表化代码到 Elastic 或 OTEL 仪表化版本的过渡过程。
您可以通过遵循我们的其他一些博客,自己检测基本版本,而不是仅仅启动已经检测的版本。这将教会您更多,而不仅仅是查看已构建的版本。
先决条件
- Docker 和 Compose
- Elastic Cloud 集群 (开始免费试用)
在启动示例应用程序之前,请确保您已设置好 Elastic 部署详细信息。使用必要的凭据填充 .env 文件(位于与 compose 文件相同的目录中)。您可以从 Cloud UI 以及 Kibana® 中 /app/home#/tutorial/apm 路径下复制这些凭据。
Cloud UI
Kibana APM 教程
ELASTIC_APM_SERVER_URL="https://foobar.apm.us-central1.gcp.cloud.es.io"
ELASTIC_APM_SECRET_TOKEN="secret123"
ELASTICSEARCH_USERNAME="elastic"
ELASTICSEARCH_PASSWORD="changeme"
ELASTICSEARCH_URL="https://foobar.es.us-central1.gcp.cloud.es.io"
启动应用程序
您可以灵活地以三种不同的方式启动我们的示例应用程序,每种方式都对应于不同的仪表化场景。
当您提供 --no-build 标志时,我们可以提供您可使用的公共 Docker 镜像。否则,镜像将从您计算机上的源代码构建,这将需要大约 5-10 分钟。
1. 非仪表化版本
cd Elastiflix
docker-compose -f docker-compose.yml up -d --no-build
2. Elastic 仪表化版本
cd Elastiflix
docker-compose -f docker-compose-elastic.yml up -d --no-build
3. OpenTelemetry 仪表化版本
cd Elastiflix
docker-compose -f docker-compose-elastic-otel.yml up -d --no-build
启动所需版本后,请在 localhost:9000 处浏览该应用程序。我们还在 localhost:8089 上部署了一个负载生成器,您可以在其中增加并发用户数。请注意,负载生成器直接与节点后端服务通信。如果您想从 javascript 前端生成 RUM 数据,则必须手动浏览到 localhost:9000 并访问几个页面。
模拟和故障场景
在现实世界中,应用程序会受到各种条件、随机错误和错误配置的影响。我们合并了一些这些情况,以模拟潜在的现实情况。您可以在此处找到可能的环境变量列表。
非仪表化场景
# healthy
docker-compose -f docker-compose.yml up -d
# pause redis for 5 seconds, every 30 seconds
TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose.yml up -d
# throw error in nodejs service, 50% of the time
THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose.yml up -d
Elastic 仪表化场景
# healthy
docker-compose -f docker-compose-elastic.yml up -d
# pause redis for 5 seconds, every 30 seconds
TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose-elastic.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose-elastic.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose-elastic.yml up -d
# throw error in nodejs service, 50% of the time
THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose-elastic.yml up -d
OpenTelemetry 仪表化场景
# healthy
docker-compose -f docker-compose-elastic-otel.yml up -d
# pause redis for 5 seconds, every 30 seconds
TOGGLE_CLIENT_PAUSE=true docker-compose -f docker-compose-elastic-otel.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 docker-compose -f docker-compose-elastic-otel.yml up -d
# add artificial delay to python service, 100ms, delay 50% of requests by 1000ms, and fail 20% of them
TOGGLE_SERVICE_DELAY=100 TOGGLE_CANARY_DELAY=1000 TOGGLE_CANARY_FAILURE=0.2 docker-compose -f docker-compose-elastic-otel.yml up -d
# throw error in nodejs service, 50% of the time
THROW_NOT_A_FUNCTION_ERROR=true docker-compose -f docker-compose-elastic-otel.yml up -d
混合 Elastic 和 OTel
由于该应用程序以所有可能的排列方式提供服务,并且“收藏夹”服务甚至使用多种语言编写,因此您也可以在混合模式下运行它们。
您还可以并行运行其中的一些服务,就像我们对“收藏夹”服务所做的那样。
Elastic 和 OTel 完全兼容,因此您可以运行一些使用 OTel 仪表化的服务,而其他服务则可以使用 Elastic APM 代理运行。
查看现有的 compose 文件,然后只需为每种服务类型复制一个代码片段即可。
favorite-java-otel-auto:
build: java-favorite-otel-auto/.
image: docker.elastic.co/demos/workshop/observability/elastiflix-java-favorite-otel-auto:${ELASTIC_VERSION}-${BUILD_NUMBER}
depends_on:
- redis
networks:
- app-network
ports:
- "5004:5000"
environment:
- ELASTIC_APM_SECRET_TOKEN=${ELASTIC_APM_SECRET_TOKEN}
- OTEL_EXPORTER_OTLP_ENDPOINT=${ELASTIC_APM_SERVER_URL}
- OTEL_METRICS_EXPORTER=otlp
- OTEL_RESOURCE_ATTRIBUTES=service.version=1.0,deployment.environment=production
- OTEL_SERVICE_NAME=java-favorite-otel-auto
- OTEL_TRACES_EXPORTER=otlp
- REDIS_HOST=redis
- TOGGLE_SERVICE_DELAY=${TOGGLE_SERVICE_DELAY}
- TOGGLE_CANARY_DELAY=${TOGGLE_CANARY_DELAY}
- TOGGLE_CANARY_FAILURE=${TOGGLE_CANARY_FAILURE}
使用源代码
存储库包含该服务的所有可能排列。
- 子目录以 $langauge-$serviceName-(elastic|otel)-(auto|manual) 格式命名。例如,python-favorite-otel-auto 是一个 Python 服务。它的名称是“favorite”,并且它使用自动仪表化通过 OpenTelemetry 进行仪表化。
- 现在,您可以将此目录与此服务的非仪表化版本进行比较,该版本可在 python-favorite 目录中找到。
这使您可以轻松了解两者之间的差异。此外,您还可以从头开始使用非仪表化版本,并尝试自己进行仪表化。
结论
监控不仅仅是观察,而是关于理解和优化。我们的示例应用程序旨在指导您使用 Elastic APM 或 OpenTelemetry 的旅程,为您提供构建弹性和高性能应用程序的工具。
开发人员资源
- Elastiflix 应用程序,一个使用 OpenTelemetry 检测不同语言的指南
- Python:自动仪表化,手动仪表化
- Java:自动仪表化,手动仪表化
- Node.js:自动仪表化,手动仪表化
- .NET:自动仪表化,手动仪表化
- Go:手动仪表化
- 检测 OpenTelemetry 的最佳实践
常规配置和用例资源
- 在 Elastic 上使用 OpenTelemetry 实现独立性
- 使用 Elastic 和 OpenTelemetry 在 Kubernetes 上实现现代可观测性和安全性
- 使用 OpenTelemetry 和 Elastic 进行日志记录的 3 种模型
- 将免费开源的 Elastic APM 作为 Elastic Observability 部署的一部分添加
- 通过代码中使用 OpenTelemetry API 捕获自定义指标并使用 Elastic
- 使用 OpenTelemetry 和 Elastic 为您的可观测性平台提供面向未来的保障
- Elastic Observability:专为 Kubernetes、OpenTelemetry、Prometheus、Istio 等开放技术构建
还没有 Elastic Cloud 帐户?注册 Elastic Cloud 并试用我上面讨论的自动插桩功能。我很想了解您在使用 Elastic 获取应用程序堆栈可见性方面的体验反馈。
本帖中描述的任何功能或特性的发布和时间安排均由 Elastic 自行决定。任何当前不可用的功能或特性可能不会按时交付,甚至根本不会交付。