vlambda博客
学习文章列表

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板

Discovering and Creating Grafana Dashboards

Prometheus 表达式浏览器非常适合执行探索性查询,但有时我们需要预构建的可视化来帮助我们快速调试问题。在本章中,我们将深入研究 Grafana,这是 Prometheus 项目推荐的用于构建仪表板的工具。 Grafana 社区不断发展和繁荣,部分原因是托管了大量即用型仪表板,使其易于重用并为社区做出贡献,从而改善生态系统。在本章中,我们将学习如何从社区中查找和使用仪表板,以及如何编写自己的仪表板并回馈社区。最后,我们还将简要介绍控制台,这是 Prometheus 中内置的仪表板解决方案,用于高级用例。

简而言之,本章将涵盖以下主题:

  • Test environment for this chapter
  • How to use Grafana with Prometheus
  • Building your own dashboards
  • Discovering ready-made dashboards
  • Default Prometheus visualizations

Test environment for this chapter

为了提供动手实践的方法,我们将为本章创建一个新的测试环境。我们将使用的设置类似于下图:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.1: Test environment network

Deployment

要生成本章的基于虚拟机 (VM) 的测试环境,请转到相对于代码存储库根目录的正确存储库路径:

cd ./chapter10/

确保没有其他测试环境正在运行并启动本章的环境,如下所示:

vagrant global-status
vagrant up

您可以使用以下代码验证测试环境的成功部署:

vagrant status

这将给出以下输出:

Current machine states:

prometheus                 running (virtualbox)
grafana                    running (virtualbox)

This environment represents multiple VMs. The VMs are all listed above with their current state. For more information about a specific VM, run `vagrant status NAME`.

当部署任务结束时,您将能够使用您最喜欢的支持 JavaScript 的 Web 浏览器验证主机上的以下端点:

服务

端点

普罗米修斯

http://192.168.42.10:9090

格拉法纳

http://192.168.42.11:3000

您应该能够使用以下命令之一访问所需的实例:

实例

命令

普罗米修斯

vagrant ssh prometheus

格拉法纳

vagrant ssh grafana

Cleanup

完成测试后,只需确保您在 chapter10/ 中并执行以下命令:

vagrant destroy -f

不要太担心——如果需要,您可以轻松地再次启动环境。

How to use Grafana with Prometheus

Grafana 是最受认可的仪表板开源项目。它有数据源的概念,无非是与数据后端的集成。在撰写本文时,以下是可用的数据源:

  • Prometheus
  • Graphite
  • InfluxDB
  • Elasticsearch
  • Google Stackdriver
  • AWS CloudWatch
  • Azure Monitor
  • Loki (logging visualization)
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server
  • OpenTSDB
  • TestData (useful for generating fake data for testing)

已经做出了一些努力来改进 Prometheus 与 Grafana 的集成——例如,PromQL 自动补全。目前,对于任何对 Prometheus 数据可视化感兴趣的人来说,Grafana 都是首选仪表板解决方案。上一句并不完全正确,因为我们知道,对于探索性查询,没有什么能比得上 Prometheus 表达式浏览器。不过最近,在 6.0.0 版本发布后,Grafana 中引入了一个名为 Explore 的功能,作为替代表达式浏览器。

您可以在以下位置找到多个操作系统和发行版的安装文件 https://grafana.com/grafana/download

Grafana 在构建和预配置时考虑了自动化。在以下示例中,我们将演示如何在不触及主配置文件的情况下设置环境。一个值得注意的好处是 Grafana 自带 Prometheus 指标。

Login screen

在测试环境运行的情况下,您可以使用 http://192.168.42.11:3000 URL 访问 Grafana。用户会看到一个简单的登录屏幕,如下所示:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.2: Grafana login screen

默认身份验证凭据如下:

用户名

密码

管理员

管理员

成功登录后,欢迎来到 Grafana 主页,该主页显示设置向导。接下来,我们将解释所提供的每个配置步骤。以下屏幕截图显示了已配置一些步骤的向导:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.3: Grafana home screen

为了便于阅读,我们将默认 Grafana 主题更改为 Light 而不是 Dark。这可以在 Preferences 菜单中的 Configuration 选项卡(左侧的小齿轮图标)中轻松配置。

Data source

要查询数据,我们必须配置数据源。在我们的例子中,我们将添加我们的 Prometheus 实例作为默认数据源。为此,我们需要指出数据源的位置、所需的任何身份验证/授权详细信息以及任何其他特定于数据源的配置。

有两种方法可以配置数据源。一种方法是在 Grafana 配置路径中添加具有所需配置的 YAML 文件,该文件在启动时由服务拾取并自动配置。这就是我们在本章的测试环境中所做的,因为它是自动化部署的更好解决方案。在测试环境连接grafana实例时,通过查看默认的provisioning path可以看到我们正在使用的配置,如下图:

vagrant@grafana:~$ cat /etc/grafana/provisioning/datasources/prometheus.yaml 
apiVersion: 1

datasources:
- name: prometheus
  type: prometheus
  access: proxy
  orgId: 1
  url: http://prometheus:9090
  isDefault: True
  version: 1
  editable: True

另一种选择是通过进入配置(左侧的小齿轮图标)使用网络界面| 数据源并手动添加设置选项。当点击 保存 &测试,Grafana 将验证设置并让您知道是否有任何问题。 Grafana 提供了两个选项来访问提供基于 HTTP 的 API(例如 Prometheus)的数据源:带或不带代理请求。代理请求时,从仪表板面板或通过浏览表达式浏览器进行的每个查询都将通过 Grafana 后端代理到数据源。尽管这具有能够集中管理数据源凭据并关闭除受信任客户端之外的任何地方对这些数据源的直接网络访问的优点,但它会在 Grafana 实例上产生额外的负载,因为需要通过它们的更多流量。不代理请求意味着客户端浏览器将直接针对每个请求访问数据源。此配置期望访问 Grafana 的用户也可以直接访问正在使用的数据源,并且该数据源的安全设置允许来自不同来源的请求。在我们所有的示例中,Grafana 都将设置为代理查询。

以下屏幕截图显示了在我们的测试环境中使用的配置:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.4: Data Sources configuration interface

请注意,Access 选项设置为 Server (Default)。这意味着对数据源的所有请求都将通过 Grafana 实例进行代理。

Explore

此功能是在 Grafana 6 中引入的,其开发人员继续改进其与 Prometheus 的紧密集成。在探索之前,每次您想要执行探索性查询时,都需要跳转到 Prometheus 表达式浏览器。

除了这种便利性之外,还有一些值得注意的功能使 Explore 独一无二,如下表所示:

  • Metrics list: In the top-left corner, we can find a combo box called Metrics. This lists metrics in a hierarchical form, grouped by their prefix, and even detects and groups recording rules when they follow the double-colon naming convention.
  • Query field: Besides suggesting and autocompleting metrics, the query field also displays useful tooltips about PromQL functions and can even expand recording rules that are detected in their originating expression.
  • Context menus: You can choose to open the query from any dashboard panel directly in the Explore page.

以下屏幕截图展示了 Explore 界面,同时还显示了正在使用的 PromQL 函数的工具提示:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.5: Grafana Explore page depicting the tooltip for the label_replace function

通常可以通过单击左侧的小指南针图标找到探索。

Dashboards

与管理数据源类似,您可以通过多种方式添加仪表板,如下所示:

  • By manually building your own
  • By importing grafana.com community-driven dashboards
  • By automatically provisioning previously stored dashboards

由于测试环境正在使用这种方法,我们现在将处理最后一种方法。我们将在以下部分重点介绍其他两种方法。

仪表板文件是仪表板的声明性表示,指定了所有必需的设置,并使用 JSON 格式。如果您将其放置在预期的配置路径中,Grafana 服务将在开始时将其拾取。在我们的示例中,我们使用了默认路径,如下面的代码片段所示:

vagrant@grafana:~$ ls /etc/grafana/dashboards/
node_exporter_basics.json

您可以通过进入页面左上角的 Home 菜单然后选择 node_exporter_basics 来找到此仪表板。这在视觉上转换为以下屏幕截图:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.6: Example dashboard that's been automatically provisioned

Grafana running on Kubernetes

在 Kubernetes 上部署 Grafana 所涉及的方法与在 VM 中部署它的方法基本相同,因此我们只关注操作员应该注意的一些细节。相对于代码存储库根路径,可以在以下路径中找到用于启动 Grafana 和 Prometheus 并在我们的 Kubernetes 测试环境中运行的 Kubernetes 清单:

cd ./chapter10/provision/kubernetes/

由于 Kubernetes 部署过程与前几章相同(引导 Prometheus Operator,使用 Operator 部署 Prometheus,部署 exporter 及其各自的 ServiceMonitors),此处不再赘述。如果您需要更多上下文,请随时查看前面章节中的测试环境演练,例如 第 7 章Prometheus 查询语言 PromQL

以下步骤将确保创建一个新的 Kubernetes 环境,并提供所有必需的软件,以便我们可以专注于 Grafana 组件。

  1. Validate that no other environment is running:
minikube status
minikube delete
  1. Start an empty Kubernetes environment, by using the following command:
minikube start \
  --cpus=2 \
  --memory=3072 \
  --kubernetes-version="v1.14.0" \
  --vm-driver=virtualbox
  1. Add the Prometheus Operator components and follow its deployment, as follows:
kubectl apply -f ./bootstrap/
kubectl rollout status deployment/prometheus-operator -n monitoring
  1. Add the new Prometheus cluster, ensuring that it's successful, by using the following command:
kubectl apply -f ./prometheus/
kubectl rollout status statefulset/prometheus-k8s -n monitoring
  1. Add all the targets to Prometheus and list them using the following command:
kubectl apply -f ./services/
kubectl get servicemonitors --all-namespaces

现在 Kubernetes 环境正在运行,我们可以继续进行 Grafana 特定的配置。与以 VM 为中心的测试环境类似,我们不仅需要配置 Grafana 本身,还需要配置数据源和仪表板。

对于数据源,由于我们将来可能希望添加诸如身份验证之类的敏感信息,因此我们将使用 Kubernetes 机密。这也意味着应该有一个 ServiceAccount 来访问该机密。

我们可以通过应用以下清单来创建 ServiceAccount:

kubectl apply -f ./grafana/grafana-serviceaccount.yaml

由于我们使用的是机密,因此需要将数据源配置编码为 base64。至于供应配置本身,它与 VM 部署中的相同,但我们将用服务管理的 Kubernetes 等效项替换 Prometheus URL。这是编码前的片段:

...
datasources:
- name: prometheus
...
 url: http://prometheus-service.monitoring.svc:9090
...

应用以下清单后,将提供具有所需 Grafana 数据源的新密钥:

kubectl apply -f ./grafana/grafana-datasources-provision.yaml

现在,是时候将我们的示例仪表板添加到 Grafana 了。为了实现这一点,我们需要为 Grafana 提供一个配置配置,告诉它在哪里查找仪表板定义,然后将我们的示例仪表板定义放在该路径中。这些将作为 ConfigMaps 用于 Grafana 部署。显示仪表板位置配置配置的相关片段如下:

...
data:
  dashboards.yaml: |-
    {
        "apiVersion": 1,
        "providers": [{
           "folder": "",
           "name": "default",
           "options": {
             "path": "/etc/grafana/dashboards" 
           },
           "orgId": 1,
           "type": "file"
         }]
    }
kind: ConfigMap
...

另一个 ConfigMap 包含我们的示例仪表板,如下所示:

...
data:
  node_exporter_basics.json: |-
    {
...
    }
kind: ConfigMap
...

两个清单都可以使用以下命令部署在 Kubernetes 测试环境中:

kubectl apply -f ./grafana/grafana-dashboards-provision.yaml

kubectl apply -f ./grafana/grafana-dashboards.yaml

现在是部署 Grafana 并利用前面所有配置的时候了,如下所示:

kubectl apply -f ./grafana/grafana-deployment.yaml

此部署将所有内容结合在一起:它将数据源的机密、仪表板配置和仪表板 ConfigMaps 安装在与 VM 测试环境相同的位置,如下所示:

... 
        volumeMounts:
        - name: grafana-datasources-provision
          mountPath: /etc/grafana/provisioning/datasources
        - name: grafana-dashboards-provision
          mountPath: /etc/grafana/provisioning/dashboards
        - name: grafana-dashboards
          mountPath: /etc/grafana/dashboards
...

您可以使用以下说明跟踪部署状态:

kubectl rollout status deployment/grafana -n monitoring

最后,我们可以添加一个服务,以便我们可以访问新启动的 Grafana 实例,以及一个 ServiceMonitor,以便 Prometheus Operator 配置 Prometheus 以收集指标:

kubectl apply -f ./grafana/grafana-service.yaml

kubectl apply -f ./grafana/grafana-servicemonitor.yaml

您现在可以使用以下命令访问 Grafana 界面:

minikube service grafana -n monitoring

完成测试后,您可以通过发出以下命令删除此基于 Kubernetes 的测试环境:

minikube delete

此设置让您快速了解如何在 Kubernetes 上将 Grafana 与 Prometheus 集成。它与 VM 测试环境并没有太大的不同,但是这里显示的详细信息有望使您不必在其他地方搜索有关如何完成它的信息。

Building your own dashboards

在提供的 VM 测试环境中,您有机会试用捆绑的仪表板。现在,是时候学习如何构建自己的了,但为此,您需要掌握一些概念。在本节中,我们将引导您完成创建仪表板的过程。

Dashboard fundamentals

仪表板由多个组件组成。我们将在以下部分中讨论最重要的概念,包括面板、它们支持的可视化、如何模板化变量以及更改显示数据的时间范围。

Panels

面板是仪表板可视化区域中的一个矩形槽。以下屏幕截图显示了一个示例。它可以通过拖放其各种尺寸根据需要重新排列和调整大小。您还可以将一组面板放在一行中,这只不过是这些面板的逻辑分组。行可以展开或折叠以显示或隐藏其中的面板:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.7: New panel

面板除了能够查询所选数据源外,还提供多种可视化选项供您选择。这些可视化选项允许您以多种方式呈现数据,例如简单的单值面板、条形图、折线图、表格,一直到热图。以下屏幕截图说明了可用的内置可视化:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.8: Built-in visualization options

在前面的屏幕截图中,我们可以看到几种面板类型。最常用的四个如下:

  • Graph: This the main Grafana panel. It provides the tools to create rich two-dimensional graphs backed by one or more PromQL expressions.
  • Singlestat: This is a multipurpose single-value display. As such, the PromQL query must return an instant vector with one sample only.
  • Gauge: Using thresholds, this represents the position the current value is at in relation to the defined higher and lower bounds. Like the Singlestat visualization, this option requires a single instant vector with only one sample.
  • Table: This displays the result of a PromQL expression in a table format, with each label in its own column, along with the value and the timestamp.

对于每个可用的可视化,有许多选项允许对每个面板的外观进行非凡的定制。 Grafana 官方文档详细解释了每个选项,因此我们将重点关注最相关的选项。

Variables

变量功能非常强大。它允许仪表板配置可在表达式中使用的占位符,这些占位符可以填充静态或动态列表中的值,这些值通常以下拉菜单的形式呈现给仪表板用户。每当所选值更改时,Grafana 将自动更新面板中使用该特定变量的查询。在我们的示例仪表板中,我们使用此功能允许用户选择要呈现的节点实例。除了常用于查询之外,它们还可以用于例如面板标题中。

此功能在仪表板设置中可用,可通过单击右上角的齿轮图标找到,而该图标又可在任何仪表板中使用。以下屏幕截图描述了 Settings 菜单中 node_exporter_basics 控制面板中的 Variables 选项:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.9: Dashboard variables

如您所见,我们使用 PromQL 查询来动态获取 $instance 变量的可能值。

When the viewport is not large enough, the responsive design of Grafana will hide some of the top-right icons.

Time picker

时间选择器功能可在右上角的任何仪表板中作为包含时钟图标的按钮使用。该界面分为两个主要部分:预定义时间范围的快速范围(大部分相对于当前时间)或自定义范围,它允许您指定在所有仪表板面板中使用的确切时间跨度。顾名思义,Refreshing every: 选项将使仪表板面板以指定的时间间隔自动重新加载。当与相对时间范围结合使用时,这对于查看进来的新数据很有用。

以下屏幕截图显示了一系列快速范围:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.10: Time picker

Creating a basic dashboard

我们将通过指导您完成基本仪表板的创建过程来亲身体验 Grafana。您可以先单击左侧的加号徽标 | 仪表板。这将打开一个带有新面板的新空仪表板,可供编辑。由于我们想要一个动态仪表板,我们将创建一个新变量,它将扩展为 Prometheus 服务器中可用节点导出器实例的列表。

Using the Shift + ? key combination will display a helpful tooltip of all the available shortcuts.

为了实现我们的目标,我们必须点击右上角的齿轮图标,打开仪表板设置,然后选择变量。以下屏幕截图说明了创建此类变量时可用的选项:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.11: Variables interface
The preview values depicted in the preceding screenshot show the Node Exporter targets from the VM-based test environment. You will get a different preview if you are following along using the Kubernetes test environment.

在此示例中,我们使用 Query type 创建了一个名为 instance 的变量,这意味着它将根据查询数据源。我们将数据源指定为 prometheus,这是我们在配置期间提供的标识符,并且我们希望仅在加载仪表板时刷新该变量。

现在到了有趣的部分:因为我们对收集 Node Exporter 实例感兴趣,所以我们在 Query 字段中使用一个指标,该指标保证返回我们需要的实例,node_exporter_build_infolabel_values() 函数实际上不是有效的 PromQL,但由 Grafana 中的 Prometheus 数据源插件提供,用于此字段以促进此类表达式。

Regex 字段用于匹配我们要用于填充变量的查询结果部分。在我们的示例中,我们想要实例标签的完整内容,因此我们匹配正则表达式捕获组中的所有内容,(.+)。我们可以在屏幕底部的 Preview of values 部分看到匹配正在运行。单击添加并使用名称example保存此仪表板后,我们现在可以看到以下带有instance变量值的下拉菜单:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.11: Instance values

是时候创建我们的第一个面板了。单击右上角的图形徽标,然后在新面板中单击添加查询。以下截图说明了查询界面:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.12: Query interface

在这里,我们可以指定要在所需数据源上执行的 PromQL 查询(一个或多个,取决于可视化类型)。在我们的示例中,我们将创建每个模式的 CPU 使用率图表,并且我们希望对查询进行模板化,以便它使用我们之前创建的 instance 变量。注意 $instance,它将在查询时替换为 instance 组合框中的选定值。完整的表达式如下:

label_replace(avg by (mode, instance) (irate(node_cpu_seconds_total{instance="$instance", mode!="idle"}[5m])), "instance", "$1", "instance", "([^:]+):.+")

label_replace() 函数允许我们从实例值中删除端口,我们将在 Legend 字段中使用它。此字段允许将 {{ }} 模板标记替换为其中设置的度量标签的值。反过来,这将反映在 Query 菜单之前的图例上。在以下屏幕截图中,我们可以看到已应用于仪表板的几个视觉选项,我们将逐一介绍:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.13: Visualization interface

Axes 部分,我们选择要启用的图形轴; Right Y 配置选项不会产生任何变化,因为该轴未被使用。在Left Y配置中,我们可以指定Unit。在我们的例子中,我们需要一个百分比;我们可以简单地将表达式乘以 100,但不这样做会暴露 Grafana 必须提供的便利功能之一。我们已经知道,我们的取值范围是从 0 到 1;此 Unit 类型将采用 0-1 范围内的值并自动将它们转换为百分比(从 0 到 100)。我们还确保将 Y-min 设置为,以便图表在视觉上更容易理解,因为没有它,图表的 y 轴刻度将适应从查询结果中的最低 Y 值附近开始。此外,为了这个示例,我们希望 y 刻度的值保留三位小数,因此我们使用 Decimals 字段进行设置。在 X 轴 上,我们没有改变任何东西,因为我们需要时间。

Legend 部分,我们控制我们希望图表图例的外观以及它在面板内的位置。在我们的例子中,我们希望它是一个表格,放在图表的右侧,我们希望它显示 Y 的平均值和当前值。

要完成我们的面板,我们需要进入 General 菜单,如下面的屏幕截图所示,我们可以在其中命名面板并添加描述。描述将作为面板左上角的小 i 图标提供:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.14: The general menu of the panel

要保存新仪表板,只需单击右上角的小软盘图标。您现在已经从头开始创建了一个简单的仪表板!您可以继续添加面板和可视化,但主要概念几乎相同。您可以在测试环境中探索提供的仪表板,以获取有关如何使用不同可视化选项的更多示例。

创建仪表板时要记住的一点是避免不必要的混乱。通常会看到带有数十个面板的仪表板,并显示大量数据。尝试获取适量的信息,以便例如快速、轻松地解决问题。焦点是这里的关键词:如果仪表板中存在彼此不相关的面板,那么将它们拆分为自己的仪表板可能是个好主意。

Exporting dashboards

Grafana 可以轻松导出仪表板。要继续,只需打开您要导出的仪表板,然后按右上角面板中软盘图标附近的小带箭头的方形图标。

将打开以下表格:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.15: Grafana dashboard export

在这里,您会看到几个选项:

  • Export for sharing externally: Enables the templating of the data source names, which is helpful for sharing the dashboard publicly. This is mandatory in order to publish the dashboard on the grafana.com website.
  • View JSON: Allows you to visualize the code of the dashboard.
  • Save to file: Downloads the dashboard as a JSON file.

接下来,我们将了解如何从 Grafana 仪表板库下载仪表板,以及如何为它贡献自己的力量。

Discovering ready-made dashboards

由于 Grafana 被广泛使用并且背后有一个庞大的社区,因此该社区正在创建大量仪表板是合乎逻辑的。 Grafana 的人员提供了一项服务,注册用户可以将他们的仪表板发布到画廊上,任何人都可以下载并安装在他们自己的 Grafana 实例上。在以下部分中,我们将提供这两种操作的概述,不仅使用社区制作的仪表板,还包括如何发布您自己的仪表板。

Grafana dashboards gallery

https://grafana.com/dashboards 上提供了社区驱动和官方仪表板,并且正如预期的那样有很多可供选择。由于我们在搜索站点时对 Prometheus 特定的仪表板感兴趣,因此我们应该将搜索结果限制为该数据源。通过应用额外的过滤器,我们不断将结果限制在我们所追求的范围内,如您在以下屏幕截图中所见:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
10.16: Grafana.com filtered dashboards result

然后我们可以选择我们感兴趣的仪表板,它会依次打开一个屏幕,如以下屏幕截图所示:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.17: Grafana.com selected dashboard information

在这里,我们可以看到有关仪表板的一些信息及其屏幕截图。注意右边的 ID 9916;它是 Grafana 库中此特定仪表板的唯一标识符。我们可以通过进入 Grafana 实例来使用它,例如我们测试环境中的实例,单击左侧主菜单中的加号,从子菜单中选择 Import,然后将其粘贴到相应的文本字段中,如以下屏幕截图所示:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.18: Import dashboard interface

粘贴 ID 后,会弹出一个新菜单,询问我们要给此仪表板起的名称、应放置在哪个文件夹中以及应使用什么数据源。如果与预先存在的仪表板(例如具有相同名称的仪表板)有任何冲突,系统会要求您解决它们,然后才能完成导入过程。

Publishing your dashboards

发布新创建的仪表板非常容易。首先,使用位于 https://grafana.com/signup< 的注册表单,确保您拥有 Grafana 网站的帐户/一>。成功注册后,通过 个人 | 我的仪表板 或使用 https://grafana.com/orgs 进入您的个人资料/<user>/dashboards 链接,将 <user> 替换为您的 Grafana 用户名。

我的仪表板中,您现在可以点击上传仪表板按钮。此操作将打开一个上传表单,请求上传仪表板。请记住,这将只接受打开导出以供外部共享选项导出的仪表板:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.19: Dashboard upload form

你完成了!您现在将获得仪表板的数字 ID,您可以开始使用它或在全球范围内共享它。您可以根据需要更新已发布的仪表板,因为这不会更改生成的 ID。相反,它将创建已发布仪表板的另一个修订版,并且用户将始终下载可用的最新修订版。

Default Prometheus visualizations

从历史上看,Prometheus 维护自己的工具来创建仪表板,称为 PromDash。随着时间的推移,由于 Grafana 改进了对 Prometheus 作为数据源的原生支持,社区开始倾向于使用 Grafana 作为其主要的可视化解决方案——以至于 PromDash 被维护 Prometheus 的人弃用,转而支持 Grafana。

You can find the source code for PromDash at https://github.com/prometheus-junkyard/promdash.

尽管 Grafana 是大多数人推荐的可视化解决方案,但 Prometheus 还附带了一个名为控制台模板的内部仪表板功能。这些控制台模板是用原始 HTML/CSS/JavaScript 编写的,并利用 Go 模板语言的强大功能来生成由 Prometheus 服务器本身提供的仪表板(称为控制台)。这使它们非常快速且可无限定制。控制台模板既复杂又强大。我们将在下一节中简要介绍如何使用和构建控制台模板来介绍此功能。

Out-of-the-box console templates

当您解压 Prometheus 发布存档时,除了服务器和 promtool 的二进制文件之外,还有一些现成的控制台模板可用。为了清楚起见,我们可以查看我们的测试环境,我们将这些模板解压缩到系统路径中,如下所示:

vagrant@prometheus:/usr/share/prometheus$ systemctl cat prometheus
...
ExecStart=/usr/bin/prometheus \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/var/lib/prometheus/data \
    --web.console.templates=/usr/share/prometheus/consoles \
    --web.console.libraries=/usr/share/prometheus/console_libraries
...

两个目录都需要正确配置才能使控制台正常工作。控制台库定义了随后在控制台模板中使用的辅助函数,以便将重复保持在最低限度。当我们构建自己的模板时,我们将在下一节中仔细研究这些库。

目前,以下是 Prometheus 附带的控制台模板:

vagrant@prometheus:~$ ls -lh /usr/share/prometheus/consoles 
total 36K
-rw-r--r-- 1 root root 623 Mar 10 16:28 index.html.example
-rw-r--r-- 1 root root 2.7K Mar 10 16:28 node-cpu.html
-rw-r--r-- 1 root root 3.5K Mar 10 16:28 node-disk.html
-rw-r--r-- 1 root root 1.5K Mar 10 16:28 node.html
-rw-r--r-- 1 root root 5.7K Mar 10 16:28 node-overview.html
-rw-r--r-- 1 root root 1.4K Mar 10 16:28 prometheus.html
-rw-r--r-- 1 root root 4.1K Mar 10 16:28 prometheus-overview.html

正如您在 index.html.example 中所见,这些模板期望 Prometheus 和 Node Exporter 的抓取作业分别命名为 prometheusnode ,因此它们可能不适用于开箱即用的 Prometheus 配置。

我们可以通过使用位于 http://192.168.42.10:9090/consoles/index.html.example 的 Web 界面 URL 并探索可用的控制台来访问它。以下屏幕截图描述了 Prometheus 实例的节点 CPU 的控制台:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.20: Node CPU for Prometheus

Console template basics

从头开始创建控制台模板具有陡峭的学习曲线。与 Grafana 不同,控制台模板是直接用 HTML 和 JavaScript 制作的,并混合了相当多的 Go 模板。这意味着控制台在技术上可以采用任何形式,但为简单起见,我们将坚持内置控制台库提供的结构。

为示例控制台模板提供支持的库定义了控制台的脚手架。他们负责诸如构建 HTML 结构(包括必要的 CSS 和 JavaScript)以及围绕主控制台内容对四个部分进行建模:顶部的导航栏、左侧的菜单、底部的控制台时间控件、以及右侧显示汇总统计信息的表格。让我们看看如何使用它们来构造一个简单的控制台模板,看看下面的代码:

{{template "head" .}}

{{template "prom_content_head" .}}

head 模板扩展为定义包含 CSS 和 JavaScript、顶部导航栏和菜单的 HTML;另一方面,prom_content_head 模板定义了时间控件,如下面的代码所示:

<h1>Grafana</h1>

<h3>Requests by endpoint</h3>
<div id="queryGraph"></div>
<script> new PromConsole.Graph({ node: document.querySelector("#queryGraph"), expr: "sum(rate(http_request_total{job='grafana'}[5m])) by (handler)", name: '[[ handler ]]', yAxisFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix, yHoverFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix, yUnits: "/s", yTitle: "Requests" }) </script>

本节定义控制台本身。 queryGraph 元素用作图形 JavaScript 库将用来生成图形的占位符。另一方面,JavaScript 片段使用要使用的选择器 (node)、要绘制的表达式 (expr)、要使用的内容来配置图表图例(name),以及几个y-轴配置,如下代码所示:

{{template "prom_content_tail" .}}

{{template "tail"}}

最后两个模板关闭了第一个打开的部分。它们是必需的,以便生成的 HTML 格式正确。

生成的控制台在本章的测试环境中可用,可以在 http://192.168.42.10:9090/consoles/grafana.html 中查看。这是它的外观截图:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》发现和创建Grafana仪表板
Figure 10.21: Example console for Grafana requests per second

请注意,左侧的菜单没有指向我们新创建的控制台模板的链接。这是因为包含的 menu.lib 仅支持 Prometheus 附带的示例控制台模板。部署实际的自定义控制台模板时,您需要用自己的库替换此库。这将允许您在顶部的导航栏中添加指向其他内部系统的链接,并在左侧的导航菜单上列出哪些控制台可用。通过利用您可以在模板中执行 PromQL 查询这一事实,您应该能够找出该 Prometheus 实例抓取了哪些作业,并生成指向类似名称控制台的链接。

Summary

在本章中,我们探索了 Prometheus 的标准可视化工具:Grafana。我们已经学会了如何配置数据源和仪表板。在了解了仪表板的构建块之后,我们从头开始创建了一个简单的仪表板,逐步了解它所需要的所有内容。我们还学习了如何利用蓬勃发展的社区构建的仪表板库。回馈社区始终很重要,因此我们已经完成了导出和发布仪表板的过程。最后,我们了解了 Prometheus 的默认可视化——控制台——尽管它们的学习曲线很陡峭,但功能非常强大。

在下一章中,我们将探索 Alertmanager,如何最好地利用它的功能,以及如何将它与 Prometheus 集成。

Questions

  1. How can you provision a data source automatically in Grafana?
  2. What are the steps to import a dashboard from the Grafana gallery?
  3. How do Grafana dashboard variables work?
  4. What's the building block of a dashboard?
  5. When you update a dashboard that's published to grafana.com, does it change its ID?
  6. In Prometheus terms, what is a console?
  7. Why would you use Prometheus console templates?

Further reading