本指南将向您介绍多目标导出器模式。为了实现这一点,我们将:
我们所说的多目标导出器模式是指一种特定的设计,其中:
此模式仅用于某些导出器,例如 blackbox 和 SNMP 导出器。
原因是我们要么不能在目标上运行导出器,例如,使用 SNMP 的网络设备,要么我们明确地对距离感兴趣,例如,从我们网络外部的特定点到网站的延迟和可达性,这是 blackbox 导出器的常见用例。
多目标导出器在其环境方面具有灵活性,并且可以通过多种方式运行。作为常规程序、在容器中、作为后台服务、在裸机上、在虚拟机上。因为它们被查询并通过网络进行查询,所以它们需要适当的开放端口。否则它们就很节俭。
现在让我们自己尝试一下!
使用 Docker 在终端中运行此命令来启动 blackbox 导出器容器。根据您的系统配置,您可能需要在命令前加上 sudo
docker run -p 9115:9115 prom/blackbox-exporter
您应该看到一些日志行,如果一切顺利,最后一行应该报告 msg="Listening on address"
,如下所示
level=info ts=2018-10-17T15:41:35.4997596Z caller=main.go:324 msg="Listening on address" address=:9115
有两种查询方式:
/metrics
中可用。/probe
)处可用。这很可能是您在使用多目标导出器时主要感兴趣的内容。您可以使用另一个终端中的 curl 手动尝试第一种查询类型,或使用此链接
curl 'localhost:9115/metrics'
响应应如下所示:
# HELP blackbox_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which blackbox_exporter was built.
# TYPE blackbox_exporter_build_info gauge
blackbox_exporter_build_info{branch="HEAD",goversion="go1.10",revision="4a22506cf0cf139d9b2f9cde099f0012d9fcabde",version="0.12.0"} 1
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 9
[…]
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 0.05
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 7
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 7.8848e+06
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.54115492874e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 1.5609856e+07
这些是 Prometheus 格式的指标。它们来自导出器的检测,并告诉我们导出器在运行时自身的状态。这称为白盒监控,在日常运维实践中非常有用。如果您好奇,请尝试我们关于如何检测您自己的应用程序的指南。
对于第二种查询类型,我们需要在 HTTP GET 请求中提供目标和模块作为参数。目标是 URI 或 IP,并且模块必须在导出器的配置中定义。blackbox 导出器容器附带一个有意义的默认配置。
我们将使用目标 prometheus.io
和预定义的模块 http_2xx
。它告诉导出器发出一个 GET 请求,就像您访问 prometheus.io
时浏览器会做的那样,并期望 200 OK 响应。
您现在可以使用 curl 在终端中告诉您的 blackbox 导出器查询 prometheus.io
curl 'localhost:9115/probe?target=prometheus.io&module=http_2xx'
这将返回很多指标
# HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds
# TYPE probe_dns_lookup_time_seconds gauge
probe_dns_lookup_time_seconds 0.061087943
# HELP probe_duration_seconds Returns how long the probe took to complete in seconds
# TYPE probe_duration_seconds gauge
probe_duration_seconds 0.065580871
# HELP probe_failed_due_to_regex Indicates if probe failed due to regex
# TYPE probe_failed_due_to_regex gauge
probe_failed_due_to_regex 0
# HELP probe_http_content_length Length of http content response
# TYPE probe_http_content_length gauge
probe_http_content_length 0
# HELP probe_http_duration_seconds Duration of http request by phase, summed over all redirects
# TYPE probe_http_duration_seconds gauge
probe_http_duration_seconds{phase="connect"} 0
probe_http_duration_seconds{phase="processing"} 0
probe_http_duration_seconds{phase="resolve"} 0.061087943
probe_http_duration_seconds{phase="tls"} 0
probe_http_duration_seconds{phase="transfer"} 0
# HELP probe_http_redirects The number of redirects
# TYPE probe_http_redirects gauge
probe_http_redirects 0
# HELP probe_http_ssl Indicates if SSL was used for the final redirect
# TYPE probe_http_ssl gauge
probe_http_ssl 0
# HELP probe_http_status_code Response HTTP status code
# TYPE probe_http_status_code gauge
probe_http_status_code 0
# HELP probe_http_version Returns the version of HTTP of the probe response
# TYPE probe_http_version gauge
probe_http_version 0
# HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6
# TYPE probe_ip_protocol gauge
probe_ip_protocol 6
# HELP probe_success Displays whether or not the probe was a success
# TYPE probe_success gauge
probe_success 0
请注意,几乎所有指标的值都为 0
。最后一个读取 probe_success 0
。这意味着探测器无法成功访问 prometheus.io
。原因隐藏在值为 6
的指标 probe_ip_protocol
中。默认情况下,探测器使用 IPv6,除非另有说明。但是 Docker 守护程序会阻止 IPv6,除非另有说明。因此,在 Docker 容器中运行的 blackbox 导出器无法通过 IPv6 连接。
我们现在可以告诉 Docker 允许 IPv6 或 blackbox 导出器使用 IPv4。在现实世界中,两者都有意义,并且经常会出现“应该做什么?”问题的答案是“视情况而定”。因为这是一份导出器指南,我们将更改导出器并借此机会配置自定义模块。
这些模块在 docker 容器内名为 config.yml
的文件中预定义,该文件是 github 存储库中 blackbox.yml 的副本。
我们将复制此文件,调整它以满足我们自己的需求,并告诉导出器使用我们的配置文件而不是容器中包含的配置文件。
首先使用 curl 或浏览器下载该文件
curl -o blackbox.yml https://raw.githubusercontent.com/prometheus/blackbox_exporter/master/blackbox.yml
在编辑器中打开它。前几行如下所示:
modules:
http_2xx:
prober: http
http_post_2xx:
prober: http
http:
method: POST
YAML 使用空格缩进表示层次结构,因此您可以识别出定义了两个名为 http_2xx
和 http_post_2xx
的 modules
,并且它们都具有探测器 http
,并且对于其中一个,方法值被专门设置为 POST
。
您现在将通过将探测器 http
的 preferred_ip_protocol
显式设置为字符串 ip4
来更改模块 http_2xx
。
modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
http_post_2xx:
prober: http
http:
method: POST
如果您想了解有关可用探测器和选项的更多信息,请查看文档。
现在我们需要告诉 blackbox 导出器使用我们新更改的文件。您可以使用标志 --config.file="blackbox.yml"
来做到这一点。但是因为我们正在使用 Docker,所以我们首先必须使用 --mount
命令使此文件在容器内可用。
blackbox.yml
所在的目录。您可以通过单击菜单栏中的小 Docker 鲸鱼,然后单击 首选项
->文件共享
->+
来做到这一点。之后,按 应用并重新启动
。首先,通过更改到其终端并按 ctrl+c
来停止旧容器。确保您位于包含 blackbox.yml
的目录中。然后运行此命令。它很长,但我们会解释它
docker \
run -p 9115:9115 \
--mount type=bind,source="$(pwd)"/blackbox.yml,target=/blackbox.yml,readonly \
prom/blackbox-exporter \
--config.file="/blackbox.yml"
使用此命令,您告诉 docker
:
run
一个容器,其中容器外部的端口 9115
映射到容器内部的端口 9115
。mount
从您当前目录($(pwd)
表示打印工作目录)将文件 blackbox.yml
以 只读
模式装载到 /blackbox.yml
中。prom/blackbox-exporter
。--config.file
运行 blackbox-exporter,告诉它使用 /blackbox.yml
作为配置文件。如果一切正确,您应该看到类似这样的内容
level=info ts=2018-10-19T12:40:51.650462756Z caller=main.go:213 msg="Starting blackbox_exporter" version="(version=0.12.0, branch=HEAD, revision=4a22506cf0cf139d9b2f9cde099f0012d9fcabde)"
level=info ts=2018-10-19T12:40:51.653357722Z caller=main.go:220 msg="Loaded config file"
level=info ts=2018-10-19T12:40:51.65349635Z caller=main.go:324 msg="Listening on address" address=:9115
现在您可以在终端中尝试我们新的使用 IPv4 的模块 http_2xx
curl 'localhost:9115/probe?target=prometheus.io&module=http_2xx'
它应该返回如下所示的 Prometheus 指标
# HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds
# TYPE probe_dns_lookup_time_seconds gauge
probe_dns_lookup_time_seconds 0.02679421
# HELP probe_duration_seconds Returns how long the probe took to complete in seconds
# TYPE probe_duration_seconds gauge
probe_duration_seconds 0.461619124
# HELP probe_failed_due_to_regex Indicates if probe failed due to regex
# TYPE probe_failed_due_to_regex gauge
probe_failed_due_to_regex 0
# HELP probe_http_content_length Length of http content response
# TYPE probe_http_content_length gauge
probe_http_content_length -1
# HELP probe_http_duration_seconds Duration of http request by phase, summed over all redirects
# TYPE probe_http_duration_seconds gauge
probe_http_duration_seconds{phase="connect"} 0.062076202999999996
probe_http_duration_seconds{phase="processing"} 0.23481845699999998
probe_http_duration_seconds{phase="resolve"} 0.029594103
probe_http_duration_seconds{phase="tls"} 0.163420078
probe_http_duration_seconds{phase="transfer"} 0.002243199
# HELP probe_http_redirects The number of redirects
# TYPE probe_http_redirects gauge
probe_http_redirects 1
# HELP probe_http_ssl Indicates if SSL was used for the final redirect
# TYPE probe_http_ssl gauge
probe_http_ssl 1
# HELP probe_http_status_code Response HTTP status code
# TYPE probe_http_status_code gauge
probe_http_status_code 200
# HELP probe_http_uncompressed_body_length Length of uncompressed response body
# TYPE probe_http_uncompressed_body_length gauge
probe_http_uncompressed_body_length 14516
# HELP probe_http_version Returns the version of HTTP of the probe response
# TYPE probe_http_version gauge
probe_http_version 1.1
# HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6
# TYPE probe_ip_protocol gauge
probe_ip_protocol 4
# HELP probe_ssl_earliest_cert_expiry Returns earliest SSL cert expiry in unixtime
# TYPE probe_ssl_earliest_cert_expiry gauge
probe_ssl_earliest_cert_expiry 1.581897599e+09
# HELP probe_success Displays whether or not the probe was a success
# TYPE probe_success gauge
probe_success 1
# HELP probe_tls_version_info Contains the TLS version used
# TYPE probe_tls_version_info gauge
probe_tls_version_info{version="TLS 1.3"} 1
您可以看到探测成功,并获得许多有用的指标,例如每个阶段的延迟、状态代码、ssl 状态或 Unix 时间中的证书过期时间。
黑盒导出器还在 localhost:9115 提供了一个小型的 Web 界面,供您查看最近的几次探测、已加载的配置和调试信息。它甚至还提供了一个直接链接到探测 prometheus.io
的链接。如果您想知道为什么某些东西不起作用,这会很方便。
到目前为止,一切顺利。恭喜您。黑盒导出器工作正常,您可以手动告诉它查询远程目标。您快要完成了。现在您需要告诉 Prometheus 为我们执行查询。
下面您会找到一个最简的 Prometheus 配置。它告诉 Prometheus 像我们 之前 使用 curl 'localhost:9115/metrics'
一样,抓取导出器本身。
localhost:9115
,而必须使用 host.docker.internal:9115
。这与在这些操作系统上用于实现 Docker 的虚拟机有关。您不应该在生产环境中使用此方法。Linux 的 prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: blackbox # To get metrics about the exporter itself
metrics_path: /metrics
static_configs:
- targets:
- localhost:9115
macOS 和 Windows 的 prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: blackbox # To get metrics about the exporter itself
metrics_path: /metrics
static_configs:
- targets:
- host.docker.internal:9115
现在运行一个 Prometheus 容器,并告诉它从上面挂载我们的配置文件。由于从容器访问主机网络的方式,您需要在 Linux 上使用与 MacOS 和 Windows 上略有不同的命令。
在 Linux 上运行 Prometheus(请勿在生产环境中使用 --network="host"
)
docker \
run --network="host"\
--mount type=bind,source="$(pwd)"/prometheus.yml,target=/prometheus.yml,readonly \
prom/prometheus \
--config.file="/prometheus.yml"
在 MacOS 和 Windows 上运行 Prometheus
docker \
run -p 9090:9090 \
--mount type=bind,source="$(pwd)"/prometheus.yml,target=/prometheus.yml,readonly \
prom/prometheus \
--config.file="/prometheus.yml"
此命令的工作方式类似于 使用配置文件运行黑盒导出器。
如果一切正常,您应该能够转到 localhost:9090/targets,并在 blackbox
下看到一个状态为绿色的 UP
的端点。如果您得到一个红色的 DOWN
,请确保您 上面 启动的黑盒导出器仍在运行。如果您什么都没看到或看到黄色的 UNKNOWN
,那么您的速度真的很快,需要多等待几秒钟,然后再重新加载浏览器的选项卡。
要告诉 Prometheus 查询 "localhost:9115/probe?target=prometheus.io&module=http_2xx"
,您需要添加另一个抓取作业 blackbox-http
,其中将 metrics_path
设置为 /probe
,并将参数设置在 Prometheus 配置文件 prometheus.yml
中的 params:
下。
global:
scrape_interval: 5s
scrape_configs:
- job_name: blackbox # To get metrics about the exporter itself
metrics_path: /metrics
static_configs:
- targets:
- localhost:9115 # For Windows and macOS replace with - host.docker.internal:9115
- job_name: blackbox-http # To get metrics about the exporter’s targets
metrics_path: /probe
params:
module: [http_2xx]
target: [prometheus.io]
static_configs:
- targets:
- localhost:9115 # For Windows and macOS replace with - host.docker.internal:9115
保存配置文件后,切换到您的 Prometheus Docker 容器的终端,并通过按 ctrl+C
停止它,然后使用现有的 命令 再次启动它以重新加载配置。
终端应返回消息 "Server is ready to receive web requests."
,几秒钟后,您应该开始在 您的 Prometheus 中看到彩色图表。
这可行,但它有一些缺点
instance
标签的值是黑盒导出器的地址,这在技术上是正确的,但不是我们感兴趣的内容。要解决此问题,我们将使用 重新标记。重新标记在这里很有用,因为在后台,Prometheus 中的许多内容都是使用内部标签配置的。细节很复杂,不在本指南的范围内。因此,我们将把自己限制在必要的范围内。但是,如果您想了解更多信息,请查看此 演讲。目前,如果您理解这一点就足够了
__
开头的标签在抓取后都会被删除。大多数内部标签都以 __
开头。__param_<name>
的内部标签。这些标签会为抓取请求设置键为 <name>
的 URL 参数。__address__
,它由 static_configs
下的 targets
设置,其值是抓取请求的主机名。默认情况下,它稍后用于设置标签 instance
的值,该标签附加到每个指标,并告诉您指标来自哪里。这是您将用来执行此操作的配置。如果一次性理解有点多,请不要担心,我们将逐步进行
global:
scrape_interval: 5s
scrape_configs:
- job_name: blackbox # To get metrics about the exporter itself
metrics_path: /metrics
static_configs:
- targets:
- localhost:9115 # For Windows and macOS replace with - host.docker.internal:9115
- job_name: blackbox-http # To get metrics about the exporter’s targets
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://prometheus.ac.cn # Target to probe with http
- https://prometheus.ac.cn # Target to probe with https
- http://example.com:8080 # Target to probe with http on port 8080
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115 # The blackbox exporter’s real hostname:port. For Windows and macOS replace with - host.docker.internal:9115
与 上次配置 相比,有哪些新的内容?
params
不再包含 target
。相反,我们在 static configs:
targets
下添加了实际目标。我们还使用了多个目标,因为我们现在可以这样做
params:
module: [http_2xx]
static_configs:
- targets:
- https://prometheus.ac.cn # Target to probe with http
- https://prometheus.ac.cn # Target to probe with https
- http://example.com:8080 # Target to probe with http on port 8080
relabel_configs
包含新的重新标记规则
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115 # The blackbox exporter’s real hostname:port. For Windows and macOS replace with - host.docker.internal:9115
在应用重新标记规则之前,Prometheus 发出的请求的 URI 看起来像这样:"https://prometheus.ac.cn/probe?module=http_2xx"
。重新标记后,它将看起来像这样 "https://127.0.0.1:9115/probe?target=https://prometheus.ac.cn&module=http_2xx"
。
现在让我们探讨一下每个规则是如何做到这一点的
首先,我们从标签 __address__
(其中包含来自 targets
的值)中获取值,并将它们写入新的标签 __param_target
,这将向 Prometheus 抓取请求添加一个参数 target
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
之后,我们假想的 Prometheus 请求 URI 现在具有一个目标参数:"https://prometheus.ac.cn/probe?target=https://prometheus.ac.cn&module=http_2xx"
。
然后,我们从标签 __param_target
中获取值,并使用这些值创建一个标签实例。
relabel_configs:
- source_labels: [__param_target]
target_label: instance
我们的请求不会改变,但是从我们的请求返回的指标现在将带有标签 instance="https://prometheus.ac.cn"
。
之后,我们将值 localhost:9115
(我们的导出器的 URI)写入标签 __address__
。这将用作 Prometheus 抓取请求的主机名和端口。以便它查询导出器而不是目标 URI 本身。
relabel_configs:
- target_label: __address__
replacement: localhost:9115 # The blackbox exporter’s real hostname:port. For Windows and macOS replace with - host.docker.internal:9115
我们的请求现在是 "localhost:9115/probe?target=https://prometheus.ac.cn&module=http_2xx"
。这样,我们就可以在那里拥有实际目标,将它们作为 instance
标签值,同时让 Prometheus 向黑盒导出器发出请求。
人们经常将这些与特定的服务发现结合使用。有关更多信息,请查看 配置文档。使用它们没有问题,因为它们就像 static_configs
下定义的 targets
一样写入 __address__
标签。
就是这样。重新启动 Prometheus Docker 容器,然后查看您的 指标。请注意,您选择了实际收集指标的时间段。
在本指南中,您了解了多目标导出器模式的工作原理、如何使用自定义模块运行黑盒导出器以及如何使用重新标记配置 Prometheus 以使用探测器标签抓取指标。
本文档是 开源的。请通过提交问题或拉取请求来帮助改进它。