2022 年 10 月 17 日

使用 Prisma、Prometheus 和 Grafana 进行数据库指标监控

Prisma 的指标功能使您可以详细了解 Prisma 如何与您的数据库交互。在本教程中,您将学习如何使用指标通过 Prisma、Prometheus 和 Grafana 监控您的数据库。

Database Metrics with Prisma, Prometheus & Grafana

目录

介绍

本教程将教您如何使用指标来提高应用程序的监控能力。您将亲身实践如何将指标集成到使用 PrismaPostgreSQLExpress 构建的 Web 应用程序中。

您将使用预构建的 Express API 服务器,该服务器使用 Prisma 与 PostgreSQL 数据库进行交互。在本教程中,您将学习如何使用 Prisma 的指标功能向 API 服务器添加指标。您还将学习如何设置和配置 PrometheusGrafana 来收集和可视化生成的指标。

什么是指标?

指标是数据的数值表示形式,用于监控和观察系统随时间推移的行为。您可以使用它来确保系统按预期运行、识别潜在问题、衡量业务目标等。

在 Prisma 中,指标是一项新功能,可让您监控 Prisma 如何与您的数据库交互。指标公开了一组 计数器仪表直方图,这些指标提供有关 Prisma 状态和数据库连接的信息。Prisma 公开的指标包括

  • 执行的 Prisma Client 查询总数 (prisma_client_queries_total)
  • 执行的 SQL 或 MongoDB 查询总数 (prisma_datasource_queries_total)
  • 活动数据库连接数 (prisma_pool_connections_open)
  • 包含所有已执行 Prisma Client 查询持续时间的直方图 (prisma_client_queries_duration_histogram_ms)
  • ... 以及更多!

注意:可用指标的完整列表可在指标文档中找到。

指标可以直接由您的应用程序进行分析,也可以发送到外部监控系统和时间序列数据库,例如 PrometheusStatsD。与这些外部系统集成可以通过开箱即用地提供以下功能来显着提高您的监控能力

  • 通过可视化和仪表板进行实时性能监控
  • 历史数据的查询和分析
  • 针对故障和性能下降的精确和自动化警报

在本教程中,您将使用 Prometheus 来收集指标,并使用 Grafana 来可视化指标。

注意:指标通常与 追踪结合使用,以获得系统的精细概览。要了解有关追踪的更多信息,请查看我们的追踪教程

您将使用的技术

在本教程中,您将使用以下工具

前提条件

预设知识

本教程对初学者友好。但是,它假设

  • JavaScript 或 TypeScript 的基本知识(首选)
  • 后端 Web 开发的基本知识

注意:本教程假定您没有关于指标的先验知识。

开发环境

要学习本教程,您需要

  • ... 安装 Node.js
  • ... 安装 DockerDocker Compose

    注意:如果您使用的是 Linux,请确保您的 Docker 版本为 20.10.0 或更高版本。您可以通过在终端中运行 docker version 来检查您的 Docker 版本。

  • ... 可选安装 Prisma VS Code 扩展。Prisma VS Code 扩展为 Prisma 添加了一些非常好的 IntelliSense 和语法高亮。
  • ... 可选访问 Unix shell(如 Linux 和 macOS 中的终端/shell)以运行本系列中提供的命令。

如果您没有 Unix shell(例如,您使用的是 Windows 机器),您仍然可以继续学习,但 shell 命令可能需要针对您的机器进行修改。

克隆仓库

您将使用我们为本教程构建的现有 Express Web 应用程序。

要开始使用,请执行以下操作

  1. 克隆仓库
  1. 导航到克隆的目录
  1. 安装依赖项
  1. 使用 Docker 在端口 5432 上启动 PostgreSQL 数据库

注意:如果您关闭运行 Docker 容器的终端窗口,它也会停止容器。如果您在命令末尾添加 -d 选项,例如:docker-compose up -d,则可以避免这种情况。

  1. prisma/migrations 目录应用数据库迁移

注意:此命令还将生成 Prisma Client 并播种数据库。

  1. 启动服务器

注意:您应该在开发应用程序时保持服务器运行。dev 脚本应在代码发生任何更改时重新启动服务器。

项目结构和文件

您克隆的仓库具有以下结构

该仓库包含 REST API 的代码。它包含一个 /articles 端点,您可以在其中运行各种 CRUD(创建、读取、更新和删除)操作。还有一个 /articles/audit 端点,可以查询该端点以获取对各种文章所做更改的日志。

此仓库中值得注意的文件和目录是

  • prisma
    • schema.prisma:定义数据库模式。
    • migrations:包含数据库迁移历史记录。
    • seed.ts:包含一个用于使用虚拟数据播种开发数据库的脚本。
  • server.ts:带有各种端点的 Express REST API 实现。
  • loadtest.js:使用 k6 生成大量流量到 REST API 的脚本。

注意:随意浏览仓库中的文件,以更好地了解应用程序。

将指标集成到您的应用程序中

您的 Express 应用程序已实现所有核心“业务逻辑”。为了衡量应用程序的性能,您将集成指标。

本节将教您如何初始化指标并从您的 Web 服务器公开它们。

在 Prisma Client 中启用指标

指标目前在 Prisma 中作为 预览功能提供。要使用它,您需要在 schema.prisma 文件的 generator 块中启用 metrics 功能标志

注意:您可能已经注意到此模式已经启用了另一个预览功能,称为 interactiveTransactions。这在应用程序内部用于执行数据库事务。

现在,重新生成 Prisma Client

启用指标功能后,Prisma 将允许您使用 prisma.$metrics API 检索有关数据库操作的指标。您可以以 JSON 格式Prometheus 格式公开指标。

从您的 Web 服务器公开指标

在本节中,您将从您的 Express Web 服务器公开数据库指标。为此,您将创建一个名为 GET /metrics 的新端点,该端点将以 Prometheus 格式返回指标。

要实现 GET /metrics 端点,请将以下路由添加到 server.ts

确保服务器正在运行,然后转到 https://127.0.0.1:4000/metrics 以查看生成的指标。

注意:您可以通过运行 npm run dev 来启动服务器。

Metrics in Prometheus format

注意:您还可以使用 prisma.$metrics.json() 以 JSON 格式检索指标。您可以在文档中阅读有关 JSON 格式的更多信息。

集成 Prometheus

在本节中,您将学习如何配置 Prometheus 并将其集成到您的应用程序中。Prometheus 通过定期从特定端点请求数据来收集指标。您将配置 Prometheus 从 https://127.0.0.1:4000/metrics 端点抓取指标数据。

创建 Prometheus 配置文件

首先,在您的项目根目录创建一个名为 prometheus 的新文件夹。然后,在此文件夹中创建一个名为 prometheus.yml 的新文件。

使用 Prometheus 的配置更新文件

需要记住的一些重要选项是

  • job_name 是用于标识来自特定配置的指标的元数据。
  • scrape_interval 是 Prometheus 将抓取指标端点的间隔。
  • targets 包含要抓取的端点列表。默认情况下,Prometheus 将抓取 /metrics 端点。因此不必显式提及。

    注意host.docker.internal 是一个特殊的 DNS 名称,它解析为运行 Docker 的主机内部 IP 地址。由于 Prometheus 在 Docker 内部运行,因此使用此特殊 DNS 名称,以便它可以解析主机(您的计算机)的 https://127.0.0.1

启动 Prometheus 实例

现在配置文件已准备就绪,您需要运行 Prometheus。您将通过扩展 docker-compose.yml 文件在 Docker 容器内设置 Prometheus。通过将当前的 prometheus 镜像添加到 docker-compose.yml 文件来替换当前文件内容,替换为以下内容

新的 prometheus 镜像设置为使用您之前创建的 prometheus/prometheus.yml 配置文件。它还将端口 9090 公开给主机,您可以使用该端口访问 Prometheus 用户界面 (UI)。该镜像将使用名为 prometheus-storage来存储 Prometheus 的数据。

注意:需要 extra_hosts 选项才能在 Linux 机器上解析 host.docker.internal。如果您使用的是 Linux,请确保您使用的是 Docker 版本 20.10.0 或更高版本。您可以查看此 Github 评论 以获取更多信息。

现在您需要重新启动在 Docker Compose 中运行的容器。您可以通过再次运行 docker-compose up 命令并添加 --force-recreate 选项来执行此操作。打开一个新的终端窗口并运行以下命令

如果命令成功,您应该能够在 https://127.0.0.1:9090 中看到 Prometheus UI。

Prometheus UI

在 Prometheus UI 中探索指标

表达式 输入字段中,您可以输入 PromQL(Prometheus 查询语言) 查询以检索指标数据。例如,您可以输入 prisma_client_queries_total 以查看 Prisma Client 执行的查询数量。输入查询后,单击执行按钮以查看结果。

注意:您可能会看到响应 空查询结果 而不是实际值。这也很好——继续下一步。

Query execution result in Prometheus UI expression browser

您看到的界面称为表达式浏览器。它允许您以表格或图形格式查看任何 PromQL 表达式的结果。

目前,查询数量为 0 或为空,因为您尚未发出任何 API 请求。您将使用负载测试工具 k6,而不是手动发出大量请求来生成指标数据。项目中已经提供了一个名为 loadtest.js 的负载测试脚本。您可以通过执行以下命令来运行此脚本

此命令将首先拉取 k6 Docker 镜像,然后开始向您的 Express API 发出许多请求。在 k6 开始发出请求后,您可以返回 Prometheus UI 并再次执行之前的查询。您现在应该看到查询数量迅速增加。

Prometheus UI 还提供了一种在时间序列图中查看指标的方法。您可以通过单击图表选项卡来执行此操作。在表达式输入字段中,输入与之前相同的查询,然后单击执行按钮。您应该看到一个图表,显示随时间推移执行的 Prisma Client 查询的数量。

Query execution result in graph format

注意:随意在 Prometheus UI 中尝试其他查询。您可以在 Prisma 文档中找到所有可用指标的列表。您还可以通过阅读 Prometheus 文档来学习如何执行更复杂的 PromQL 查询。

Prometheus 表达式浏览器是快速可视化临时查询的有用工具。但它不是一个功能齐全的可视化工具。Prometheus 通常与 Grafana 配对使用,Grafana 是一款功能丰富且强大的可视化和分析工具。

使用 Grafana 可视化指标

在本节中,您将学习如何设置 Grafana 并使用它来创建可视化指标数据的仪表板。Grafana 是一款流行的开源可视化工具,广泛用于监控和可视化。

您将首先集成 Grafana,以便它可以从 Prometheus 收集应用程序的监控数据。然后,您将创建一个仪表板,以有意义地表示系统公开的各种指标。

完全配置后,您的应用程序将如下所示

Application architecture with Prometheus and Grafana

注意:Web 应用程序通常有一个前端(客户端),它使用 Web 服务器的 API。但是,本教程不包括前端,以避免不必要的复杂性。

启动 Grafana 实例

要启动 Grafana 实例,您需要在 Docker Compose 文件中添加一个新的 grafana 镜像。将 docker-compose.yml 的当前内容替换为以下配置

grafana 镜像配置为使用名为 grafana-storage 的卷来存储数据。此卷将用于在重启后持久化 Grafana 的数据。grafana 镜像还配置为将端口 3000 公开给主机,您可以使用该端口访问 Grafana UI。

通过运行以下命令再次重启容器

如果您转到 https://127.0.0.1:3000,您将看到 Grafana 登录屏幕。默认用户名和密码均为 admin,您可以使用它们登录。您可以跳过创建新密码。

您现在应该看到 Grafana 欢迎页面。

Grafana landing page

向 Grafana 添加 Prometheus 数据源

您需要向 Grafana 添加数据源。数据源是 Grafana 可以查询以检索指标数据的外部系统。在本例中,您的数据源将是 Prometheus。

要通过 UI 添加数据源,请执行以下操作

  1. 单击侧边菜单左下角的齿轮图标
  2. 数据源配置窗口中,单击添加数据源
  3. 单击 Prometheus 作为数据源类型。
  4. 在 Prometheus 数据源配置页面中,将URL 设置为 http://prometheus:9090,将 抓取间隔 设置为 1shttp://prometheus:9090 将解析为 prometheus 容器上的端口 9090。这之所以可行,是因为 Docker Compose 自动配置的 Docker 网络
  5. 单击保存并测试以保存配置。

如果一切配置正确,您应该会看到数据源工作正常消息。

Grafana data source configuration

创建您的第一个 Grafana 仪表板

仪表板是表示指标数据的可视化集合。仪表板由一个或多个面板组成,面板是 Grafana 中的基本可视化构建块。

注意:在开始之前,您应该运行 npm run loadtest 生成一些流量,以便有一些数据可以可视化。

要创建您的第一个仪表板,请执行以下操作

  1. 单击侧边菜单中仪表板图标下的+ 新建仪表板选项。
  2. 在仪表板上,单击添加新面板以转到面板编辑器。查询选项卡中的数据源应已设置为Prometheus
  3. 查询选项卡内,在指标输入中填写 prisma_client_queries_total
  4. 按下 + 查询 按钮,然后在新的 指标 中,添加 prisma_datasource_queries_total
  5. 在右侧边栏中,将标题字段从面板标题更改为“Prisma Client 查询 vs. 数据源查询”。
  6. 按顶部的保存,系统将要求您命名仪表板。
  7. 仪表板名称更改为“Prisma 指标仪表板”,然后按保存

prisma_client_queries_total 表示执行的 Prisma Client 查询总数。prisma_datasource_queries_total 表示在数据源级别执行的数据库查询总数。这两个指标在同一张图中可视化,这使您可以比较两者。

Creating a dashboard in Grafana

恭喜!您刚刚创建了一个仪表板,该仪表板可视化了 Prisma Client 和 Prisma 数据源发出的查询数量。您的仪表板现在应该可以在 Grafana 内部访问。

注意:您应该探索 Grafana 提供的不同功能。例如,您可以向仪表板添加更多面板、更改可视化类型、添加注释等。您还可以使用 Grafana 为监控系统设置自动化警报Grafana 文档中提供了更多信息。

(可选)导入现有的 Grafana 仪表板

在上一节中,您创建了一个包含单个面板的仪表板。在本节中,您将导入一个包含多个面板的现有仪表板。要导入仪表板,请执行以下操作

  1. 单击侧边菜单中仪表板图标下的+ 导入选项。
  2. 此 JSON 文件 复制粘贴到 通过面板 JSON 导入 输入字段中。
  3. 单击加载按钮,然后单击导入

Importing a dashboard in Grafana

您现在应该看到一个带有多个面板的仪表板。您应该探索不同的面板并查看它们可视化的指标。

总结

在本教程中,您学习了

  • 什么是指标,以及为什么要使用它。
  • 如何将数据库指标集成到具有 Prisma 的现有 Web 应用程序中。
  • 如何使用 Prometheus 收集和查询指标数据。
  • 如何使用 Grafana 可视化指标数据。

如需进一步阅读,您可以查看以下资源

我们很想听听您对指标功能的想法!请在此 Github issue 上向我们提供有关指标的反馈。

您可以在 GitHub 上找到此项目的源代码。如果您发现问题,请随时在仓库中提出 issue 或提交 PR。您也可以在 Twitter 上直接与我联系。

不要错过下一篇文章!

注册 Prisma 新闻简报