0

0

NestJS + Opentelemetry (Loki)

WBOY

WBOY

发布时间:2024-08-19 08:12:02

|

976人浏览过

|

来源于dev.to

转载

先决条件

  • opentelemetry collector 必须准备好。 (去准备吧)

  • grafana 设置查看 opentelemetry 跟踪(转到准备)

  • (可选)opentelemetry知识(遇到困难可以学习^0^)(去学习)

  • (可选)nestjs + opentelemetry 帖子(查看)

nestjs 到 loki

本来,当你设置零代码opentelemetry时,日志应该自动发送到otel收集器并累积在loki中。

但是,日志记录自动仪器存在问题,因此如果设置不当,日志不会累积。

(感谢这个bug,我研究了otel?)

如何正确设置自动

问题中的组合方法。 (嗯,这不是魔法)

auto-instrumentation in sdk (not working)
instrumentation-winston in sdk (not working)
instrumentation-winston in sdk + winston-transport in logger transports (working)
auto-instrumentation in sdk + winston-transport in logger transports (working)
auto-instrumentation in sdk + winston-transport installed only (working)

最后原因是instrumentation-winston没有包含winston-transport依赖,所以必须单独安装

请务必执行 npm install @opentelemetry/winston-transport。

如果你运气好并且设置正确的话,就不需要按照下面的方法了

温斯顿

我决定让 winston 作为记录器。我本来用的是pino,但看到这篇文章后改成了winston。 (+网上有更多关于winston的信息)

即使你使用的是pino,下面的方法仍然适用。

Vinteo AI
Vinteo AI

利用人工智能在逼真的室内环境中创建产品可视化。无需设计师和产品照片拍摄

下载

代码

手动设置 loggerprovider

创建一个新文件 logger.ts 来设置记录器。

import { otlplogexporter } from "@opentelemetry/exporter-logs-otlp-http";
import { resource } from "@opentelemetry/resources";
import {
  batchlogrecordprocessor,
  loggerprovider,
} from "@opentelemetry/sdk-logs";
import {
  semresattrs_service_name,
  semresattrs_service_version,
} from "@opentelemetry/semantic-conventions";
import { opentelemetrytransportv3 } from "@opentelemetry/winston-transport";

const logexporter = new otlplogexporter();
const loggerprovider = new loggerprovider({
  resource: new resource({
    [semresattrs_service_name]: "your-service-name",
    [semresattrs_service_version]: "1.0",
  }),
});

loggerprovider.addlogrecordprocessor(
  new batchlogrecordprocessor(logexporter)
  // new simplelogrecordprocessor(new consolelogrecordexporter())
);
api.logs.setgloballoggerprovider(loggerprovider);

创建loggerprovider,连接exporter、resource、processor,然后在globalloggerprovider中设置。

创建温斯顿记录器

之后,创建一个用于nestjs的winston logger。还写入 logger.ts。

import { opentelemetrytransportv3 } from "@opentelemetry/winston-transport";

export default function createlogger() {
  const transports = [
    new winston.transports.console({
      format: winston.format.combine(
        winston.format.timestamp({ format: "yyyy-mm-ddthh:mm:ss.sssz" }),
        winston.format.json(),
        winston.format.ms(),
        nestwinstonmoduleutilities.format.nestlike("api", {
          colors: true,
          prettyprint: true,
          processid: true,
          appname: true,
        })
      ),
    }),
    new opentelemetrytransportv3(),
  ];
  const logger = winstonmodule.createlogger({
    defaultmeta: { environment: process.env.node_env },
    transports,
  });

  return logger;
}

这里,opentelemetrytransportv3被注册为winston的transport,允许将winston的日志导出到oltp。

导入记录器

与 tracer 一样,logger 也是在 main.ts 顶部导入。

// eslint-disable-next-line import/order
import otelsdk from "./tracer"; // otelsdk should be imported before any other imports
// eslint-disable-next-line import/order
import createlogger from "./logger";

连接记录器

创建nestapp时,会创建并移交一个记录器。这取代了 nestjs/common 中的记录器。

  const app = await nestfactory.create(
    appmodule,
    new expressadapter(expressapp),
    {
      logger: createlogger(),

提供商温斯顿模块

我们使用nestjs-winston创建了winston logger,因此它在appmodule中作为provider提供。

@Module({
  providers: [
    Logger,

结果

现在,来自 winston 的日志被传输到 logger 提供者,并由 loggerprovider 的导出器发送到 oltp 端点(http://localhost:4317 或 http://localhost:4318)。

日志数据将由预先启动的收集器收集并存储在 loki 中。

结果屏幕

去格拉法纳
您可以使用 explore -> 查看日志 数据源:loki -> 标签浏览器 -> 选择服务 -> 显示日志。

NestJS + Opentelemetry (Loki)

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2023.12.20

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

364

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

410

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1916

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1994

2024.08.16

Grafana重置admin密码
Grafana重置admin密码

本专题整合了grafana admin密码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.09.02

Grafana admin密码
Grafana admin密码

本专题整合了Grafana密码相关教程,阅读专题下面的文章了解更多详细内容。

214

2025.12.09

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号