使用 Prometheus 和 Grafana 进行监控

如果您使用 PrometheusGrafana 进行指标存储和数据可视化,Solr 包含一个 Prometheus 导出器来收集指标和其他数据。

Prometheus 导出器包含在完整的 Solr 发行版中,位于 `prometheus-exporter/` 下。它不包含在 `slim` Solr 发行版中。

Prometheus 导出器 (solr-exporter) 允许用户不仅监控来自 指标 API 的 Solr 指标,还监控来自 分面 和对 集合 API 命令和 Ping 请求的响应的分面计数。

此图形提供了更详细的视图

image
图 1. solr-exporter 图表

运行 `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
SolrCloud
$ 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
SolrCloud
> 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:9983localhost: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 集群。如果省略此选项,则默认情况下将使用 baseUrlzkHost 的哈希作为 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 实例受 基本身份验证插件SSLZooKeeper 访问控制 保护。

假设您有一个包含 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/selectadmin/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

指标的类型,可以是 COUNTERGAUGESUMMARYHISTOGRAMUNTYPED。有关更多详细信息,请参阅 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 是否协同工作

image
图 2. Prometheus Solr Ping 表达式

Grafana 示例仪表板

要将 Grafana 用于可视化,必须单独下载和部署它。更多信息可在 Grafana 文档 网站上找到。Grafana 使用来自许多来源的数据,包括您之前设置的 Prometheus 服务器。

Grafana 示例仪表板在以下 JSON 文件中提供:prometheus-exporter/conf/grafana-solr-dashboard.json。您可以将其与其他 Grafana 仪表板配置放在一起,并根据您对 solr-exporter 配置所做的任何自定义进行必要的修改。

您可以使用仪表板 ID 12456 通过 grafana.com 直接导入 Solr 仪表板。

此屏幕截图显示了它可能的样子

image
图 3. Grafana 仪表板