如何监控多个应用程序之间的请求...🤔 TL;DR

2025-05-25

如何监控多个应用程序之间的请求...🤔

TL;DR

TL;DR

想象一下,你从一个应用发送一个 HTTP 请求;这个应用将它发送到另一个应用,而这个应用又将请求发送到另一个应用。如果在此过程中发生了某些事情怎么办?

您需要标记所有请求以查明问题发生的位置。

在本教程中,您将学习如何使用 OpenTelemetry 来监控您的应用程序,并深入了解性能、跟踪和指标。

您将学习:

  • 如何使用 OpenTelemetry 监控我们的应用程序。
  • 如何查看日志和船舶轨迹。
  • 如何查看指标并过滤跟踪。
  • 如何自动化应用程序监控。

已记录


Odigos - 开源分布式追踪

无需编写任何代码,即可同时监控所有应用!
使用唯一能够在所有应用中生成分布式跟踪的平台,简化 OpenTelemetry 的复杂性。

我们真的才刚刚起步。
能帮我们加个星吗?拜托!😽

https://github.com/keyval-dev/odigos

赠星


让我们开始吧🔥

在这里,我将引导您安装该项目所需的包依赖项。

如下所示为 Web 应用程序创建项目文件夹。

mkdir monitor-app
cd monitor-app
mkdir server
Enter fullscreen mode Exit fullscreen mode

设置 Node.js 服务器

导航到服务器文件夹并创建一个package.json文件。

cd server && npm init -y
Enter fullscreen mode Exit fullscreen mode

安装 Express。

npm install express
Enter fullscreen mode Exit fullscreen mode

ExpressJS是一个使用 Node.js 构建 RESTful API 的后端 Web 应用程序框架。

创建一个index.js文件——我们的网络服务器的入口点。

// 👇server/index.js
touch index.js
Enter fullscreen mode Exit fullscreen mode

使用 Express 设置 Node.js 服务器。当我们在浏览器中get向终端发出请求/static-data时,下面的代码片段会返回一个包含一个键的 JSON 对象。/fetch-data

 // 👇server/index.js
const express = require("express");
const app = express();
const PORT = 8000;

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.get("/static-data", (req, res) => {
  res.json({
    msg: "Hello world!",
  });
});

app.get("/fetch-data", (req, res) => {
  // Simulate a real-world database call
  setTimeout(() => {
    res.json({
      msg: "Hello world!",
    });
  }, 2000);
});

app.listen(PORT, () => {
  console.log(`The server is listening on port: ${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

💡每日提示

自节点版本v18.11.0以来,我们不再需要nodemon来监视更改并重新启动服务器,它现在已通过--watch标志内置于 Node 中。

node --watch通过将start&trace-start命令添加到文件中的脚本列表来进行配置package.json

// 👇server/package.json
"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "start": "node --watch index.js",
  "trace-start": "node -r ./tracing.js --watch index.js"
},
Enter fullscreen mode Exit fullscreen mode
  • start:代码片段启动 Web 服务器。
  • trace-start:此代码片段在预加载文件时启动 Web 服务器tracing.js。我们将使用此命令进行演示。

手动设置 OpenTelemetry 和 SigNoz ⚒️

OpenTelemetry用于检测、生成、收集和导出遥测数据。SigNoz是一款开源 APM,可帮助开发人员监控其应用程序并排除故障,是其他 APM 的开源替代方案它是一站式解决方案,可访问应用程序的指标、日志和跟踪信息。

我们将首先安装所需的 OpenTelemetry 包。

⚠️ 如果您在 Windows 上运行此命令,请单独运行每个命令。

npm install --save @opentelemetry/sdk-node \
@opentelemetry/auto-instrumentations-node \
@opentelemetry/exporter-trace-otlp-http
Enter fullscreen mode Exit fullscreen mode

对于SigNoz安装,请按照此处显示的安装步骤进行操作

通过创建tracing.js文件并使用以下代码来实例化跟踪。

    // 👇server/tracing.js
"use strict";
const process = require("process");
const opentelemetry = require("@opentelemetry/sdk-node");
const {
  getNodeAutoInstrumentations,
} = require("@opentelemetry/auto-instrumentations-node");
const {
  OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-http");
const { Resource } = require("@opentelemetry/resources");
const {
  SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");

const exporterOptions = {
  url: "http://localhost:4318/v1/traces", // default URL for sending tracing data.
};

const traceExporter = new OTLPTraceExporter(exporterOptions);
const sdk = new opentelemetry.NodeSDK({
  traceExporter,
  instrumentations: [getNodeAutoInstrumentations()],
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: "Monitor-Node-App",
  }),
});

// initialize the SDK and register with the OpenTelemetry API
sdk.start();

// shut down the SDK on process exit
process.on("SIGTERM", () => {
  sdk
      .shutdown()
      .then(() => console.log("Tracing terminated!"))
      .catch((error) => console.log("Error terminating tracing.", error))
      .finally(() => process.exit(0));
});
Enter fullscreen mode Exit fullscreen mode

我们正在使用 Node SDK 监控我们的 Node 应用程序,以@opentelemetry/sdk-node进行跟踪和指标、@opentelemetry/auto-instrumentations-node轻松设置仪器以及@opentelemetry/exporter-trace-otlp-http通过 HTTP 和 JSON 将跟踪数据导出到与 OTLP 兼容的接收器。

我们已经完成了使用 OpenTelemetry 和 SigNoz 🥂 对演示 Node 应用程序的基本检测。现在,运行trace-start命令。

npm run trace-start
Enter fullscreen mode Exit fullscreen mode

访问 SigNoz UI http://localhost:3301。登录后,我们应该会看到类似这样的内容。

SigNoz 默认用户界面

Monitor-Node-App不用担心所有这些数据;它们已由 SigNoz 预先填充。请注意,我们在服务列表中看不到我们的信息。这是因为我们尚未向服务器发出请求。

为了让 SigNoz 显示追踪信息,我们需要在服务器上生成一些负载。为此,我们可以在浏览器上多次刷新终端,或者在终端上运行以下 CLI 命令/static-data,或者/fetch-data让服务器自动执行这些操作。

对于Linux用户

ℹ️确保已curl安装。

for i in {1..20}; do curl http://localhost:8000/fetch-data; done
Enter fullscreen mode Exit fullscreen mode

对于Windows用户

1..20 | ForEach-Object { Invoke-RestMethod -Uri 'http://localhost:8000/fetch-data' }
Enter fullscreen mode Exit fullscreen mode

现在,再次访问 SigNoz UI 我们应该在服务列表中看到我们的服务。

SigNoz 用户界面

通过这条追踪信息,我们可以准确地看到整个请求每个部分所花费的时间。在我们的例子中,由于请求相当简单,所以花费的时间并不多。

SigNoz 演练

为了正确可视化,我们将查看 SigNoz 已提供的演示应用程序之一的请求。

SigNoz 请求解释

我们可以清楚地看到,第一个请求基本上执行了 SQL 查询,经过了多个步骤,最终执行了 SQL 查询。我们还可以看到请求中每个跨度所花费的时间。

SigNoz 的 Traces 仪表板为我们的追踪数据提供了现成的可视化效果。它包含强大的过滤器,可以根据我们选择的条件和时间范围分析跨度。

SigNoz 仪表板


从 Hostmetrics 可视化指标

SigNoz 中接受指标的最常见方式是通过 Prometheus 接收器。

为简单起见,我将演示如何可视化 SigNoz 安装上默认启用的 Hostmetrics 提供的默认指标。

所有可用指标的列表都可以在这里找到。

在SigNoz UI 的仪表板部分下,创建一个新的时间序列面板。

SigNoz 指标仪表板

在 PromQL 查询输入中,请输入以下内容:例如,我们使用指标system_cpu_load_average_5m,顾名思义,它提供 CPU 的 5 分钟平均负载。您可以根据自己的喜好随意调整指标。

指标图


自动连接 Odigos 🤝

Odigos是一个开源可观察性控制平面,使组织能够创建和维护其可观察性管道。

还记得手动设置时遇到的所有麻烦吗?有了 Odigos,就无需再费心了。它会自动检测我们的应用程序,无需我们自行设置 OpenTelemetry 或其他任何设置。Odigos 帮我们搞定了一切。🤯

有关如何安装Odigos的说明可以在这里找到。

我们需要在 Kubernetes 上安装 SigNoz,以便 OpenTelemetry 可以将收集到的数据发送给它。

可以使用 Helm 轻松地在 Kubernetes 上安装 SigNoz:

helm repo add signoz https://charts.signoz.io
kubectl create ns platform
helm --namespace platform install my-release signoz/signoz
Enter fullscreen mode Exit fullscreen mode

要在我们的本地机器上移植 SigNoz UI,请运行以下命令。

export POD_NAME=$(kubectl get pods --namespace platform -l "app.kubernetes.io/name=signoz,app.kuber
    netes.io/instance=my-release,app.kubernetes.io/component=frontend" -o jsonpath="{.items[0].metadata.name}")

kubectl --namespace platform port-forward $POD_NAME 3301:3301
Enter fullscreen mode Exit fullscreen mode

现在,您可以访问 SigNoz UIhttp://localhost:3301

为了演示,我们将使用 Google 的另一个电商应用程序来更全面地了解分布式追踪。该代码库不包含任何检测或监控设置。

创建此存储库microservices-demo的克隆

git clone https://github.com/keyval-dev/microservices-demo.git
Enter fullscreen mode Exit fullscreen mode

运行以下命令创建一个新的本地 Kubernetes 集群。设置 Odigos 时需要用到它。

ℹ️ 对于 Windows 用户,请确保 Docker Desktop 已运行。

minikube start
Enter fullscreen mode Exit fullscreen mode

有关如何安装minikube的说明可以在这里找到。

使用以下命令部署克隆的应用程序

kubectl apply -f https://raw.githubusercontent.com/keyval-dev/microservices-demo/master/release/kubernetes-manifests.yaml
Enter fullscreen mode Exit fullscreen mode

使用以下命令启动 Odigos UI。

./odigos ui
Enter fullscreen mode Exit fullscreen mode

访问 Odigos UI localhost:3000。选择命名空间中的所有微服务,如下所示。

Odigos 用户界面

选择所有申请后,我们将被要求提供:

  • 目的地名称:我们的目的地的名称。
  • 主机端点:使用 SigNoz 的主机端点。

完成此操作后,我们现在应该会看到以下 UI。

Odigos 用户界面

恭喜🎉!Odigos 设置成功。现在,它应该会自动将跟踪记录、指标和日志发送到我们的可观察性后端。

frontend-external现在,为了在实践中看到这一点,我们需要首先为我们的LoadBalancer 服务设置外部 IP 。

运行该kubectl get services命令应显示以下内容。请注意服务<pending>的 IP external-frontend

Kubernetes 服务

LoadBalancer默认情况下,浏览器无法访问服务。为此,我们需要进行设置minikube tunnel。有关此命令的更多信息,请访问此处

minikube tunnel
kubectl get services
Enter fullscreen mode Exit fullscreen mode

现在,我们可以看到分配给该服务的 IP 和端口external-frontend

Kubernetes 服务隧道镜像

http://127.0.0.1:8081在浏览器上访问以访问该应用程序。

Google电子商务应用程序

运行SigNoz服务并执行以下命令。

kubectl port-forward -n tracing svc/<service_name> <port_to_use>:<port>
Enter fullscreen mode Exit fullscreen mode

现在,我们应该能够像以前一样查看应用程序的所有痕迹。


总结!📝

到目前为止,我们已经学习了如何使用跟踪和 Hostmetrics 密切监控我们应用程序的性能,首先手动使用 OpenTelemetry 和 SigNoz,然后使用 Odigos 自动执行该过程。

注意:我们并不局限于使用 SigNoz;我们可以使用任何现有的可观测性数据库。仅出于本文的目的,我选择使用 SigNoz。

对于任何生产级应用程序来说,拥有一个监控系统总是一个好主意。这将有助于我们调试未来可能出现的错误。最重要的是,它能帮助我们识别应用程序中的性能瓶颈,从而提高效率和用户体验。

本教程的源代码可以在这里找到:

https://github.com/keyval-dev/blog/tree/main/instrumenting-node-app

感谢您的阅读!🎉

文章来源:https://dev.to/odigos/how-to-monitor-your-requests- Between-multiple-applications-4fi8
PREV
⤴️ 构建可扩展云应用程序的 6 大项目 🚀
NEXT
Node 与 Go:API 对决