”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > NestJS + Opentelemetry(Grafana 云)

NestJS + Opentelemetry(Grafana 云)

发布于2024-08-22
浏览:550

在生产环境中使用 Opentelemetry

在应用程序中设置 Opentelemetry 并在本地启动 Otel Collector、Loki、Tempo 和 Grafana 以查看跟踪,已在上一篇文章中完成。

现在剩下的就是不仅要考虑本地跟踪,还要考虑实际生产环境中的跟踪。

为此需要的是“在云端保存日志和痕迹。”

方法

1.部署Opentelemetry Collector

将 Opentelemetry Collector(Loki、Tempo 等)浮动到某处,并将应用程序发送的 OLTP 地址设置到此 Collector。

或者,为了获得更好的可扩展性,还有一种方法是安装网关进行负载均衡,从网关接收OLTP,并将其传递给内部收集器。

2.安装和部署Grafana Alloy

Grafana Alloy 是 Grafana 提供的可配置开放遥测收集器。

如果您使用 Docker 或以前使用过 Kubernetes 进行部署,则可以将其添加为新节点。

3.无需Collector直接拍摄

这是一种直接将 OLTP 发送到后端(Loki、Tempo、Jaeger 等)的方法,无需收集器。

Grafana Cloud的Loki和Tempo可以作为后端,因此具有无需部署即可快速引入的优点。

相反,使用 Collector 可以获得的可扩展性和处理能力等优势消失了。

采用:无收藏家拍摄

我想以一种很酷的方式部署和使用 Collector,但我认为在没有使用 Kubernetes 的环境中单独部署和设置 Collector 会花费太多时间,所以我选择直接使用 Grafana 启动它云。

实际上,我们引入它是为了实验,由于它是一个初创公司,可扩展性并不是很重要(因为它是日志记录),而且我们可以快速完成,所以这不是一个花哨的决定,但这是一个很好的决定决定。

绳索

代码更改非常简单。您所需要做的就是正确设置 OLTP 端点和协议。

示踪剂

从“@opentelemetry/exporter-trace-otlp-proto”导入{ OTLPTraceExporter as PROTOOTLPTraceExporter }; const oltpTraceExporter = 新 PROTOOTLPTraceExporter({ url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT "/v1/traces", 标题:{ 授权:process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION, }, });
import { OTLPTraceExporter as PROTOOTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";

const oltpTraceExporter = new PROTOOTLPTraceExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT   "/v1/traces",
  headers: {
    Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION,
  },
});
将接收我们要拍摄的跟踪的端点(grafana cloud)接收http/protobuf协议,因此必须从exporter-trace-otlp-proto导入和使用它。

记录器

const logExporter = new OTLPLogExporter({ url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT "/v1/logs", 标题:{ 授权:process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION, }, });
import { OTLPTraceExporter as PROTOOTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";

const oltpTraceExporter = new PROTOOTLPTraceExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT   "/v1/traces",
  headers: {
    Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION,
  },
});
Logger已经使用Http协议,因此OTLPLogExporter可以按原样使用。

环境变量

请注意,在 NestJS 中,环境变量是在初始化 AppModule 时设置的,因此不能在创建 AppModule 之前完成的跟踪器和记录器设置中使用它们

如果您使用dotenv,则必须先调用它。


// eslint-disable-next-line import/order 从“dotenv”导入{config}; // eslint-disable-next-line 导入/顺序 从“@/lib/utils/env-loader”导入{ getEnvFilePath }; 配置(); // 在加载跟踪器和记录器之前加载环境变量 // eslint-disable-next-line 导入/顺序 从“./tracer”导入otelSDK; // otelSDK 应在任何其他导入之前导入 // eslint-disable-next-line 导入/顺序 从“./logger”导入createLogger;
import { OTLPTraceExporter as PROTOOTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";

const oltpTraceExporter = new PROTOOTLPTraceExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT   "/v1/traces",
  headers: {
    Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION,
  },
});
环境变量值

比较难找,请仔细追踪。

    访问 Grafana
  1. 点击右上角我的账户
  2. 单击左侧导航栏中 GRAFANA CLOUD 下的堆栈名称(如果不存在,则创建一个新堆栈)
  3. 在“管理堆栈”屏幕上,按 Opentelmetry 卡的配置
  4. 在这里您可以获取OTEL_EXPORTER_OTLP_ENDPOINT,
  5. 点击下面Password / API Token中的Generate Key来创建密钥
  6. 在环境变量字段中,OTEL_EXPORTER_OTLP_HEADERS 中以 Basic 开头的部分是 OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION 变量的值。
  7. 注册环境变量并执行。
启动 Grafana 云

在Grafana中点击Grafana Launch,在Explore中查看数据

NestJS   Opentelemetry (Grafana Cloud)

版本声明 本文转载于:https://dev.to/siisee11/nestjs-opentelemetry-grafana-cloud-328f?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 仅使用 Python 构建前端
    仅使用 Python 构建前端
    对于专注于后端的开发人员来说,前端开发可能是一项艰巨的、甚至是噩梦般的任务。在我职业生涯的早期,前端和后端之间的界限是模糊的,每个人都被期望能够处理这两者。 CSS,尤其是,是一场持续不断的斗争;这感觉像是一个不可能完成的任务。 虽然我喜欢前端工作,但 CSS 对我来说仍然是一个复杂的挑战,特别是因...
    编程 发布于2024-11-05
  • 如何在 Laravel 中运行 Cron 作业
    如何在 Laravel 中运行 Cron 作业
    在本教程中,我将向您展示如何在 Laravel 中运行 cron 作业,但最重要的是,我们会让事情对我们的学生来说简单易行。在构建 Laravel 应用程序时,我们将探索如何在您自己的计算机上设置和运行这些自动化任务。 首先,什么是 cron 作业?将其视为您网站的私人助理 - 一个从不睡觉并且总...
    编程 发布于2024-11-05
  • 填充如何影响内联元素的间距以及如何解决冲突?
    填充如何影响内联元素的间距以及如何解决冲突?
    内联元素上的填充:效果和限制根据源码,在内联元素的顶部和底部添加内边距并不影响周围元素的间距。然而,“填充将与其他内联元素重叠”这一说法表明,在某些特定情况下,填充确实会产生影响。了解重叠填充填充主要影响它应用于的元素,增加其垂直边框。在正常情况下,这不会导致与相邻的内联元素重叠,因为它们可以在填充...
    编程 发布于2024-11-05
  • Django 基于类的视图变得简单
    Django 基于类的视图变得简单
    众所周知,django在开发Web应用程序时使用MVT(模型-视图-模板)进行设计。 View 本身是一个可调用的,它接受请求并返回响应。它不仅仅是一个函数,因为 Django 提供了一种称为“基于类的视图”的东西,因此开发人员可以使用基于类的方法或者您可以说 OOP 方法来编写视图。这个基于类的...
    编程 发布于2024-11-05
  • 使用 VAKX 构建您的无代码 AI 代理
    使用 VAKX 构建您的无代码 AI 代理
    If you’ve been keeping up with the AI space, you already know that AI agents are becoming a game-changer in the world of automation and customer inter...
    编程 发布于2024-11-05
  • 这里是我如何在 jQuery Datatable 中实现基于游标的分页。
    这里是我如何在 jQuery Datatable 中实现基于游标的分页。
    在 Web 应用程序中处理大型数据集时,分页对于性能和用户体验至关重要。标准的基于偏移量的分页(通常与数据表一起使用)对于大型数据集可能效率低下。 基于游标的分页提供了一种性能更高的替代方案,特别是在处理实时更新或大量数据加载时。在本文中,我将引导您了解如何在 jQuery DataTable 中...
    编程 发布于2024-11-05
  • 为什么同步引擎可能是 Web 应用程序的未来
    为什么同步引擎可能是 Web 应用程序的未来
    在不断发展的 Web 应用程序世界中,效率、可扩展性和无缝实时体验至关重要。传统的 Web 架构严重依赖于客户端-服务器模型,这些模型可能难以满足现代对响应能力和同步的需求。这就是同步引擎发挥作用的地方,它为开发人员当今面临的许多挑战提供了一个有前途的解决方案。但同步引擎到底是什么?为什么它们可能是...
    编程 发布于2024-11-05
  • Python 计算机视觉简介(第 1 部分)
    Python 计算机视觉简介(第 1 部分)
    注意:在这篇文章中,我们将仅使用灰度图像以使其易于理解。 什么是图像? 图像可以被认为是值的矩阵,其中每个值代表像素的强度。图像格式主要分为三种类型: Binary:此格式的图像由值为 0(黑色)和 1(白色)的单个二维矩阵表示。这是最简单的图像表示形式。 Grey-Scale:在此...
    编程 发布于2024-11-05
  • 网站 HTML 代码
    网站 HTML 代码
    我一直在尝试建立一个与航空公司相关的网站。我只是想确认我是否可以使用人工智能生成代码来生成整个网站。 HTML 网站是否兼容博客,或者我应该使用 JavaScript?这是我用作演示的代码。 <!DOCTYPE html> <html lang="en">[](url) &l...
    编程 发布于2024-11-05
  • 像程序员一样思考:学习 Java 基础知识
    像程序员一样思考:学习 Java 基础知识
    本文介绍了 Java 编程的基本概念和结构。它首先介绍了变量和数据类型,然后讨论了操作符和表达式,以及控制流流程。其次,它解释了方法和类,然后介绍了输入和输出操作。最后,本文通过一个工资计算器的实际示例展示了这些概念的应用。像程序员一样思考:掌握 Java 基础1. 变量和数据类型Java 使用变量...
    编程 发布于2024-11-05
  • PHP GD 可以比较两个图像的相似性吗?
    PHP GD 可以比较两个图像的相似性吗?
    PHP GD 可以确定两个图像的相似度吗?正在考虑的问题询问是否可以使用以下命令确定两个图像是否相同PHP GD 通过比较它们的差异。这需要获取两个图像之间的差异并确定它是否完全由白色(或任何统一的颜色)组成。根据提供的答案,散列函数(如其他响应所建议的那样)不适用于此语境。比较必须涉及图像内容而不...
    编程 发布于2024-11-05
  • 使用这些键编写高级测试(JavaScript 中的测试需求)
    使用这些键编写高级测试(JavaScript 中的测试需求)
    在本文中,您将学习每个高级开发人员都应该了解的 12 个测试最佳实践。您将看到 Kent Beck 的文章“Test Desiderata”的真实 JavaScript 示例,因为他的文章是用 Ruby 编写的。 这些属性旨在帮助您编写更好的测试。了解它们还可以帮助您在下一次工作面试中取得好成绩。 ...
    编程 发布于2024-11-05
  • 通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案
    通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案
    完毕!对自己有点印象。 我们的产品需要回声消除功能,确定了三种可能的技术方案, 1)利用MCU检测audio out和audio in的音频信号,编写算法计算两侧声音信号的强度,根据audio out和audio in的强弱在两个通道之间进行可选的切换,实现半双工通话效果,但现在市场上都是全双工通话...
    编程 发布于2024-11-05
  • 逐步构建网页:探索 HTML 中的结构和元素
    逐步构建网页:探索 HTML 中的结构和元素
    ?今天标志着我软件开发之旅的关键一步! ?我编写了第一行代码,深入研究了 HTML 的本质。涵盖的元素和标签。昨天,我探索了构建网站的拳击技术,今天我通过创建页眉、页脚和内容区域等部分将其付诸实践。我还添加了各种 HTML 元素,包括图像元素和链接元素,甚至尝试在单页网站上进行内部链接。看到这些部分...
    编程 发布于2024-11-05
  • 项目创意不一定是独特的:原因如下
    项目创意不一定是独特的:原因如下
    在创新领域,存在一个常见的误解,即项目创意需要具有开创性或完全独特才有价值。然而,事实并非如此。我们今天使用的许多成功产品与其竞争对手共享一组核心功能。让他们与众不同的不一定是想法,而是他们如何执行它、适应用户需求以及在关键领域进行创新。 通讯应用案例:相似但不同 让我们考虑一下 M...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3