使用 Prometheus 和 Grafana 进行监控
如果您使用 Prometheus 和 Grafana 进行指标存储和数据可视化,Solr 包含一个 Prometheus 导出器来收集指标和其他数据。
Prometheus 导出器包含在完整的 Solr 发行版中,位于 `prometheus-exporter/` 下。它不包含在 `slim` Solr 发行版中。
此图形提供了更详细的视图
运行 `solr-exporter` 有三个方面
-
修改 `solr-exporter-config.xml` 以定义要收集的数据。Solr 有一个您可以使用的默认配置,但如果您想在首次运行导出器之前对其进行修改,请参阅以下部分 导出器配置。
-
从 Solr 中启动导出器。请参阅以下部分 启动导出器。
-
修改您的 Prometheus 配置以侦听正确的端口。请参阅以下部分 Prometheus 配置
启动导出器
您可以通过从 `prometheus-exporter/` 目录运行 `./bin/solr-exporter` (Linux) 或 `.\bin\solr-exporter.cmd` (Windows) 来启动 `solr-exporter`。
solr-exporter
公开的指标可以在指标端点看到:http://localhost:8983/solr/admin/metrics
。
根据您的操作系统和 Solr 操作模式,请参阅以下命令
Linux
$ cd prometheus-exporter
$ ./bin/solr-exporter -p 9854 -b http://localhost:8983/solr -f ./conf/solr-exporter-config.xml -n 8
$ cd prometheus-exporter
$ ./bin/solr-exporter -p 9854 -z localhost:2181/solr -f ./conf/solr-exporter-config.xml -n 16
Windows
> cd prometheus-exporter
> .\bin\solr-exporter.cmd -p 9854 -b http://localhost:8983/solr -f .\conf\solr-exporter-config.xml -n 8
> cd prometheus-exporter
> .\bin\solr-exporter -p 9854 -z localhost:2181/solr -f .\conf\solr-exporter-config.xml -n 16
命令行参数
Prometheus Exporter 可用参数列表。所有参数都可以通过环境变量提供,而不是通过命令行提供。
h
,--help
-
可选
默认值:无
显示命令行帮助和用法。
-p
,--port
,$PORT
-
可选
默认值:
8989
Prometheus 将侦听新数据的端口。此端口将用于配置 Prometheus。它可以是服务器上尚未使用的任何端口。
-b
,--baseurl
,$SOLR_URL
-
可选
默认值:请参阅说明
当 Solr 在用户管理集群或单节点安装中运行时,Solr 基本 URL(例如
http://localhost:8983/solr
)。如果您正在运行 SolrCloud,请不要指定此参数。如果未定义-b
参数或-z
参数,则默认值为-b http://localhost:8983/solr
。 -z
,--zkhost
,$ZK_HOST
-
可选
默认值:请参阅说明
当 Solr 正在运行 SolrCloud 时,ZooKeeper 连接字符串(例如
localhost:9983
或localhost:2181/solr
)。如果您正在运行用户管理集群或单节点安装,请不要指定此参数。如果未定义-b
参数或-z
参数,则使用-b
参数的默认值。 -f
,--config-file
,$CONFIG_FILE
-
可选
默认值:
prometheus-exporter/conf/solr-exporter-config.xml
定义要读取的 Solr 指标的配置文件的路径。
-n
,--num-threads
,$NUM_THREADS
-
可选
默认值:
1
线程数。
solr-exporter
为对 Solr 的请求创建线程池。可以通过增加线程数来改善请求延迟。 -s
,--scrape-interval
,$SCRAPE_INTERVAL
-
可选
默认值:
60
秒从 Solr 收集指标之间的秒数。
solr-exporter
每隔几秒从 Solr 收集指标,由此设置控制。无论 Prometheus 配置为从该工具拉取指标的频率如何,这些指标都会被缓存并返回。可以通过减少抓取间隔来提高指标的新鲜度,但不要将其设置为非常低的值,因为指标收集可能很昂贵,并且可以执行任意搜索来 ping Solr。 -i
,--cluster-id
,$CLUSTER_ID
-
可选
默认值:请参阅说明
要监控的集群的唯一 ID。此 ID 将作为标签
cluster_id
添加到所有指标中,并且可以在 Grafana 仪表板中用作过滤器,如果您操作多个向同一 Prometheus 实例报告的 Solr 集群。如果省略此选项,则默认情况下将使用baseUrl
或zkHost
的哈希作为 ID。 -u
,--credentials
,$CREDENTIALS
-
可选
默认值:无
以
username:password
格式指定凭据。示例:--credentials solr:SolrRocks
。
环境变量选项
Prometheus Exporter 提供的 ./bin
脚本通过以下环境变量支持使用自定义 Java 选项
JAVA_HEAP
-
可选
默认值:
512m
设置初始 (
Xms
) 和最大 (Xmx
) Java 堆大小。 JAVA_MEM
-
可选
默认值:无
自定义 Java 内存设置(例如,
-Xms1g -Xmx2g
)。如果提供了JAVA_HEAP
,则忽略此设置。 GC_TUNE
-
可选
默认值:
-XX:+UseG1GC
自定义 Java 垃圾回收设置。
JAVA_OPTS
-
可选
默认值:无
其他 JVM 选项。
ZK_CREDS_AND_ACLS
-
可选
默认值:无
用于连接到受 ACL 保护的 ZooKeeper 主机的凭据。有关在此变量中包含哪些内容的更多信息,请参阅部分 Solr 脚本中的 ZooKeeper ACL 或以下示例 从受保护的 SolrCloud 获取指标。
CLASSPATH_PREFIX
-
可选
默认值:无
启动
solr-exporter
时加载其他库的位置。
使用 ./bin
脚本时,所有 命令行参数 都可以通过环境变量提供。
从受保护的 SolrCloud 获取指标
可以使用与使用 SolrJ 的其他客户端类似的方式,将 SolrCloud 安全配置注入到 solr-exporter
中,方法是使用环境变量。这是可能的,因为主脚本会获取 环境变量选项 并将它们传递给 Java 进程。
以下示例假定 SolrCloud 实例受 基本身份验证插件、SSL 和 ZooKeeper 访问控制 保护。
假设您有一个包含 Solr 基本身份验证凭据的文件 basicauth.properties
httpBasicAuthUser=myUser httpBasicAuthPassword=myPassword
然后,您可以按如下方式启动 Exporter(Linux)。
$ cd prometheus-exporter
$ export JAVA_OPTS="-Djavax.net.ssl.trustStore=truststore.p12 -Djavax.net.ssl.trustStorePassword=truststorePassword -Dsolr.httpclient.builder.factory=org.apache.solr.client.solrj.impl.PreemptiveBasicAuthClientBuilderFactory -Dsolr.httpclient.config=basicauth.properties"
$ export ZK_CREDS_AND_ACLS="-DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider -DzkDigestUsername=readonly-user -DzkDigestPassword=zkUserPassword"
$ export CLASSPATH_PREFIX="../server/solr-webapp/webapp/WEB-INF/lib/commons-codec-1.11.jar"
$ ./bin/solr-exporter -p 9854 -z zk1:2181,zk2:2181,zk3:2181 -f ./conf/solr-exporter-config.xml -n 16
- 注意
-
Exporter 需要
commons-codec
库才能使用 SSL/基本身份验证,但不会随附该库。因此,该示例从 Solr Web 应用程序中重复使用了该库。当然,您可以使用不同的来源。
Exporter 配置
solr-exporter
的配置定义了从 Solr 获取的数据。这包括指标,但也可以包括对 PingRequestHandler、Collections API 和对任何查询请求处理程序的查询。
默认示例配置位于 prometheus-exporter/conf/solr-exporter-config.xml
中。以下是其略微缩短的版本
<config>
<rules>
<ping>
<lst name="request">
<lst name="query">
<str name="path">/admin/ping</str>
</lst>
<arr name="jsonQueries">
<str>
. as $object | $object |
(if $object.status == "OK" then 1.0 else 0.0 end) as $value |
{
name : "solr_ping",
type : "GAUGE",
help : "See following URL: https://solr.net.cn/guide/solr/latest/deployment-guide/ping.html",
label_names : [],
label_values : [],
value : $value
}
</str>
</arr>
</lst>
</ping>
<metrics>
<lst name="request">
<lst name="query">
<str name="path">/admin/metrics</str>
<lst name="params">
<str name="group">all</str>
<str name="type">all</str>
<str name="prefix"></str>
<str name="property"></str>
</lst>
</lst>
<arr name="jsonQueries">
<!--
jetty metrics
-->
<str>
.metrics["solr.jetty"] | to_entries | .[] | select(.key | startswith("org.eclipse.jetty.server.handler.DefaultHandler")) | select(.key | endswith("xx-responses")) as $object |
$object.key | split(".") | last | split("-") | first as $status |
$object.value.count as $value |
{
name : "solr_metrics_jetty_response_total",
type : "COUNTER",
help : "See following URL: https://solr.net.cn/guide/solr/latest/deployment-guide/metrics-reporting.html",
label_names : ["status"],
label_values : [$status],
value : $value
}
</str>
...
</arr>
</lst>
</metrics>
<collections>
<lst name="request">
<lst name="query">
<str name="path">/admin/collections</str>
<lst name="params">
<str name="action">CLUSTERSTATUS</str>
</lst>
</lst>
<arr name="jsonQueries">
<str>
.cluster.live_nodes | length as $value|
{
name : "solr_collections_live_nodes",
type : "GAUGE",
help : "See following URL: https://solr.net.cn/guide/solr/latest/deployment-guide/cluster-node-management.html#clusterstatus",
label_names : [],
label_values : [],
value : $value
}
</str>
...
</arr>
</lst>
</collections>
<search>
<lst name="request">
<lst name="query">
<str name="collection">collection1</str>
<str name="path">/select</str>
<lst name="params">
<str name="q">*:*</str>
<str name="start">0</str>
<str name="rows">0</str>
<str name="json.facet">
{
category: {
type: terms,
field: cat
}
}
</str>
</lst>
</lst>
<arr name="jsonQueries">
<str>
.facets.category.buckets[] as $object |
$object.val as $term |
$object.count as $value |
{
name : "solr_facets_category",
type : "GAUGE",
help : "Category facets",
label_names : ["term"],
label_values : [$term],
value : $value
}
</str>
</arr>
</lst>
</search>
</rules>
</config>
配置标签和元素
solr-exporter
通过根据配置文件中的定义向 Solr 发出请求、抓取响应并将其转换为 Prometheus 可以理解的 JSON 结构来工作。配置文件定义了要请求的元素、如何抓取这些元素以及在 JSON 模板中放置提取数据的目标位置。
solr-exporter
配置文件始终以两个简单的元素开头和结尾
<config>
<rules>
</rules>
</config>
在这些元素之间,定义了 solr-exporter
应请求的数据。有几种可能的请求类型
<ping>
|
抓取对 Ping 请求的响应。 |
<metrics>
|
抓取对 Metrics API 请求的响应。 |
<collections>
|
抓取对 Collections API 请求的响应。 |
<search>
|
抓取对 查询 请求的响应。 |
在每种类型中,我们需要定义查询以及如何处理响应。为此,我们定义了两个附加元素
<query>
-
定义用于请求的查询参数。此部分使用几个附加属性来定义查询
collection
-
可选
默认值:无
针对其发出查询的集合。仅与 SolrCloud 集群一起使用。
core
-
可选
默认值:无
针对其发出查询的核心。仅与用户管理的集群或单节点安装一起使用。
path
-
可选
默认值:无
将发送请求的查询端点的路径。示例包括
admin/metrics
或/select
或admin/collections
。 params
-
可选
默认值:无
其他查询参数。这些参数会根据请求类型和端点而有所不同。例如,如果使用 Metrics 端点,则可以添加参数以将查询限制为特定组和/或前缀。如果你使用 Collections API,则要使用的命令将是一个参数。
<jsonQueries>
-
这是一个数组,用于定义一个或多个 jq 语法中的 JSON 查询。有关如何构建这些查询的更多详细信息,请参阅 jq 用户手册。
jq 查询必须以以下格式输出 JSON
{ "name": "solr_ping", "type": "GAUGE", "help": "See following URL: https://solr.net.cn/guide/solr/latest/deployment-guide/ping.html", "label_names": ["base_url","core"], "label_values": ["http://localhost:8983/solr","collection1"], "value": 1.0 }
请参阅以下部分 Exposition Format,了解有关应将哪些信息放入每个属性的信息,以及上述示例如何针对 Prometheus 进行转换的示例。
Exposition Format
solr-exporter
将 JSON 转换为以下 exposition 格式
# TYPE <name> <type>
# HELP <name> <help>
<name>{<label_names[0]>=<label_values[0]>,<label_names[1]>=<labelvalues[1]>,...} <value>
应设置以下参数
name
-
要设置的指标名称。有关更多详细信息,请参阅 Prometheus 命名最佳实践。
type
-
指标的类型,可以是
COUNTER
、GAUGE
、SUMMARY
、HISTOGRAM
或UNTYPED
。有关更多详细信息,请参阅 Prometheus 指标类型。 help
-
指标的帮助文本。
label_names
-
指标的标签名称。有关更多详细信息,请参阅 Prometheus 命名最佳实践。
label_values
-
指标的标签值。有关更多详细信息,请参阅 Prometheus 命名最佳实践。
value
-
指标的值。值必须设置为 Double 类型。
例如,solr-exporter
将上一部分中的 JSON 转换为以下内容
# TYPE solr_ping gauge
# HELP solr_ping See following URL: https://solr.net.cn/guide/solr/latest/deployment-guide/ping.html
solr_ping{base_url="http://localhost:8983/solr",core="collection1"} 1.0
Prometheus 配置
Prometheus 是您需要下载和部署的独立服务器。更多信息可在 Prometheus 入门 页面上找到。
为了让 Prometheus 了解 solr-exporter
,必须将侦听地址添加到 Prometheus 服务器的 prometheus.yml
配置文件,如下例所示
scrape_configs:
- job_name: 'solr'
static_configs:
- targets: ['localhost:9854']
如果您已经有一个 scrape_configs
部分,则可以在同一部分中添加 job_name
和其他值。
当您将设置应用于 Prometheus 时,它将开始从 solr-exporter
中提取 Solr 指标。
您可以通过浏览 http://localhost:9090 并对 Prometheus GUI 中的 solr_ping
指标执行查询来测试 Prometheus 服务器、solr-exporter
和 Solr 是否协同工作
Grafana 示例仪表板
要将 Grafana 用于可视化,必须单独下载和部署它。更多信息可在 Grafana 文档 网站上找到。Grafana 使用来自许多来源的数据,包括您之前设置的 Prometheus 服务器。
Grafana 示例仪表板在以下 JSON 文件中提供:prometheus-exporter/conf/grafana-solr-dashboard.json
。您可以将其与其他 Grafana 仪表板配置放在一起,并根据您对 solr-exporter
配置所做的任何自定义进行必要的修改。
您可以使用仪表板 ID 12456 通过 grafana.com 直接导入 Solr 仪表板。 |
此屏幕截图显示了它可能的样子