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 添加了一些非常好的智能感知和语法高亮。
  • ... _可选_访问 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:定义数据库 schema。
    • migrations:包含数据库迁移历史。
    • seed.ts:包含一个脚本,用于使用虚拟数据填充您的开发数据库。
  • server.ts:带有各种端点的 Express REST API 实现。
  • loadtest.js:一个脚本,用于使用 k6 向 REST API 生成大量流量。

注意:欢迎随意探索存储库中的文件,以便更好地了解应用程序。

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

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

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

在 Prisma Client 中启用指标

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

现在,重新生成 Prisma Client

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

从您的 Web 服务器公开指标

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

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

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

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

Metrics in Prometheus format

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

集成 Prometheus

在本节中,您将学习如何配置 Prometheus 并将其集成到您的应用程序中。Prometheus 通过定期从特定端点请求数据来收集指标。您将配置 Prometheus 从 https://: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://

启动 Prometheus 实例

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

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

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

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

如果命令成功,您应该能够在 https://: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,以便它可以从 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://: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 查询与数据源查询”。
  6. 按下顶部的保存,系统将要求您命名仪表板。
  7. 仪表板名称更改为“Prisma Metrics Dashboard”并按下保存

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

Creating a dashboard in Grafana

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

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

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

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

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

Importing a dashboard in Grafana

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

概要

在本教程中,您学习了

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

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

我们很乐意了解您对指标功能的看法!请在此Github Issue上向我们提供有关指标的反馈。

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

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . This site is unofficial and not affiliated with Prisma Data, Inc.