使用 Prometheus 和 Grafana 監控
如果您使用 Prometheus 和 Grafana 來儲存指標和視覺化資料,Solr 提供了 2 種解決方案來收集指標和其他資料
-
Prometheus 匯出器
-
具有 Prometheus 格式的指標 API
Prometheus 匯出器包含在完整的 Solr 發行版本中,位於 prometheus-exporter/
下。它不包含在 slim
Solr 發行版本中。
Prometheus 匯出器 (solr-exporter
) 允許使用者不僅監控來自 指標 API 的 Solr 指標,還監控來自 分面 的分面計數,以及對 Collections API 命令和 Ping 請求的回應。
指標 API 提供 Prometheus 回應寫入器,以原生方式輸出要抓取的 Solr 指標。它更有效率,並減少了執行 Prometheus 匯出器的需求,但代價是輸出的固定性,並且在可設定性方面不夠彈性。
Prometheus 匯出器
此圖提供了更詳細的視圖

執行 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
$ 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
> 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: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
的形式新增至所有指標,如果您有多個 Solr 叢集向同一個 Prometheus 實例回報,則可以使用它作為 Grafana 儀表板中的篩選器。如果省略此選項,則預設會使用baseUrl
或zkHost
的雜湊值作為 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 實例受到 基本驗證外掛程式、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.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
或/select
或admin/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
-
指標的類型,可以是
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.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 是否正常運作。

範例 Grafana 儀表板
若要使用 Grafana 進行視覺化,必須單獨下載和部署它。更多資訊可以在 Grafana 文件網站找到。Grafana 會取用來自許多來源的資料,包括您先前設定的 Prometheus 伺服器。
範例 Grafana 儀表板以以下 JSON 檔案的形式提供:prometheus-exporter/conf/grafana-solr-dashboard.json
。您可以將其與其他 Grafana 儀表板設定放在一起,並根據您為 solr-exporter
設定所做的任何自訂修改它。
您可以使用儀表板 ID 12456 ,透過「匯入」功能,直接 透過 grafana.com 匯入 Solr 儀表板。 |
此螢幕擷取畫面顯示其外觀

具有 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']