カテゴリー: テクノロジー

PrometheusとGrafanaでSolrの状態を可視化する

はじめに

Solr のリファレンスを見ると、Solr のモニタリングのために様々な手段が用意されていることがわかります。今回はその中で、Prometheus と Grafana を使った Solr ステータスの可視化を試してみました。

Prometheus のインストールと起動

ダウンロード

$ wget https://github.com/prometheus/prometheus/releases/download/v2.21.0/prometheus-2.21.0.linux-amd64.tar.gz
$ tar zxf prometheus-2.21.0.linux-amd64.tar.gz
$ cd prometheus-2.21.0.linux-amd64

設定

prometheus.yml に以下を追加

scrape_configs:
  - job_name: 'solr'
    static_configs:
      - targets: ['localhost:9854']

起動

./prometheus --config.file=prometheus.yml

prometheus-exporter の起動

prometheus-exporter は Solr と Prometheus との間に入って Solr のモニタリングデータをやり取りするためのプログラムです。ここでは Solr はすでに稼働中である前提です。

$ cd contrib/prometheus-exporter
$ ./bin/solr-exporter -p 9854 -b http://localhost:8983/solr -f ./conf/solr-exporter-config.xml -n 8

リファレンスではスタンドアロンモードの場合の起動方法と SolrCloud モードの場合の起動方法が紹介されていて、上記はスタンドアローンの場合です。SolrCloud でも内蔵の ZooKeeper を使っている場合はスタンドアローンの場合の起動方法を使わないとうまくいきませんでした。

prometheus 上での動作確認

http://localhost:9090/ にアクセスして
Status → Service Discovery で solr がリストに含まれていればOK。

Grafana のインストールと起動

$ wget https://dl.grafana.com/oss/release/grafana-7.2.0.linux-amd64.tar.gz
$ cd grafana-7.2.0
$ bin/grafana-server web

Grafana でダッシュボード作成

  1. http://localhost:3000/ にアクセスして admin:admin でログイン
  2. Data Source を追加
    1. Configuration → Data Sources
    2. Add data source で Prometheus を選択
    3. Settings のタブで URL に http://localhost:9090/ を入力して Save & Test を実行
  3. ダッシュボードの設定をインポート
    1. Dashboards → Manage で Manage 画面を開いて Import ボタンを押す
    2. Upload JSON file ボタンを押して contrib/prometheus-exporter/conf/grafana-solr-dashboard.json をアップロード
    3. Options 画面でダッシュボード名と Data Source を指定してインポート

うまくいけば以下のようなダッシュボードに各種のグラフが表示されるようになります。


AndroidのPDF対応電子書籍リーダーアプリレビュー

はじめに

PDFの技術書をAndroidタブレットで快適に読みたい。
フロー型の電子書籍であれば、スマートフォンでもそれなりに読みやすくできますが、PDFだとそうもいきません。6インチのスマホでページ全体を表示すると小さくて読めたものではありませんし、読める大きさまで拡大するとページの極一部しか表示範囲に入ってきません。10インチ以上であれば100%表示で問題無く読める大きさになりますが、普段の持ち運びの容易さを考えると8インチタブレットで可能な限り拡大して表示したい。

そういう視点で、以下のAndroid用のPDF対応電子書籍リーダーアプリをレビューしてみました。

電子書籍リーダーアプリに求める条件

電子書籍リーダーアプリに求める条件は以下の通りです。

  • PDFを読める
  • ページの拡大率と表示位置がページを送っても維持される
  • 目次、ブックマーク、検索といった基本機能が使いやすい
  • 背景色をセピアに変更できる

PDFを読める

今回のレビューの大前提です。

目次、ブックマーク、検索といった基本機能が使いやすい

おまけ機能程度にしかPDF対応していないリーダーアプリだと、そもそもこれらの機能がPDFで使えなかったりするので。

ページの拡大率と表示位置がページを送っても維持される

PDFを読むためのアプリとして重視するのはこの点です。

あくまでも筆者にとってはですが、8インチはPDFを読むには微妙な大きさで、ページ全体をそのまま表示すると少し文字が小さく感じられます。ページ外側の余白が表示されないところまで拡大すれば文字が程良い大きさになります。この読みやすい拡大率と表示位置をページ送りしても維持してくれないと、毎ページやるのは大変です。

背景色をセピアの変更できる

これは単純に好みの問題です。

レビュー

Acrobat Reader

Acrobat Readerは電子書籍リーダーアプリとはちょっと違いますが、PDFの本家ということで対象に加えています。

ページの拡大率と表示位置がページを送っても維持されるか

連続ページモードで表示することで何とか実現できます。

Acrobat Reader にはいくつかの表示モードがあります。

  • 単一ページ: 別のページに移ると拡大率がリセットされる
  • リーダー: レイアウトがかなり変わる。プログラムがちゃんと読めなくなるのでダメ
  • 連続ページ: 拡大率を維持したまま縦スクロールできる。ただし、縦スクロール中に横方向にずれがち
リーダーモード。微妙に残念な感じに表示が崩れる
拡大率100%の表示。8インチにとっては上下左右の余白がもったいない
上下がぎりぎり収まるところまで拡大。ちょっとの違いだが読みやすさが格段にアップ
連続ページモードでスクロール中に横方向に表示がずれたところ。横方向を固定できないのはストレス

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 折り畳まれた階層表示。項目をタップでページジャンプ。使いやすい
  • ブックマーク: ページ番号のみ表示。表示内容を変更することはできる
  • 検索: 検索結果の一覧表示無し。本文中のヒット箇所がハイライトされるので1個ずつ送っていく
目次
ブックマーク一覧
検索

背景色をセピアにできるか

  • できない

ReadEra

ページの拡大率と表示位置がページを送っても維持されるか

以下の設定にすることで、画面いっぱいにテキストを表示して縦スクロールで読めます。横方向にはスクロールしないのでほぼストレスフリーです。
ページ送り: 縦方向
ページ余白: オフ

ページ余白あり
ページ余白無し。横方向は固定で上下にスクロールするのみなので快適

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目まで隠さずに全部表示する方式。わかりやすいが、大きく移動したいときなどは面倒
  • ブックマーク: ページ番号とブックマーク名。表示内容を編集できる
  • 検索: ヒットした箇所がハイライトされて一覧表示される。検索履歴も残る。とても使いやすい
目次。小項目を折りたたんだりはできない
ブックマーク一覧
検索結果の一覧表示

背景色をセピアにできるか

  • できる

SideBooks

ページの拡大率と表示位置がページを送っても維持されるか

SideBooks では「余白設定」という機能でページの表示範囲を設定することができるので、これを利用します。

上下左右の余白を削って表示する範囲を指定できる

余白無しの表示をした状態で、縦スクロールではなくページをめくるように横方向にページ送りできます。少し残念なのは、ページ送りのアニメーション(めくり、またはスライド)をオフにできないため、ページ送りのテンポが少し悪いことです。

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目が折り畳まれて表示される方式。見やすい
  • ブックマーク: ページ名と冒頭の文章が一覧表示される
  • 検索: ページ数とキーワード前後の文章が表示される
目次
ブックマーク一覧
検索結果の一覧表示

背景色をセピアにできるか

  • できない(アプリケーションとしての背景色は変更できるが、PDF表示部分の色を変更できない)

Xodo

ページの拡大率と表示位置がページを送っても維持されるか

表示モードの選択で、単一ページ、垂直方向のスクロールをオンにすることで、拡大率を維持したま縦スクロールできます。Acrobat Reader と違って、縦スクロール中は横方向にスクロールしないようになってるので、ストレス無くページを送れます。さらに、縦スクロール中でなければ普通に横スクロールもできるといううまいUIになっています。

表示モードとして、単一ページ・垂直方向のスクロールを選択

また、Xodo にはページのトリミングという機能があり、ページの表示部分を指定できます(自動認識させるモードもあります)。ページのトリミングを適用した状態で縦スクロールをオフにすると、拡大率を維持したまま横方向にページ送りすることもできます。個人的には縦スクロールよりもアニメーション無しの横方向のページ送りの方が好きなので、この状態はかなり使い勝手が良いと感じました。

ページのトリミング

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目が折り畳まれて表示される方式
  • ブックマーク: ページ番号のみ表示。表示内容を変更することはできる
  • 検索: 検索結果の一覧表示無し。本文中のヒット箇所がハイライトされるので1個ずつ送っていく
目次
ブックマーク一覧
検索

背景色をセピアにできるか

  • できる

まとめ

最初に挙げた条件を満たして最も使いやすいと感じたのは Xodo のページトリミング+横方向ページ送りでした。次点が SideBooks の余白設定+横方向ページ送りとReadEraの拡大率固定+縦スクロールでした。

どのアプリも、目次・ブックマーク・検索といった基本的な機能はきちんと抑えられていて、これらの使い勝手に大きな差はありませんでした。

同じ電子書籍リーダーというくくりの中でも作り手によってアプリの個性は違ってくるもので、自分の重視する機能に焦点を当ててアプリの使い勝手を比べるのはとても面白い体験でした。


Solrのパッケージ管理機能がクラスタレベルのプラグインに対応しました

はじめに

以前の記事で紹介したパッケージ管理機能ではコレクションレベルのプラグインを管理できました。Solr 8.6 でクラスタレベルのプラグインにも対応しました。クラスタレベルのプラグインとは、クラスタを構成するノード毎に1個だけインスタンスを作るプラグインです。

リファレンスの説明だけでは分かりにくいところもあったので、使い方をまとめてみました。

リポジトリ登録まで

リポジトリを作成して Solr に登録 → インストール →デプロイという流れは同じなので、リポジトリ作成の詳細は前回の記事を参照してください。

プラグインのコード

プラグインが提供する API のエンドポイントに関する情報をアノテーションで記述するところがミソです。path の指定の中で $path-prefix という変数が参照されていますが、これは後述のリポジトリ定義(repository.json)で定義されます。

リポジトリ定義

クラスタレベルをサポートするにあたって type フィールドが追加されたようです。指定しない場合は collection になるので、クラスタレベルの場合は type: cluster を指定しなければうまくデプロイできません。

コレクションレベルのときと大きく異なるのは setup-command と uninstall-command です。それぞれ、以下の API リクエストに対応しています。

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "add": {
  "name":"myplugin",
  "class": "myplugin:jp.co.splout.solr.plugins.MyPlugin",
  "path-prefix" : "splout",
  "version": "1.0.0"
  }
}' http://localhost:8983/api/cluster/plugin

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "remove": "myplugin"
}' http://localhost:8983/api/cluster/plugin

verify-command をどう定義すべきかよく分からなかったので省略してありますが、これでも動くようです。

リポジトリ登録

$ bin/solr package add-repo MyPlugin http://localhost/solr/repo1
$ bin/solr package list-available 
Available packages:
-----
myplugin 		Cluster Level Plugin Example
	Version: 1.0.0
	Version: 1.1.0

インストール

-cluster オプションを指定します。

$ bin/solr package install myplugin:1.0.0 -cluster
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":56}}
myplugin installed.
$ bin/solr package install myplugin:1.1.0 -cluster
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":5}}
myplugin installed.

$ bin/solr package list-installed
Installed packages:
-----
{
  "name":"myplugin",
  "version":"1.0.0"}
{
  "name":"myplugin",
  "version":"1.1.0"}

デプロイ

ここでも -cluster オプションを指定します。

$ bin/solr package deploy myplugin:1.0.0 -cluster
Executing {"add":{"name":"myplugin","class":"myplugin:jp.co.splout.solr.plugins.MyPlugin","path-prefix":"splout","version":"1.0.0"}} for path:/api/cluster/plugin
Execute this command. (If you choose no, you can manually deploy/undeploy this plugin later) (y/n): 
y
1 cluster level plugins setup.
Deployed on [] and verified package: myplugin, version: 1.0.0
Deployment successful

clusterprops.json

クラスタレベルでデプロイされたプラグインの情報は、ZooKeeper に置かれた clusterprops.json から読み出せます。

$ curl http://localhost:8983/api/cluster/zk/data/clusterprops.json
{"plugin":{"myplugin":{
      "name":"myplugin",
      "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin",
      "version":"1.0.0",
      "path-prefix":"splout"}}}

プラグインのAPI呼び出し

ソースコードでエンドポイントのパスを “/$path-prefix/myplugin” と定義しました。repository.json で path-prefix を “splout” と定義したので、このプラグインの API は以下のように呼び出せます。

$ curl http://localhost:8983/api/splout/myplugin
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "myplugin.version":"1.0.0"}

アップデート

–update -cluster オプションを指定して deploy を実行します。

$ bin/solr package deploy myplugin:1.1.0 --update -cluster
Updating this plugin: org.apache.solr.client.solrj.request.beans.PluginMeta@aa370c48
Posting {"update": {
  "name":"myplugin",
  "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin",
  "version":"1.1.0",
  "path-prefix":"splout"}} to /api/cluster/plugin
1 cluster level plugins updated.
Deployed on [] and verified package: myplugin, version: 1.1.0
Deployment successful

動作確認します。

$ curl http://localhost:8983/api/splout/myplugin
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "myplugin.version":"1.1.0"}

「AirPods Pro」と「M3IETW2」を買った結果

Web会議や夜中近くのゲームで煩くならないようにBluetoohのイヤホンを購入しました。その過程で単純にBluetoohに対応ってだけ見ると失敗してしまうとわかったのでこちらにまとめました。

無線イヤホン

長くなるので最初に結論

  • Bluetoohはイヤホンである受信側と音を出す側の送信側のコーデックが一致していないと使えない
  • コーデックにはSBC < AAC < AptX < AptxLLなど他にも色々(音質はAptX > AptXLL)
  • PCやゲーム機など自前で送信する部分を持っていない場合はBlutoohのオーディオトランスミッターが必要

最初に購入したのはアクティブノイズキャンセリング目当てで「AirPods Pro」
対応コーデックはAAC

実際使ってみると設定なども簡単でアクティブノイズキャンセリングも評判通り世界が変わるレベルで音が聞こえない。ただゲームだとワンテンポずれて音が聞こえるので微妙、音ゲーは無理。他に家の中とかだとPCの動作音とかは小さくはあるが聞こえるので完全というわけではない(それでもほとんどは聞こえないレベル)
iPhoneの音楽再生だけとかリモートワークぐらいであれば設定も簡単なのでオススメ

次は対応コーデックや音質も気にして「MOMENTUM True Wireless 2」
対応コーデックはAptX

設定はAirPods Proに比べるとトランスミッターも原因ではあるが面倒・・・ただ一回設定したらあとはつけるだけなのであまり変わらない。音質はよく音ズレについては少し気になる程度でそこまで問題はないがゲーム目当てだとAptXLL対応の方を買えばよかったかも

数ヶ月立った結果

個人的にはノイズキャンセラー目当てでSonyの「WF-1000XM3」とAptXLL対応のイヤホンを別々で買った方が良かったかと後悔しましたが・・・数ヶ月経過した今振り返ってみると圧倒的に使ってる機会が少ない!
外:ドラクエウォークをいつもつけてるので不要
内でゲーム:夜中近くにゲームをすること自体がなくなったので不要
たまにWeb会議で使うぐらい・・・
完全にお荷物になっているわけではないが結果的にもっと安めのやつでも問題なかったかも


【Solr】管理UIのZK Status表示問題がSolr 8.6.1で解決しました

Solr 8.6.1 の Changelog を眺めていたら、以下のバグフィックスが含まれていることに気づきました。

SOLR-14671: Parsing dynamic ZK config sometimes cause NumberFormatException (janhoy)

これを読んで思い出したのが、以前の記事にも書いた、Solr 8.5 と ZooKeeper 3.6 の組み合わせだと Solr の管理UIで ZooKeeper のステータスが正しく表示されない問題です。このバグフィックスにより解決するのではないかと思い、試してみました。

前の記事で環境は作ってあるので、”image: zookeeper:3.5.7″ を “image:zookeeper:3.6″ に、”image: solr:8.5” のところを “image: solr:8.6.1” に変更するだけです。

Solr 8.5 と ZooKeeper 3.6 の組み合わせ。

Solr 8.6.1 と ZooKeeper 3.6 の組み合わせ。

予想通り解決しました。この問題に対処するためのバグフィックスだったようです。