使用 Prometheus 和 Grafana 監控

如果您使用 PrometheusGrafana 來儲存指標和視覺化資料,Solr 提供了 2 種解決方案來收集指標和其他資料

  • Prometheus 匯出器

  • 具有 Prometheus 格式的指標 API

Prometheus 匯出器包含在完整的 Solr 發行版本中,位於 prometheus-exporter/ 下。它不包含在 slim Solr 發行版本中。

Prometheus 匯出器 (solr-exporter) 允許使用者不僅監控來自 指標 API 的 Solr 指標,還監控來自 分面 的分面計數,以及對 Collections API 命令和 Ping 請求的回應。

指標 API 提供 Prometheus 回應寫入器,以原生方式輸出要抓取的 Solr 指標。它更有效率,並減少了執行 Prometheus 匯出器的需求,但代價是輸出的固定性,並且在可設定性方面不夠彈性。

Prometheus 匯出器

此圖提供了更詳細的視圖

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 公開的指標可以在指標端點看到:https://127.0.0.1:8983/solr/admin/metrics

請參閱下面根據您的作業系統和 Solr 操作模式的命令

  • Linux

  • Windows

使用者管理 / 單節點
$ cd prometheus-exporter
$ ./bin/solr-exporter -p 9854 -b https://127.0.0.1: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
使用者管理 / 單節點
> cd prometheus-exporter
> .\bin\solr-exporter.cmd -p 9854 -b https://127.0.0.1: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 匯出器的可用參數清單。所有參數都可以透過環境變數提供,而不是透過命令列提供。

h, --help

選用

預設值:無

顯示命令列說明和用法。

-p, --port, $PORT

選用

預設值:8989

Prometheus 將監聽新資料的埠。此埠將用於設定 Prometheus。它可以是您伺服器上尚未使用的任何埠。

-b, --baseurl, $SOLR_URL

選用

預設值:請參閱描述

當 Solr 在使用者管理的叢集或單節點安裝中執行時的 Solr 基礎 URL (例如 https://127.0.0.1:8983/solr)。如果您正在執行 SolrCloud,請勿指定此參數。如果未定義 -b 參數和 -z 參數,則預設值為 -b https://127.0.0.1:8983/solr

-z, --zk-host, $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 的形式新增至所有指標,如果您有多個 Solr 叢集向同一個 Prometheus 實例回報,則可以使用它作為 Grafana 儀表板中的篩選器。如果省略此選項,則預設會使用 baseUrlzkHost 的雜湊值作為 ID。

-u, --credentials, $CREDENTIALS

選用

預設值:無

username:password 格式指定憑證。範例:--credentials solr:SolrRocks

-ssl, --ssl-enabled, $SSL_ENABLED

選用

預設值:false

啟用與 Solr 的 mTLS 連線。需要以下環境變數:SOLR_SSL_KEY_STORE、SOLR_SSL_KEY_STORE_PASSWORD、SOLR_SSL_TRUST_STORE、SOLR_SSL_TRUST_STORE_PASSWORD。範例:--ssl-enabled。這些環境變數與 Solr 用於啟用 mTLS 的變數相同。

環境變數選項

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 CLI 中的 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.dev.org.tw/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.dev.org.tw/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.dev.org.tw/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.dev.org.tw/guide/solr/latest/deployment-guide/ping.html",
  "label_names": ["base_url","core"],
  "label_values": ["https://127.0.0.1:8983/solr","collection1"],
  "value": 1.0
}

請參閱以下 公開格式 章節,以瞭解每個屬性應包含哪些資訊,以及如何將上述範例轉換為 Prometheus 的範例。

公開格式

solr-exporter 會將 JSON 轉換為以下公開格式

# 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.dev.org.tw/guide/solr/latest/deployment-guide/ping.html
solr_ping{base_url="https://127.0.0.1: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 的指標。

您可以瀏覽至 https://127.0.0.1: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 儀表板

具有 Prometheus 格式的 Metrics API

透過利用 Metrics API 並將 wt 參數設定為 prometheus,可以直接從 Solr 原生取得 Prometheus 指標

localhost:8983/solr/admin/metrics?wt=prometheus

具有 prometheus 參數的 Metrics API 不提供任何可設定性,並且 Prometheus 輸出是固定的。任何指標彙總和/或篩選都必須在 Grafana 或 Prometheus 伺服器上完成。

Prometheus 設定

與 Prometheus Exporter 類似,需要為 Prometheus 伺服器設定 prometheus.yml,以便攝取指標。不同之處在於,它必須改為直接從 Solr 執行所在的每個主機/埠抓取具有 wt=prometheus 參數的 Metrics API,如此範例所示

scrape_configs:
  - job_name: 'solr'
    metrics_path: "/solr/admin/metrics"
    static_configs:
      - targets: ['localhost:8983', 'localhost:7574']
    params:
      wt: ['prometheus']