Luca Wintergerst

使用示例应用程序开始使用 OpenTelemetry 仪表化

在本文中,我们将向您介绍一个简单的示例应用程序:一个用于电影搜索的 UI,使用 Python、Go、Java、Node 和 .NET 以不同的方式进行仪表化。此外,我们将展示如何在 Elastic APM 中查看您的 OpenTelemetry 数据。

9 分钟阅读
Getting started with OpenTelemetry instrumentation with a sample application

应用程序性能管理 (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 仪表化版本的过渡过程。

您可以通过遵循我们的其他一些博客,自己检测基本版本,而不是仅仅启动已经检测的版本。这将教会您更多,而不仅仅是查看已构建的版本。

先决条件

在启动示例应用程序之前,请确保您已设置好 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 的旅程,为您提供构建弹性和高性能应用程序的工具。

开发人员资源

常规配置和用例资源

还没有 Elastic Cloud 帐户?注册 Elastic Cloud 并试用我上面讨论的自动插桩功能。我很想了解您在使用 Elastic 获取应用程序堆栈可见性方面的体验反馈。

本帖中描述的任何功能或特性的发布和时间安排均由 Elastic 自行决定。任何当前不可用的功能或特性可能不会按时交付,甚至根本不会交付。

分享这篇文章