

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建您的第一个控制面板
<a name="getting-started-grafanaui"></a>

## 创建控制面板
<a name="create-a-dashboard"></a>

按照以下步骤，在 Grafana 控制台中创建控制面板。

**要创建您的第一个控制面板**

1. 选择左侧面板上的 \$1 图标，选择**创建控制面板**，然后选择**添加新控制面板**。

1. 在 “**新建 Dashboard/Edit 面板”** 视图中，选择 “**查询**” 选项卡。

1. 通过选择要查询的数据来源配置查询。例如，如果您将 **TestDB** 添加为数据来源，则会生成一个名为 Random Walk 控制面板的示例控制面板。

### 时间序列简介
<a name="introduction-to-time-series"></a>

 想象一下，您想知道外面的温度在一天中是如何变化的。您要每小时检查一次温度计，记下时间和当前温度。过一会之后，您就会得到与以下内容类似的数据。


|  时间  |  值  | 
| --- | --- | 
|  09:00  |  24°C  | 
|  10:00  |  26°C  | 
|  11:00  |  27°C  | 

 诸如此类的温度数据是*时间序列*的一个示例，即按时间排序的测量序列。表中的每一行都代表特定时间的一个单个测量值。

 当您想识别单个测量值时，表很有用，但它们可能会让人难以看到大局。时间序列更常见的可视化是*图形*，它将沿时间轴放置每个测量值。诸如图表之类的视觉表示可以更轻松地发现原本难以发现的数据模式和数据特征。

 其他时间序列示例包括：
+  CPU 和内存使用量 
+  传感器数据 
+  股市指数 

 虽然这些示例中的每一个示例都是一系列按时间顺序排列的测量值，但它们还具有其他共同的特性：
+  新数据以固定的间隔添加在末尾，例如，在 09:00、10:00、11:00 等时间每小时执行一次操作。
+  测量值在添加后很少更新。例如，昨天的温度不会更改。

 时间序列的功能很强大。它们允许您在任何时间点分析系统的状态，从而帮助您了解过去。时间序列可以告诉您，服务器在可用磁盘空间降至零后不久就崩溃了。

 时间序列还可以通过发现数据中的趋势来帮助您预测未来。例如，如果在过去的几个月中，注册用户数量每月增长 4％，则可以预测到年底您的用户群将有多大。

 有些时间序列的模式会在已知时段内重复发生。例如，白天的温度通常较高，然后在晚上降低。通过识别这些周期性或*季节性*时间序列，您可以对下一个周期做出自信的预测。如果您知道系统负载在每天 18:00 左右达到峰值，则可以在之前添加更多计算机。

#### 聚合时间序列
<a name="aggregating-time-series"></a>

 根据您要测量的内容，数据可能会有很大差异。如果您想与长于两次测量之间间隔的时间段进行比较，该怎么办？ 如果您每小时测量一次温度，每天最终会得到 24 个数据点。要比较历年 8 月份的温度，必须将 31 乘以 24 个数据点合并为一组。

 合并一组测量值的操作称为*聚合*。有以下几种方法可以聚合时间序列数据。下面是一些常见的方法：
+  **平均值**返回所有值的总和除以值的总数。
+  **最小值**和**最大值**返回集合中的最小值和最大值。
+  **总和**返回集合中所有值的总和 
+  **计数**返回集合中值的数量。

 例如，通过聚合一个月内的数据，可以确定 2017 年 8 月的平均温度比前一年温暖。如果您想看看哪个月份的温度最高，可以比较每个月的最高温度。

 如何聚合时间序列数据是一个重要的决定，这取决于您想用数据讲述怎样的故事。通常会使用不同的聚合以不同的方式可视化相同的时间序列数据。

#### 时间序列和监控
<a name="time-series-and-monitoring"></a>

 在 IT 行业中，收集时间序列数据通常是为了监控基础架构、硬件或应用程序事件之类的内容。机器生成的时间序列数据通常以较短的时间间隔收集，因此您可以在任何意外变化发生后立即做出反应。数据积累速度很快，因此拥有一种高效存储和查询数据的方法至关重要。因此，针对时间序列数据进行优化的数据库近年来越来越受欢迎。

##### 时间序列数据库
<a name="time-series-databases"></a>

 时间序列数据库（TSDB）是专门为时间序列数据设计的数据库。虽然可以使用任何常规数据库来存储测量值，但 TSDB 提供了一些有用的优化。

 Mod TSDBs ern 利用了这样一个事实，即测量值只会被追加，很少更新或删除。例如，每次测量的时间戳随时间变化不大，这会导致存储冗余数据。

 以下示例显示 Unix 时间戳序列。

```
1572524345, 1572524375, 1572524404, 1572524434, 1572524464
```

 从这些时间戳来看，它们都是从 `1572524` 开始，导致磁盘空间的使用不当。相反，您可以将每个后续时间戳存储为与第一个时间戳的差异或*增量*，如以下示例所示。

```
1572524345, +30, +29, +30, +30
```

您甚至可以通过计算这些增量的增量来更进一步优化，如以下示例所示。

```
1572524345, +30, -1, +1, +0
```

 如果定期进行测量，则大多数测量值 delta-of-deltas将为 0。由于进行了这样的优化，与其他数据库相比，占 TSDBs 用的空间要少得多。

 TSDB 的另一个特点是能够使用*标签*筛选测量值。每个数据点都标有一个标签，该标签添加了上下文信息，例如测量发生的位置。

 Grafana 支持 TSDBs 以下内容：
+  [Graphite](https://graphiteapp.org/) 
+  [InfluxDB](https://www.influxdata.com/products/influxdb-overview/) 
+  [Prometheus](https://prometheus.io/) 

  ```
  weather,location=us-midwest temperature=82 1465839830100400200
    |    -------------------- --------------  |
    |             |             |             |
    |             |             |             |
  +-----------+--------+-+---------+-+---------+
  |measurement|,tag_set| |field_set| |timestamp|
  +-----------+--------+-+---------+-+---------+
  ```

##### 收集时间序列数据
<a name="collecting-time-series-data"></a>

 现在您已经有地方可以存储您的时间序列，那么实际上是如何收集测量值的呢？ 要收集时间序列数据，通常需要在要监控的设备、计算机或实例上安装*收集器*。有些收集器是在考虑特定数据库的情况下开发的，有些则支持不同的输出目的地。

 下面是一些收集器的示例：
+  [collectd](https://collectd.org/) 
+  [statsd](https://github.com/statsd/statsd) 
+  [Prometheus exporters](https://prometheus.io/docs/instrumenting/exporters/) 
+  [Telegraf](https://github.com/influxdata/telegraf) 

 收集器要么将数据*推送*到数据库，要么让数据库从收集器中*提取*数据。每种方法都有自己的一些优缺点。


|   |  优点  |  缺点  | 
| --- | --- | --- | 
|  Push（推送）  |  更容易将数据复制到多个目标位置。 |  TSDB 无法控制发送多少数据。 | 
|  拉取  |  更好地控制数据摄取量和数据真实性。 |  防火墙或负载均衡器可能会使访问代理变得困难。 VPNs | 

 由于将每个测量值都写入数据库会导致效率低下，因此收集器会预先聚合数据并以定期间隔写入 TSDB。

### 时间序列维度
<a name="time-series-dimensions"></a>

 对于时间序列数据，数据通常是一组多个时间序列。许多 Grafana 数据来源都支持这种类型的数据。

 常见的情况是发出单个测量查询，并使用一个或多个附加属性作为维度。例如，您可以查询温度测量值和位置属性。在这种情况下，将从该单个查询返回多个序列，并且每个序列都具有唯一位置作为维度。

 要识别一组时间序列中的唯一序列，Grafana 在*标签*中存储维度。

#### 标签
<a name="labels"></a>

 Grafana 中的每个时间序列都有可选的标签。标签是一组用于标识维度的键值对。示例标签为 `{location=us}` 或 `{country=us,state=ma,city=boston}`。在一组时间序列中，每个序列都通过名称和标签组合进行标识。例如 `temperature {country=us,state=ma,city=boston}`。

 时间序列数据的不同来源具有本机存储的维度，或者具有能将数据提取到维度的常见存储模式。

 通常， TSDBs 本机支持维度。Prometheus 在*标签*中存储维度。在 Graphite 或 OpenTSDB 之 TSDBs 类中，改用*标签*这个词。

 在诸如 SQL 之类的表数据库中，这些维度通常是查询的 `GROUP BY` 参数。

#### 表格式的多个维度
<a name="multiple-dimensions-in-table-format"></a>

 在返回表响应的 SQL 或类似 SQL 的数据库中，其他维度通常是查询响应表中的列。

##### 单维度
<a name="single-dimension"></a>

 例如，请考虑类似于以下示例的查询：

```
SELECT BUCKET(StartTime, 1h), AVG(Temperature) AS Temp, Location FROM T
  GROUP BY BUCKET(StartTime, 1h), Location
  ORDER BY time asc
```

 该查询可能会返回一个包含三列的表。


|  StartTime  |  临时文件  |  位置  | 
| --- | --- | --- | 
|  09:00  |  24  |  LGA  | 
|  09:00  |  20  |  BOS  | 
|  10:00  |  26  |  LGA  | 
|  10:00  |  22  |  BOS  | 

 表格式为*长*格式的时间序列，也称为*高*。它有重复的时间戳，并在“位置”中重复值。在这种情况下，集合中的两个时间序列将被标识为 `Temp {Location=LGA}` 和 `Temp {Location=BOS}`。

 使用以下维度从集合中提取单个时间序列：
+ 时间类型列 `StartTime` 作为时间序列的时间索引
+ 以数字键入的列 `Temp` 作为序列名称
+ 用于生成标签的字符串类型 `Location` 列的名称和值，例如 location=LGA

##### 多个维度
<a name="multiple-dimensions"></a>

 如果更新了查询以按多个字符串列的格式进行选择和分组（例如，`GROUP BY BUCKET(StartTime, 1h), Location, Sensor`），则会添加一个额外的维度。


|  StartTime  |  临时文件  |  位置  |  传感器  | 
| --- | --- | --- | --- | 
|  09:00  |  24  |  LGA  |  A  | 
|  09:00  |  24.1  |  LGA  |  B  | 
|  09:00  |  20  |  BOS  |  A  | 
|  09:00  |  20.2  |  BOS  |  B  | 
|  10:00  |  26  |  LGA  |  A  | 
|  10:00  |  26.1  |  LGA  |  B  | 
|  10:00  |  22  |  BOS  |  A  | 
|  10:00  |  22.2  |  BOS  |  B  | 

 在本例中，代表维度的标签有两个键，这两个键基于两个字符串类型的列 `Location` 和 `Sensor`。数据将产生四个序列：
+ `Temp {Location=LGA,Sensor=A}`
+ `Temp {Location=LGA,Sensor=B}`
+ `Temp {Location=BOS,Sensor=A}`
+ `Temp {Location=BOS,Sensor=B}`

**注意**  
 **注意：**在 Grafana 中，不会以映射到多个警报的方式支持多个维度。相反，它们被视为单个警报的多个条件。

##### 多个值
<a name="multiple-values"></a>

 对于类似 SQL 的数据来源，可以选择多个数值列，无论是否使用其他字符串列作为维度；例如，`AVG(Temperature) AS AvgTemp, MAX(Temperature) AS MaxTemp`。如果与多个维度相结合，则可以生成多个序列。目前，选择多个值的目的在于进行可视化。

### 直方图和热图简介
<a name="introduction-to-histograms-and-heatmaps"></a>

 直方图是数字数据分布的图形表示。它将值分组为存储桶（有时也称为数据桶）。然后，它会计算每个存储桶中有多少个值。

 直方图不绘制实际值，而是绘制存储桶。每个条形代表一个存储桶，条形高度表示落入该存储桶间隔内的值的频率（例如计数）。

 直方图仅查看特定时间范围内的*值分布*。直方图的问题在于，您看不到分布随时间推移而出现的任何趋势或变化。这就是热图变得有用的地方。

#### 热图
<a name="heatmaps"></a>

 *热图*就像一段时间内的直方图，其中每个时间片都代表自己的直方图。它不使用条形高度来表示频率，而是使用单元格，对单元格的着色与存储桶中值的数量成比。

#### 预存入存储桶的数据
<a name="pre-bucketed-data"></a>

 许多数据来源都支持随时间变化的直方图，包括以下内容：
+ Amazon OpenSearch 服务（使用直方图存储桶聚合）
+ Prometheus（[直方图](https://prometheus.io/docs/concepts/metric_types/#histogram)指标类型和*格式化为*选项设置为**热图**）

通常，您可以使用任何数据来源，这些数据来源返回名称表示存储桶绑定的序列，或者返回按绑定升序排序的序列。

#### 原始数据与聚合数据
<a name="raw-data-vs-aggregated"></a>

 如果您将热图与常规时间序列数据（未预先放入存储桶）一起使用，请务必记住，您的数据通常由时间序列后端进行聚合。大多数时间序列查询不返回原始样本数据。相反，它们包括按时间间隔或 maxDataPoints 限制分组以及聚合函数（通常是平均值）。

 这取决于您查询的时间范围。重要的一点是，Grafana 执行的直方图分桶可能是在已经聚合和平均的数据上进行的。要获得更准确的热图，最好在指标收集期间进行分桶 OpenSearch，或者将数据存储在其他支持对原始数据进行直方图存储桶的数据源中。

 如果您在查询中按时间移除或降低分组（或提高 maxDataPoints）以返回更多数据点，则您的热图会更加准确。但这也会给您的 CPU 和内存带来沉重的负担。如果数据点的数量变得异常地大，则可能会导致停顿和崩溃。