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

2023年10月12日   |   by mebius

作者:Luca Wintergerst

%title插图%num

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

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

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

示例应用程序

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

%title插图%num

%title插图%num

服务、语言和检测

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

  • 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:与节点服务对话以引入人工负载的负载生成器

%title插图%num

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

%title插图%num

为什么采用这种方法?

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

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

先决条件

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

云用户界面

%title插图%num

Kibana APM 教程

%title插图%num

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 并访问几个页面。

模拟和故障场景

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

非检测场景

# 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 tgcode-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

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

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

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

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

  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}

使用源代码

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

  • 子目录的命名格式为 $langauge-$serviceName-(elastic|otel)-(auto|manual)。 例如,python-favorite-otel-auto 是一个 Python 服务。 它的名字是 “favorite”,它使用 OpenTelemetry 进行检测,使用自动检测。
  • 现在,你可以将此目录与 python-favorite 目录下提供的该服务的非检测版本进行比较。

%title插图%num

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


结论

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

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

文章来源于互联网:Observability:通过示例应用程序开始使用 OpenTelemetry 检测

相关推荐: Beats:安装及配置 Metricbeat (二)- 8.x

这篇文章是继文章 “Beats:安装及配置 Metricbeat (一)- 8.x” 的续篇。你可以先阅读之前的那篇文章再继续阅读这篇文章。我们在这篇文章中继续之前的探讨。 使用 fingerprint 来代替证书 在实际的使用中,我们需要从 Elastics…