# grafana

## 1 下载

### 1.1 下载地址

{% embed url="<https://mirrors.huaweicloud.com/grafana/>" %}

### 1.2 版本

grafana-9.1.0

## 2 使用

### 2.1 数据源管理(Configuration)

### 2.2 仪表盘管理(Dashboards)

**DashBoard：**&#x4EEA;表盘，就像汽车仪表盘一样可以展示很多信息，包括车速，水箱温度等。Grafana 的 DashBoard 就是以各种图形的方式来展示从 Datasource 拿到的数据。

**Row：**&#x884C;，DashBoard 的基本组成单元，一个 DashBoard 可以包含很多个 row。一个 row 可以展示一种信息或者多种信息的组合，比如系统内存使用率，CPU 五分钟及十分钟平均负载等。所以在一个 DashBoard 上可以集中展示很多内容。

**Panel：**&#x9762;板，实际上就是 row 展示信息的方式，支持表格（table），列表（alert list），热图（Heatmap）等多种方式。

### 2.2.1 Query variable

变量允许更多交互式和动态仪表盘。通过变量大家就可以给 Dashboard 加搜索条件了。

操作步骤： Setting --> Variables --> New

#### **2.2.1.1** 变量类型

| 类型             | 描述                                                                                    |
| -------------- | ------------------------------------------------------------------------------------- |
| Datasource     | 此类型允许您快速更改整个仪表板的数据源。如果您在不同的环境中有多个数据源实例，则非常有用。                                         |
| Query          | 此变量类型允许您编写数据源查询，该查询通常返回度量标准名称，标记值或键的列表。例如，返回服务器名称，传感器ID或数据中心列表的查询。                    |
| Interval       | 此变量可表示时间跨度。不是按时间或日期直方图间隔对组进行硬编码，而是使用此类型的变量。                                           |
| Custom         | 使用逗号分隔列表手动定义变量选项。                                                                     |
| Constant       | 定义隐藏常量。对于要共享的仪表板的度量标准路径前缀很有用。在仪表板导出期间，常量变量将变为导入选项。                                    |
| Ad hoc filters | 非常特殊的变量，目前仅适用于某些数据源，InfluxDB和Elasticsearch。它允许您添加键/值过滤器，这些过滤器将自动添加到使用指定数据源的所有度量标准查询中。 |
| Text box       | 此变量类型将显示为带有可选默认值的自由文本输入字段。                                                            |

#### **2.2.1.2** 查询选项

此变量类型是最强大和最复杂的，因为它可以使用数据源查询动态获取其选项。

| 选项            | 描述                                                                                                                |
| ------------- | ----------------------------------------------------------------------------------------------------------------- |
| *Data source* | 查询的数据源目标。                                                                                                         |
| *Refresh*     | 控制何时更新变量选项列表（下拉列表中的值）。**在仪表板上加载**将减慢仪表板负载，因为在初始化仪表板之前需要完成变量查询。如果变量选项查询包含时间范围过滤器或取决于仪表板时间范围，则仅将此设置为“ **开时间范围更改”**。 |
| *Query*       | 数据源特定的查询表达式。                                                                                                      |
| *Regex*       | 正则表达式用于过滤或捕获数据源查询返回的名称的特定部分。可选的。                                                                                  |
| *Sort*        | 在下拉列表中定义选项的排序顺序。**已禁用**表示将使用数据源查询返回的选项顺序。                                                                         |

#### **2.2.1.3** ES 特定的表达式 Query 查询变量

Elasticsearch数据源支持两种类型的查询，您可以在\_Query\_变量的\_Query\_字段中使用这两种类型的查询。查询是使用自定义JSON字符串编写的。

| Query                                                                                                          | 描述                                                                  |
| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| *{“find”：“fields”，“type”：“keyword”}*                                                                           | 返回索引类型的字段名称列表`keyword`。                                             |
| *{“find”：“terms”，“field”：“@ hostname”，“size”：1000}*                                                            | 使用术语聚合返回字段的值列表。查询将用户当前仪表板时间范围作为查询的时间范围。                             |
| *{“find”：“terms”，“field”：“@ hostname”，“query”：'\<lucene query="" style="box-sizing: border-box;">“}\</lucene>* | 使用term aggregation＆和指定的lucene查询过滤器返回字段的值列表。查询将使用当前仪表板时间范围作为查询的时间范围。 |

术语查询的默认大小限制为 500。在查询中设置size属性以设置自定义限制。您可以在查询中使用其他变量。名为变量的示例查询定义`$host`。

```json
{"find": "terms", "field": "@hostname", "query": "@source:$source"}
```

在上面的示例中，我们使用`$source`在查询定义中命名的另一个变量。每当您通过下拉列表更改`$source`变量的当前值时，它将触发`$host`变量的更新，因此它现在只包含在本例中过滤的`@source`文档属性的主机名。

**(1) 查询成员字段**

```
语法：{"find": "fields", "type": "keyword"}
```

> * find：表示查什么东西
> * type：表示检索条件

如查询 long 类型的字段，可以如下处理

```
{
	"find": "fields",
	"type": "long"
}
```

什么时候用这个呢？

比如我想知道这个 es 中定义了哪些字段

比如在配置 Grafana 的变量时，可以使用它来做一些限定

**(2) 查询成员值**

```
语法： {"find": "terms", "field": "成员名", "size": 100}
```

> * find：后面跟上的是 terms， 表示查询具体的值
> * field: 用于限定需要查的成员
> * size：数量限制，可以不填

举例如下，查询所有虚机的 pool

```
{"find": "terms", "field": "pool.keyword", "size": 100}
```

使用范围：

常见于配置 Grafana 变量，配置一个虚机选择的变量，用于查看不同资源池虚机的表现情况

**(3) 条件查询成员值**

在前面的基础上加一下限定，比如一个 es 为多个应用使用，此时我只关注其中 app1 的大盘，此时配置服务器时，想加一个条件限定

```
语法：{"find": "terms", "field": "成员名", "query": "k:v"}
```

* query： lucence 查询语法，要求成员 k 的值为 v

<pre><code>eg1: 查询 server_name = app 的服务器 ip
<strong>{
</strong>	"find": "terms",
	"field": "server_ip.keyword",
	"query": "server_name:app"
}

eg2: 查询 pool 为 $pool 值的服务器 ip 列表 

{
	"find": "terms",
	"field": "server_ip.keyword",
	"query": "pool:$pool"
}
</code></pre>

### 2.2.2 Query Lucene 查询语法

配置大盘的查询条件，主要就是借助 lucene 语法来处理，接下来看一下常见的使用姿势

#### 2.2.2.1 条件等于查询

```
语法：field_name:filed_value
```

> * filed\_name: 字段名
> * field\_value: 需要检索的值

注意： 中间使用英文冒号分隔，表示条件命中

#### 2.2.2.2 不等于查询

如果希望不等于查询，主要使用下面这种方式

```
!(field_name:field_value)
```

#### 2.2.2.3 字段本身存在与否

```
_exists_:field_name:  查询包含 field 成员的记录
_missing_:field_name:  查询不包含 field 成员的记录
```

#### 2.2.2.4 通配符查询

在查询条件中，包含下面两个的表示使用通配查询

```
? 匹配单个字符
* 匹配 0 或多个字符
```

注意：？、\*不能用作第一个字符

比如我有个应用，部署多个环境，分别名为 app-cn, app-usa，现在想统计整个应用的情况，就可以使用下面这种正则方式

```
server_name: app-*
```

除了上面的示例，在实际的工作中，更常见的是 url 的统计，比如统计 /get/ 这个域名开头的请求

```
# 下面使用了转义
url: \/get\/*
```

#### 2.2.2.5 模糊搜索

在单次后面添加剂上 \~来实现模糊搜索，这种更适用于搜索业务场景，通常对于 grafana 的大盘配置，个人感觉不太实用 实用方式

```
// 可以匹配 app-cn
server_name: app-nc~
```

#### 2.2.2.6 范围搜索

除了前面的精确搜索，我们还可以进行范围搜索

```
语法： [ a TO b ],  {a TO B}
```

> * \[]： 闭包区间，包含左边的值
> * {}： 开区间，不包含两边值
> * a/b 如果为 \* 表示某一侧不限制范围

实例演示，查询 http 状态码为 4xx 的 case

```
http_code: [400 TO 499]
```

除了上面这种写法，也可以使用 > < 的方式，比如上面的写法等价

```
// >=400 之间不要加上空格
http_code: (>=400 AND <=499)
```

#### 2.2.2.7 逻辑操作

多条件组合，使用 AND/OR 来处理，这里的组合即可以表明多个 field，也可以是一个 field 的多个 value 组合 如多字段匹配：找出 app-cn 应用中状态码为 500 的记录

```
http_code:500 and server_name:app-cn
```

如多 value 匹配：找出状态码为 500, 503 的记录

```
http_code: (500 OR 503)
```

#### 2.2.2.8 转移字符

当查询条件中，包含下面字符中的一个时，需要使用注意

> * 特殊字符：+ - = && || > < ! ( ) { } \[ ] ^ " \~ \* ? : \ /
> * 转义修饰：/

如 url 的查询时，通常会用到转义

```
url: \/get\/info
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://meetbill.gitbook.io/butterfly-project-doc/project-third/grafana.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
