使用 OpenTracing 和 LightStep 监控无服务器功能
无服务器功能的采用在企业组织内达到了创纪录的水平。有趣的是,鉴于越来越多的采用和兴趣,许多监控解决方案孤立了在这些环境中执行的代码的性能,或者仅提供有关执行的基本指标。为了了解应用程序的性能,我想知道存在哪些瓶颈、时间花在哪里以及满足请求所涉及的每个系统的当前状态。虽然指标、日志和分段堆栈跟踪很有帮助,但更具凝聚力的性能故事仍然是理解应用程序的最有用的方法,并且 应该 可以使用现有技术来实现。
在这篇文章中,我将探讨如何使用 OpenTracing 来检测在本地容器中运行的 Express 应用程序以及在 Lambda 上运行的函数,从而实现连贯的性能故事。对于可视化和分析,我将在本示例中使用 LightStep [ x ]PM,尽管您可以选择其他 OpenTracing 后端,例如 Jaeger。
系统性能正是其各个部分的总和
在我们开始之前,有必要检查一下此练习的目的。正如我所提到的,几乎每个 FaaS(功能即服务)提供商都以合理的价格提供了对各个功能性能的一定程度的可见性。
最新的 DZone 参考卡
移动数据库要点
调用计数、错误率、日志,甚至堆栈跟踪触手可及,这非常引人注目。更引人注目的是无需 在实际开发工作之外做太多工作即可获取此信息。当表演数据按演员分段时,拼凑出一个有凝聚力的故事是一件令人沮丧的事情。每当我从事一个项目并试图量化该工作的价值时,我往往会想:“那又怎样,谁在乎呢?” 或者, 我通过这项工作、产品或技术到底创造了什么价值?
监控的价值是通过所提供的独特数据、正在解决的问题以及它如何到达需要它的人手中来衡量的。虽然指标和单独的堆栈跟踪适用于许多用例,但我创建此示例是因为,作为编写新功能、重构现有代码或只是保持正常状态的开发人员,您可能不得不依赖于您无法控制的系统和服务。在这些情况下,我认为分布式跟踪是完成这项工作的最佳工具。
你好,开放追踪
OpenTracing 是一个供应商中立的接口,它定义了如何测量基础设施中任何单个操作或组件的性能,以及如何将这些单独的部分连接在一起形成一个有凝聚力的端到端性能故事。重要的是, 这样做所需的数据 定义明确且非常简单:启动和停止时间戳、服务和操作名称以及通用事务 ID 基本上就是您开始所需的全部内容。后端通常负责将相关操作“粘合”在一起形成单个跟踪,因此开销可以非常小。
OpenTracing 的轻量级数据模型使其非常适合测量临时架构组件的性能,包括容器和无服务器功能。我们需要三样东西:OpenTracing 数据、将该数据传输到后端的方法,当然还有后端本身。
开放追踪数据
OpenTracing 定义了每种语言所需的确切 API 调用,以提取必要的信息并将端到端跟踪组合在一起。目的是在整个环境中进行这些调用,然后让您所需的客户端库(接收 OpenTracing 数据并将其发送到后端的库)通过将自身建立为仪器的全局目标来接收结果数据。这意味着您可以在代码中准确定义要测量的内容。更重要的是,由于 OpenTracing 是一个开放标准,它被库和基础设施开发人员广泛采用,并且许多流行的框架和工具都内置了 OpenTracing 工具。
在此示例中,我们不会利用任何社区驱动的插件和工具。相反,我们将亲自动手来明确演示该技术的工作原理。我们将从后端开始。
关于 SpanContext 的简要说明
正如我所提到的,OpenTracing 需要在进行每次测量时提供一个通用事务 ID。这是使用称为 SpanContext 的对象在整个系统中捆绑和传输的。它可以包含在许多载体中,例如 HTTP 标头、文本映射和二进制 blob,并以适合您的服务的任何格式进行传输。在此示例中,由于这是一个 HTTP 请求,我们将把 SpanContext 注入到 HTTP 标头中。
后端仪表
首先,我们将初始化 客户端库 并将其指定为全局跟踪器,这使其成为整个应用程序中发出的任何 OpenTracing 数据的目的地。
正如您所看到的,我在这里创建了一条路由,它允许我们指示 Express 向我们的 Lambda 函数发送可变数量的请求(作为查询参数传递)。我在上面的代码中留下了评论,但这里的主要要点和步骤是:
调用路由时启动父跨度。这为我们的跟踪层次结构奠定了基础,我们将在下一步中使用它。
对于每个生成的 Lambda 函数,我们希望创建一个子范围。在 OpenTracing 中,每个跨度都有自己的 ID,该 ID 与持久事务 ID 一起包含在 SpanContext 中。这意味着每个子跨度都有自己的 SpanContext,需要将其传递到系统中的下一跳。
将 SpanContext 注入请求标头并将其附加到我们的 Lambda POST 请求。
如果请求中存在错误,我们会将错误与布尔 KV 对一起附加,该布尔 KV 对告诉我们的后端活动跨度上存在错误。这在像 LightStep [ x ]PM这样的系统中变得非常有用,其中错误率是自动计算的,并且可以用作警报和分析的基础。
在发出所有 Lambda 请求后结束父级跨度,并在从 AWS API Gateway 收到 200 后结束每个子级跨度。在 Lambda 请求离开我们的应用程序后,我们将在此处结束父跨度,但我们不会等待响应。这是一个偏好问题,可以根据您的需要进行修改。
功能仪表
在检测任何无服务器功能时,我们希望确保尽可能提高性能。大多数提供商都会考虑执行时间,因此监控期间增加的任何开销都会产生与之相关的直接成本。
在 Lambda 上跟踪 HTTP 请求时需要执行一个额外步骤:在事件中公开 HTTP 标头。幸运的是, Ken Brodhagen 的这篇精彩博客文章 解释了如何做到这一点。将映射模板添加到 API 网关后,“event.headers”将包含 HTTP 标头,允许您提取 SpanContext。
相关文章:
使用 OpenTracing 和 LightStep 监控无服务器功能
无服务器功能的采用在企业组织内达到了创纪录的水平。有趣的是,鉴于越来越多的采用和兴趣,许多监控解决方案孤立了在这些环境中执行的代码的性能,或者仅提供有关执行的基本指标。为了了解应用程序的性能,我想知道存在哪些瓶颈、时…...
Sleep(0)、Sleep(1)、SwitchToThread()
当 timeout 参数为 0 时(如 Sleep(0)),操作系统会检查可运行队列中是否有高于或等于当前线程优先级的其他就绪线程。如果有,当前线程将被移除并放弃处理器时间,让其他线程执行。如果没有高优先级的线程,当前…...

前端食堂技术周刊第 103 期:10 月登陆 Web 平台的新功能、TS 5.3 RC、React 2023 状态、高并发的哲学原理、Web 资源加载优先级
美味值:🌟🌟🌟🌟🌟 口味:夏梦玫珑 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
Python(三)数据类型转换
程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …...
linq to sql性能优化技巧
linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑 linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。但是也有几个测试证明显示在做好优化的情况下,linq to sql的…...

ubuntu20.04 安装cudnn
中文地址是.cn:cuDNN 历史版本 | NVIDIA 开发者 英文地址是.com:cuDNN 历史版本 | NVIDIA 开发者 1、下载cudnn:cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb 解压并安装:sudo dpkg -i cudnn-local-repo-ubuntu2004-8.8…...

手机转接器实现原理,低成本方案讲解
USB-C PD协议里,SRC和SNK双方之间通过CC通信来协商请求确定充电功率及数据传输速率。当个设备需要充电时,它会发送消息去给适配器请求充电,此时充电器会回应设备的请求,并告知其可提供的档位功率,设备端会根据适配器端…...
RDS for MySQL 是什么
RDS for MySQL 是一种托管型数据库服务,RDS代表“关系数据库服务”(Relational Database Service)。这是云服务提供商提供的一种服务,用于简化关系数据库的设置、操作和扩展。对于MySQL版本的RDS,意味着它是专门为运行MySQL数据库管理系统的实…...

Java开发注意事项和细节说明
👨🎓👨🎓博主:发量不足 个人简介:耐心,自信来源于你强大的思想和知识基础!! 📑📑本期更新内容:Java开发注意事项和细节说明&…...

springboot中使用Java代码进行MongoDB集合数据备份
有时候mongo的集合中数据量太大,查询或翻页时可能会超过最大数量报错,可以给mongo的集合进行备份并保留最近一段时间的数据即可 下面是通过Java代码进行mongo的集合备份单元测试 import cn.hutool.core.date.DateUtil; import com.nuoyi.study.dao.mongo…...

JavaEE的渊源
JavaEE的渊源 1. JavaEE的起源2. JavaEE与Spring的诞生3. JavaEE发展历程(2003-2007)4. JavaEE发展历程(2009-至今)5. Java的Spec数目与网络结构 1. JavaEE的起源 我们首先来讲一下JavaEE的起源 ,为什么要来讲起源 ? …...
html中使用JQ自定义锚点偏移量
问题:一般情况下使用href跳转达到效果。如果页面中头部固定住了,点击瞄点的时候自动是最上面,头部会给它覆盖掉一部分,所以要在点击之后额外再加头部高度 <a href"#aa">Technical Documents</a><div id&…...

032、数据增广*
之——泛化性提升 杂谈 深度学习的数据增强(Data Augmentation)是一种技术,用于通过对原始数据进行多样性的变换和扩充,以增加训练数据的多样性,提高模型的泛化能力。这有助于减轻过拟合问题,提高深度学习模…...

力扣最热一百题——盛水最多的容器
终于又来了。我的算法记录的文章已经很久没有更新了。为什么呢? 这段时间都在更新有关python的文章,有对python感兴趣的朋友可以在主页找到。 但是这也并不是主要的原因 在10月5号我发布了我的第一篇博客,大家也可以看见我的每一篇算法博客…...

备份扫描工具 god_bak
Part1 前言 不想写东西,或者说换种说法 有些东西还没写完,有些系列也还没整完。就放一个昨天摸鱼写的东西。 如图,每个系列都还是会按照自己的风格来写,代码审计实战等都会结合自己挖掘或审计过的案例进行结合知识点的风格去写&…...
软考 系统架构设计师系列知识点之数字孪生体(2)
接前一篇文章:软考 系统架构设计师系列知识点之数字孪生体(1) 所属章节: 第11章. 未来信息综合技术 第5节. 数字孪生体技术概述 2. 数字孪生体的定义 AFRL(Air Force Research Laboratory,美国空军研究实…...

CSS实现文本左右对齐
因为文本里面有中午符号,英文,英文符号等,导致设置宽度以后右侧凌乱,可以通过以下代码设置样式,让文本工整对齐。 让我们看一下设置前和设置后的对比图片: 效果图如下:(左边是设置…...

利用exec命令进入docker容器时的报错问题
进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题 一、详细报错信息 执行docker exec -it [containerId] /bin/bash报错: OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/ba…...
Java 与C++ 语言的一些区别
Java 与C 语言的一些区别 前言不同之外 前言 之前用C、C 的多,目前开始学习和接触 Java ,拿Java和C 做一个对比,帮助快速掌握Java的开发。 不同之外 数据类型的差别: java中 byte 类型类似于c/c 中的char类型 boolean 与C 的bo…...
npm ERR! network ‘proxy‘ config is set properly. See: ‘npm help config解决方法
这个错误提示通常表示在使用 npm 安装包时出现了网络连接问题。具体来说,可能是由于以下原因之一: 你的网络连接不稳定或者被防火墙拦截了。你的计算机设置了代理,但是 npm 没有正确配置代理。npm 的配置文件中的 registry 配置不正确&#…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...