Beats 系列之 Metricbeat

Beats 系列之 Metricbeat

Metricbeat 可以定期收集操作系统和服务器的运行指标(CPU,内存,硬盘,IO,读写速度,进程等等),Metricbeat 可以将收集到的指标和数据发送到你指定的输出,比如:Elasticsearch,最终达成监视服务器的目标。

所需环境

  • Elasticsearch
  • Kibana
  • Linux
  • Metricbeat

Elasticsearch 的相关文章请参照我的博客《Elastic Stack 之 Elasticsearch》
Kibana 的相关文章请参照我的博客《Elastic Stack 之 Kibana》

如果你已经安装好了 Elasticsearch 和 Kibana,那么可以直接进入 Kibana,并访问 /app/kibana#/home/tutorial/dockerMetrics(这里我要监控的是 Docker ),根据安装步骤进行快速安装。

如果在第三步遇到了问题请看 4.1 遇到的坑

安装 Metricbeat

官方支持 yum、apt-get、homebrew 和 下载二进制可执行文件,具体可以参考官方文档

deb

1
2
$ curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.4.2-amd64.deb
$ sudo dpkg -i metricbeat-7.4.2-amd64.deb

rpm

1
2
$ curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.4.2-x86_64.rpm
$ sudo rpm -vi metricbeat-7.4.2-x86_64.rpm

macOS

1
2
3
4
5
$ curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.4.2-darwin-x86_64.tar.gz
$ tar xzvf metricbeat-7.4.2-darwin-x86_64.tar.gz
# 或者使用 Homebrew
$ brew tap elastic/tap
$ brew install elastic/tap/metricbeat-full

Docker

1
$ docker pull docker.elastic.co/beats/metricbeat:7.4.2

other

1
2
curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.4.2-linux-x86_64.tar.gz
tar xzvf metricbeat-7.4.2-linux-x86_64.tar.gz

配置 Metricbeat

因为我使用的是 RPM 包,所以安装好以后会自动创建 /etc/metricbeat/metricbeat.yml 和 Systemd Unit 文件。另外 Metricbeat 以模块的形式来集成了常用的服务监控模和模板,可以使用如下命令去查看:

1
$ metricbeat modules list

或者在 Kibana 上访问 /app/kibana#/home/tutorial_directory/metrics 进行查看所支持的 Modules。

目前所支持的 Metric moduels

开启模块

你可以通过命令的方式来开启模块:

1
$ metricbeat modules enable apache mysql

也可以通过在配置文件中添加配置项来开启(如果你不想自定义,到此已经可以了,下面将是冗长的配置说明):

1
2
3
4
5
6
7
8
9
10
11
12
13
metricbeat.modules:

#---------------------------- Apache Status Module ---------------------------
- module: apache
metricsets: ["status"]
period: 1s
hosts: ["http://127.0.0.1/"]

#---------------------------- MySQL Status Module ----------------------------
- module: mysql
metricsets: ["status"]
period: 2s
hosts: ["root@tcp(127.0.0.1:3306)/"]

period 参数为间隔周期, metricsets 参数为要获取的度量指标

更多有关度量指标的内容请参考官方文档
更多配置参数请参考官方文档

队列

队列用于缓冲获取的度量指标,当达到一定数值后将批量输出到对应的输出端,如 Elasticsearch、Logstash 等

1
2
3
4
queue.mem:
events: 4096
flush.min_events: 512
flush.timeout: 5s
  • events:配置内存中可容纳的事件数量;
  • flush.min_events:触发刷新的最小事件数量;
  • flush.timeout:刷新的最大等待时间。

更多队列配置请参考官方文档

输出

Metricbeat 支持的输出端有:

  • Elasticsearch
  • Logstash
  • Kafka
  • Redis
  • File
  • Console
  • Elastic Cloud

我这里直接输出到 Elasticsearch,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["https://elasticsearch:9002"]

# 设置索引的命名规则
index: "metricbeat-%{[agent.version]}-%{+yyyy.MM.dd}",

# 采用的协议,如果 hosts 里未声明 schema,这需要在这里声明
protocol: "https"

# 如果开启了验证,可以使用如下两项
# username: "elastic"
# password: "changeme"

# 设置请求参数
# parameters:

# 如果 Elasticsearch 是被反向代理,且不是`/`路径的话,需要配置该参数
# path:

# 设置请求头
# headers:

# 设置连接到 Elasticsearch 时的代理 host[:port]
# proxy_url: https:proxy.com

# 压缩级别,0为不压缩,1~9 数值越大,压缩比越高,但是越耗费 CPU
# compression_level: 1

# 是否转译 HTML
# escape_html: false

# 运行的 Worker 数量,默认值为 1
# worker: 1

# 用于配置索引规则的数组
# indices:

# 索引声明周期设置,请参考 https://www.elastic.co/guide/en/beats/metricbeat/7.4/ilm.html
# ilm:

# 流水线设置
# pipeline:

# 多个流水线设置
# pipelines:

# 最大尝试次数
# max_retries:

# 在一次请求中最大处理的事件数,默认是 50,该值的设置取决于实际环境,虽然批量处理可以一定程度提高性能,但是如果设置的过大,将导致 API 请求超时、连接终止并并最终导致吞吐量降低,如果将该值设为 0 将根据队列的设置,决定事件数量。
# bulk_max_size:

# 网络错误后尝试重新连接到 Elasticsearch 之前等待的秒数。
# backoff.init:

# 网络错误后尝试连接到 Elasticsearch 之前要等待的最大秒数。默认是60度。
# backoff.max:

# 请求超时时间
# timeout:

# 连接 ssl 配置请参考 https://www.elastic.co/guide/en/beats/metricbeat/7.4/configuration-ssl.html
# ssl:

更多配置文件设置请参考 https://www.elastic.co/guide/en/beats/metricbeat/7.4/metricbeat-reference-yml.html

迁移

在运行之前需要通过 Metricbeat 根据对应的索引模板生成索引和 Kibana 仪表盘。

1
$ metricbeat setup -e

-e 参数用于显示日志信息。

遇到的坑

因为我是通过 Nginx 反向代理 Elasticsearch 的,但是因为配置中将 proxy_pass 的值设置设置成了 http://elasticsearch:9200/ 导致出现如下错误:

1
2
$ metricbeat setup
Exiting: failed to create alias: {"error":"Incorrect HTTP method for uri [/<metricbeat-7.4.2-{now/d}-000001>] and method [PUT], allowed: [POST]","status":405}: 405 Method Not Allowed: {"error":"Incorrect HTTP method for uri [/<metricbeat-7.4.2-{now/d}-000001>] and method [PUT], allowed: [POST]","status":405}

需要将 http://elasticsearch:9200/ 改成 http://elasticsearch:9200

运行

1
$ sudo systemctl stop metricbeat

Docker

1
2
3
4
5
6
$ docker run --net="host" docker.elastic.co/beats/metricbeat:7.4.2 setup -e \
-E output.logstash.enabled=false \
-E output.elasticsearch.hosts=['elasticsearch:9200'] \
-E output.elasticsearch.username=metricbeat_internal \
-E output.elasticsearch.password=YOUR_PASSWORD \
-E setup.kibana.host=localhost:5601

在 Kibana 中查看

Discover

进入 Discover 页面,在左侧下拉列表中选取 metricbeat-*,效果如下图:

Metricbeat discover 效果图

Dashboards

进入 Metricbeat docker dashboard

Metricbeat docker dashboard 效果图

评论