如何监控多个应用程序之间的请求...🤔
TL;DR
TL;DR
想象一下,你从一个应用发送一个 HTTP 请求;这个应用将它发送到另一个应用,而这个应用又将请求发送到另一个应用。如果在此过程中发生了某些事情怎么办?
您需要标记所有请求以查明问题发生的位置。
在本教程中,您将学习如何使用 OpenTelemetry 来监控您的应用程序,并深入了解性能、跟踪和指标。
您将学习:
- 如何使用 OpenTelemetry 监控我们的应用程序。
- 如何查看日志和船舶轨迹。
- 如何查看指标并过滤跟踪。
- 如何自动化应用程序监控。
Odigos - 开源分布式追踪
无需编写任何代码,即可同时监控所有应用!
使用唯一能够在所有应用中生成分布式跟踪的平台,简化 OpenTelemetry 的复杂性。
我们真的才刚刚起步。
能帮我们加个星吗?拜托!😽
https://github.com/keyval-dev/odigos
让我们开始吧🔥
在这里,我将引导您安装该项目所需的包依赖项。
如下所示为 Web 应用程序创建项目文件夹。
mkdir monitor-app
cd monitor-app
mkdir server
设置 Node.js 服务器
导航到服务器文件夹并创建一个package.json
文件。
cd server && npm init -y
安装 Express。
npm install express
ExpressJS是一个使用 Node.js 构建 RESTful API 的后端 Web 应用程序框架。
创建一个index.js
文件——我们的网络服务器的入口点。
// 👇server/index.js
touch index.js
使用 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}`);
});
💡每日提示
自节点版本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"
},
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
对于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));
});
我们正在使用 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
访问 SigNoz UI http://localhost:3301
。登录后,我们应该会看到类似这样的内容。
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
对于Windows用户
1..20 | ForEach-Object { Invoke-RestMethod -Uri 'http://localhost:8000/fetch-data' }
现在,再次访问 SigNoz UI 我们应该在服务列表中看到我们的服务。
通过这条追踪信息,我们可以准确地看到整个请求每个部分所花费的时间。在我们的例子中,由于请求相当简单,所以花费的时间并不多。
为了正确可视化,我们将查看 SigNoz 已提供的演示应用程序之一的请求。
我们可以清楚地看到,第一个请求基本上执行了 SQL 查询,经过了多个步骤,最终执行了 SQL 查询。我们还可以看到请求中每个跨度所花费的时间。
SigNoz 的 Traces 仪表板为我们的追踪数据提供了现成的可视化效果。它包含强大的过滤器,可以根据我们选择的条件和时间范围分析跨度。
从 Hostmetrics 可视化指标
SigNoz 中接受指标的最常见方式是通过 Prometheus 接收器。
为简单起见,我将演示如何可视化 SigNoz 安装上默认启用的 Hostmetrics 提供的默认指标。
所有可用指标的列表都可以在这里找到。
在SigNoz UI 的仪表板部分下,创建一个新的时间序列面板。
在 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
要在我们的本地机器上移植 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
现在,您可以访问 SigNoz UIhttp://localhost:3301
为了演示,我们将使用 Google 的另一个电商应用程序来更全面地了解分布式追踪。该代码库不包含任何检测或监控设置。
git clone https://github.com/keyval-dev/microservices-demo.git
运行以下命令创建一个新的本地 Kubernetes 集群。设置 Odigos 时需要用到它。
ℹ️ 对于 Windows 用户,请确保 Docker Desktop 已运行。
minikube start
有关如何安装minikube的说明可以在这里找到。
使用以下命令部署克隆的应用程序
kubectl apply -f https://raw.githubusercontent.com/keyval-dev/microservices-demo/master/release/kubernetes-manifests.yaml
使用以下命令启动 Odigos UI。
./odigos ui
访问 Odigos UI localhost:3000
。选择命名空间中的所有微服务,如下所示。
选择所有申请后,我们将被要求提供:
- 目的地名称:我们的目的地的名称。
- 主机端点:使用 SigNoz 的主机端点。
完成此操作后,我们现在应该会看到以下 UI。
恭喜🎉!Odigos 设置成功。现在,它应该会自动将跟踪记录、指标和日志发送到我们的可观察性后端。
frontend-external
现在,为了在实践中看到这一点,我们需要首先为我们的LoadBalancer 服务设置外部 IP 。
运行该kubectl get services
命令应显示以下内容。请注意服务<pending>
的 IP external-frontend
。
LoadBalancer
默认情况下,浏览器无法访问服务。为此,我们需要进行设置minikube tunnel
。有关此命令的更多信息,请访问此处。
minikube tunnel
kubectl get services
现在,我们可以看到分配给该服务的 IP 和端口external-frontend
。
http://127.0.0.1:8081
在浏览器上访问以访问该应用程序。
运行SigNoz服务并执行以下命令。
kubectl port-forward -n tracing svc/<service_name> <port_to_use>:<port>
现在,我们应该能够像以前一样查看应用程序的所有痕迹。
总结!📝
到目前为止,我们已经学习了如何使用跟踪和 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