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 还 原生支持 OpenTelemetry

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

示例应用程序

我们有意使 电影搜索 UI 非常简单。它显示一些电影,有一个搜索栏,并且在撰写本文时,只有一个实际功能:您可以将电影添加到收藏列表中。

服务、语言和仪器化

我们的应用程序有几个不同的服务

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

我们用几种不同的语言重新实现了“收藏”服务,因为我们不想给应用程序的架构引入额外的复杂性。

  • Go-favorite: 一个将收藏电影列表存储在 Redis 中的 Go 服务
  • Java-favorite: 一个将收藏电影列表存储在 Redis 中的 Java 服务
  • Python-favorite: 一个将收藏电影列表存储在 Redis 中的 Python 服务

此外,还有一些其他支持容器

  • 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"

启动应用程序

您可以通过三种不同的方式启动我们的示例应用程序,每种方式对应于不同的仪器化场景。

我们提供公共 Docker 镜像,您可以在提供 --no-build 标记时使用。否则,镜像将在您的机器上从源代码构建,这大约需要 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 并访问几个页面。

模拟和故障场景

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

非仪器化场景

# 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 自行决定。任何当前不可用的功能或功能可能无法按时或根本无法交付。