使用 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 配置不正确&#…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
