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

2023年 9月 14日 79.8k 0

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

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

types of instrumentation

为什么采用这种方法?

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论