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

2023-09-13 16:19:09

作者: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 插装版本的转换过程。

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

先决条件


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

云用户界面

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

模拟和故障场景

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

非检测场景

# 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

由于应用程序具有所有可能排列的服务,并且 “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 目录下提供的该服务的非检测版本进行比较。

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


结论

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

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

更多推荐

鸿蒙应用开发(基础篇)之列表组件

一、简介在我们常用的手机应用中,经常会见到一些数据列表,如设置页面、通讯录、商品列表等。下图中两个页面都包含列表,“首页”页面中包含两个网格布局,“商城”页面中包含一个商品列表。上图中的列表中都包含一系列相同宽度的列表项,连续、多行呈现同类数据,例如图片和文本。常见的列表有线性列表(List列表)和网格布局(Grid列

Linux READ_ONCE/WRITE_ONCE宏

文章目录前言一、简介1.1READ_ONCE1.2WRITE_ONCE1.3volatile关键字二、Compilerbarrier2.1barrier2.2READ_ONCE/WRITE_ONCE三、总结参考资料前言最近在看arm64架构内存页表源码部分,发现在遍历页表项的时候经常出现READ_ONCE宏和WRITE

跟我一起写Makefile细节总结学习笔记

文章目录跟我一起写Makefile细节总结学习笔记第一,二章此篇仅为方便查阅记忆,详细的请看[seisman/how-to-write-makefile:跟我一起写Makefile重制版(github.com)](https://github.com/seisman/how-to-write-makefile)Make

AIGC赋能教育 | 虚拟现实:下一代的教室在哪里?

在这个科技迅速进步的时代,全球教育领域正迎来一场前所未有的数字化和技术化变革。而AIGC则是代表了人工智能与教育的融合,它正在改变着学习方式、提高教育质量,并重新定义了教育的未来。我们正在亲眼目睹AIGC如何塑造着全球教育的格局,为学生、教育者和整个社会带来了广泛的机遇和挑战。这个崭新的时代不仅带来了无限可能性,也需要

DDoS是什么?

一.DDoS的定义DDos的前身DoS(DenialofService)攻击,其含义是拒绝服务攻击,这种攻击行为使网站服务器充斥大量的要求回复的信息,消耗网络带宽或系统资源,导致网络或系统不胜负荷而停止提供正常的网络服务。而DDoS分布式拒绝服务,则主要利用Internet上现有机器及系统的漏洞,攻占大量联网主机,使其

SpringMVC之JSON数据返回与异常处理机制

目录一.SpringMVC的JSON数据返回1.导入Maven依赖2.配置spring-mvc.xml3.@ResponseBody注解的使用3.1案例演示1.List集合转JSON2.Map集合转JSON3.返回指定格式String4.@ResponseBody用法5.Jackson5.1介绍5.2常用注解二.异常处

SwiftUI 5.0(iOS 17)TipKit 让用户更懂你的 App

概览作为我们秃头开发者来说,写出一款创意炸裂的App还不足以吸引用户眼球,更重要的是如何让用户用最短的时间掌握我们App的使用技巧。从iOS17开始,推出了全新的TipKit框架专注于此事。有了它,我们再也不用自己写App用户帮助以及使用指南的逻辑和界面了。使用TipKit非常简单,接下来就让我们一起走进TipKit

对于项目中爱抱怨成员,项目经理如何回应?

李佳刚被提拔成项目经理。他是技术部的骨干人员,工作能力很强,已经干了快五年了。公司规模中等,属于比较传统的制造型公司。随着公司升级转型,项目越来越多,难度也增加了。原来那种按部就班的订单式生产被更加灵活、个性化的客户需求所取代,不但技术难度提高了,完成一个项目所涉及的部门、协作单位也增多了。李佳由于出色的工作表现,因此

Java手写决策树和决策树应用拓展案例

Java手写决策树和决策树应用拓展案例1.算法思维导图以下是用mermaid代码表示的决策树算法实现原理的思维导图:#mermaid-svg-DWczpr7jTBRHS9bA{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px;fill:#

JMeter:接口测试基础介绍

一、什么是接口接口是非常抽象的概念,先来看下中国最大的综合性辞典《辞海》是怎样定义接口的:两个不同系统或系统中两个不同特性部分的交接部分。一般分硬件接口和软件接口两种。前者是为连接计算机各部分之间、计算机与计算机之间、计算机与外部系统之间而专门设计的连接线及有关逻辑控制电路;后者是为连接两个程序层或块而专门设计的程序或

怎么在树莓派上搭建WordPress博客网站,并发布到外网可访问?

文章目录序幕概述1.安装PHP2.安装MySQL数据库3.安装Wordpress4.设置您的WordPress数据库设置MySQL/MariaDB创建WordPress数据库5.WordPressconfiguration6.将WordPress站点发布到公网安装相对URL插件修改config.php配置7.支持好友链

热文推荐