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

PrometheusとAlertmanagerでSolrの異常を通知する

はじめに

前回の記事では Prometheus と Grafana による可視化を採り上げました。今回はさらに Alertmanager を組み合わせてメール通知を試してみました。

前回の続きで Solr と Prometheus と prometheus-exporter が動いている前提です。

Alertmanager のインストールと起動

$ wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
$ tar zxf alertmanager-0.21.0.linux-amd64.tar.gz
$ cd alertmanager-0.21.0.linux-amd64
$ ./alertmanager --config.file=alertmanager.yml

今回はメール通知の動作確認用の alertmanager.yml を作成しました。メール以外にも Slack や Pushover など、様々な通知手段が用意されています。

global:
  resolve_timeout: 5m
  smtp_from: 'solr-alert@example.com'
  smtp_smarthost: 'localhost:25'

route:
  receiver: 'mail_test'

receivers:
- name: 'mail_test'
  email_configs:
    - to: 'alert-receiver@example.com'
      require_tls: false

Prometheus の設定

prometheus.yml でルールファイルを設定

rule_files:
  - "alert_rules.yml"

alert_rules.yml の内容

Solr の Ping API が正常応答しなかったら通知する設定です。

groups:
- name: sample_alert
  rules:
  - alert: solr_test_alert
    expr: absent(solr_ping) == 1
    for: 1m
    labels:
      severity: test
      test_type: SampleAlert
    annotations:
      summary: 'Solr Ping Error'

試してみる

正常な状態では、Prometheus の Alerts のページは以下のような表示です。

ここで Solr のプロセスを落としてみます。しばらく待つと異常を検知してPending状態に入ります。

このまま回復しなければメール通知されます。

受信したメールの内容です。

おわりに

簡単な例でメール通知できるところまで設定してみました。

Prometheus と Alertmanager の組み合わせでは、promQL による条件の記述や振り分けルールの設定などを使ってかなり複雑なこともできるようになっており、Solr 自体の監視だけでなく、インデックスの内容に基づいたアラートも可能です。


Solrのprometheus-exporterにメトリクスを追加する

はじめに

prometheus-exporter に付属の設定ファイル(contrib/prometheus-exporter/conf/solr-exporter-config.xml)には様々なメトリクスの設定例が記載されており、これとGrafanaを組み合わせれば、かなり便利なダッシュボードが作れます。

この記事では、デフォルトの設定に無いメトリクスを自分で追加する場合の設定方法を試してみました。

solr-exporter-config.xmlの内容

SolrのどのAPIを使うかに応じて4つのセクションが用意されています。

  • <ping> PingRequestHandler へのリクエストを利用します
  • <metrics> Metrics APIを利用します
  • <collections> Collections APIを利用します
  • <search> 検索リクエストを利用します

たとえば <ping> セクションは以下のように定義されています。

    <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://lucene.apache.org/solr/guide/ping.html",                       
              label_names  : [],                                                                                        
              label_values : [],                                                                                        
              value        : $value                                                                                     
            }                                                                                                           
          </str>
        </arr>
      </lst>
    </ping>

name=”path” でリクエスト先のパスを指定しています。

ping リクエストの応答をどのように加工するのかを指定しているのが、name=”jsonQueries” の下の str タグに囲まれた領域です。jq クエリが使われているので jq コマンドで動作確認できます。

$ curl --user solr:SolrRocks -s 'http://localhost:8983/solr/test_shard1_replica_n1/admin/ping/' |jq '            . 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://lucene.apache.org/solr/guide/ping.html",
>               label_names  : [],
>               label_values : [],
>               value        : $value
>             }
> '
{
  "name": "solr_ping",
  "type": "GAUGE",
  "help": "See following URL: https://lucene.apache.org/solr/guide/ping.html",
  "label_names": [],
  "label_values": [],
  "value": 1
}

searchメトリクスを追加してみる

単純な例ですが、全件検索(‘*:*’による検索)のヒット件数をグラフにしてみます。

solr-exporter-config2.xml に以下を追加します。

    <search>
      <lst name="request">
        <lst name="query">
          <str name="collection">wikipedia</str>
          <str name="path">/select</str>
          <lst name="params">
            <str name="q">*:*</str>
            <str name="start">0</str>
            <str name="rows">0</str>
          </lst>
        </lst>
        <arr name="jsonQueries">
          <str>
            .response.numFound as $value |
            {
              name         : "solr_num_wikipedia_entry",
              type         : "GAUGE",
              help         : "number of wikipedia entry",
              label_names  : [],
              label_values : [],
              value        : $value
            }
          </str>
        </arr>
      </lst>
    </search>

ここで指定した内容は、実際には以下のような検索リクエストになります。

$ curl --user solr:SolrRocks -s 'http://localhost:8983/solr/wikipedia/select?q=*:*&start=0&rows=0'
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":0,
    "params":{
      "q":"*:*",
      "start":"0",
      "rows":"0"}},
  "response":{"numFound":2264810,"start":0,"numFoundExact":true,"docs":[]
  }}

jq クエリによる加工結果は以下の通りです。

$ curl --user solr:SolrRocks -s 'http://localhost:8983/solr/wikipedia/select?q=*:*&start=0&rows=0' |jq '.response.numFound as $value |
>             {
>               name         : "solr_num_wikipedia_entry",
>               type         : "GAUGE",
>               help         : "number of wikipedia entry",
>               label_names  : [],
>               label_values : [],
>               value        : $value
>             }
> '
{
  "name": "solr_num_wikipedia_entry",
  "type": "GAUGE",
  "help": "number of wikipedia entry",
  "label_names": [],
  "label_values": [],
  "value": 2264810
}

prometheus-exporter によって以下のような Prometheus フォーマットに変換されます。

$ curl -s http://localhost:9854/|grep solr_num_wikipedia_entry
# HELP solr_num_wikipedia_entry number of wikipedia entry
# TYPE solr_num_wikipedia_entry gauge
solr_num_wikipedia_entry{zk_host="localhost:9983",} 2264810.0

ここまで来れば、グラフ化するのは簡単です。下の画像は、データインポートハンドラでWikipediaの日本語全記事を投入したときの、記事数の変化をグラフ化したものです。


Macでスタイル(書式)なしペーストを簡単に実行したい

こんにちわ。
リエです。

PCでお仕事しているとショートカットキーをよく使います。
その中でも軍を抜いて使うのが「command + C(コピー)」と「command + V(ペースト)」です。


スタイル(書式)*以下スタイル なしでペーストしてほしいのですが、Macで「command + V」ペーストをすると、コピー元のスタイルを引き継いでしまうことがあります。

これが非常に嫌なのです!!!
なんでスタイルなしでペーストしてくれないのかといつも思っていました。

もちろんスタイルなしでペーストする方法はあります。
それは「ペーストしてスタイルを合わせる」を実行するのですが、ショートカットキーが「command + shift + option + V」とかなり多い。指つるわ。

もっと簡単な方法はないかなとググると素敵な記事発見。
素敵記事:https://decoy284.net/mac-command-v-paste-and-match-style/#:~:text=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%E3%82%92%E9%96%8B%E3%81%8D,%E3%81%A7%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

設定方法は以下です。
※私はめんどくさがりなので、画像無しでの説明です。
素敵記事は画像ありで説明してくださっているので、画像ありで設定方法を見たい方はそちらをご参照ください。
1.システム環境設定を開き、キーボードを選択。
2.ショートカットタブのアプリケーションに移動し、「+」をクリック。
3.メニュータイトルに「ペーストしてスタイルを合わせる」を入力、キーボードショートカットで「command + V」を押し、追加をクリック。


たったの3ステップで完了です。
これでスタイルなしでペーストしてくれるようになり、小さなストレスが無くなりました。

記事作成者さんありがとうございました👏


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の拡大率固定+縦スクロールでした。

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

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