2026/06/03(水)OpenWrtのメトリクスとログをGrafanaで雑に見れるようにした

投稿日:

OpenWrtのメトリクスやログをUbuntu側のGrafanaで見れるようにするまで。

メトリクスの取得にはPrometheus、ログはLokiを使っている。

確認環境

監視する側

Env Ver
Ubuntu 24.04.3 LTS
Prometheus 3.5.0
Grafana v12.1.1
Loki 3.5.9

監視される側

Env Ver
OpenWrt 24.10.0
Prometheus 3.5.0
prometheus-node-exporter-lua 2025.07.15-r1
prometheus-node-exporter-lua-nat_traffic 2025.07.15-r1
prometheus-node-exporter-lua-netstat 2025.07.15-r1
prometheus-node-exporter-lua-openwrt 2025.07.15-r1
prometheus-node-exporter-lua-thermal 2025.07.15-r1
perl 5.40.0-r2
perlbase-json-pp 5.40.0-r2
perlbase-http-tiny 5.40.0-r2
perl-time-moment 0.44.5.40-r1

Prometheusでメトリクスを取得してGrafanaで見れるようにする

ほぼOpenWRT | Grafana Labsに書いてある通り。

  1. 必要なパッケージをインストールする
    opkg update
    opkg install \
       prometheus-node-exporter-lua \
       prometheus-node-exporter-lua-nat_traffic \
       prometheus-node-exporter-lua-netstat \
       prometheus-node-exporter-lua-openwrt \
       prometheus-node-exporter-lua-thermal
    
  2. /etc/config/prometheus-node-exporter-luaを以下のように編集する
    config prometheus-node-exporter-lua 'main'
    +         option listen_interface 'lan'
    -         option listen_interface 'loopback'
            option listen_port '9100'
            #option cert '/etc/uhttpd.crt'
            #option key '/etc/uhttpd.key'
    
  3. prometheus-collectors/filesystem.luaprometheus-collectors/meminfo.luaを拾ってきて/usr/lib/lua/prometheus-collectorsに配置する
  4. サービスを再起動
    /etc/init.d/prometheus-node-exporter-lua restart
    
  5. /etc/prometheus/prometheus.yaml
    - job_name: "OpenWRT"
      static_configs:
        - targets: ['xxxx:xxxx:xxxx:xxxx::1:9100']
    
  6. Prometheus再起動
    sudo systemctl restart prometheus.service
    
  7. 取れるメトリクスの一覧
    curl 'http://[xxxx:xxxx:xxxx:xxxx::1]:9100/metrics'
    
  8. Grafanaのダッシュボードを作成しID: 18153を取り込む
  9. WiFi関係使ってないので全消し
  10. Used SWAPのQueriesを以下のように書き換えて0除算でエラーが出ないようにする
    (
      (
        (node_memory_SwapTotal_bytes{instance=~"$node:$port",job=~"$job"} - node_memory_SwapFree_bytes{instance=~"$node:$port",job=~"$job"})
        /
        (node_memory_SwapTotal_bytes{instance=~"$node:$port",job=~"$job"} > 0)
      ) * 100
    )
    or
    (node_memory_SwapTotal_bytes{instance=~"$node:$port",job=~"$job"} * 0)
    

細かい部分の整理はまた追々として、いい感じに見れるようになった気がする。

ログをLokiに送る

Loki exporter for OpenWRTが動かないので自作した。

  1. OpenWrtのログをLokiに送るやつを拾ってくる
  2. インストール方法にある通りにファイルを配置、設定ファイルをいじる
  3. Lokiにログが飛んでればOK
    • ログが飛んでいない場合は/tmp/openwrt-loki.errの中身を見てエラーがないか見る

一旦こんな感じで見れるようになった。

既知の問題

複数行のエラーログがLoki上で別のログになる

親子関係を作ってないせい。Claude Opus 4.8には難しいようだったので、そのうち作る。

おまけ:Lokiにログを投げる方法

POST /loki/api/v1/pushを叩けばよい。ペイロードは以下の書式。

LokiのAPIペイロード

{
  "streams": [
    {
      "stream": {
        "label": "value"
      },
      "values": [
          [ "<unix epoch in nanoseconds>", "<log line>", { "hoge": "aaaa", "fuga": "1234" } ],
          [ "<unix epoch in nanoseconds>", "<log line>", { "hoge": "bbbb", "fuga": "2345" } ]
      ]
    }
  ]
}

ペイロードの意味合い

nginxのログはペイロードしか入ってなかったりするがどうやって実現してるのか不明。もしかするとvalues[1]にJSONを突っ込んでるのかもしれない。

項目 意味合い
streams よくわかってない
stream この配下に検索用のラベルをぶら下げる。jobとかlevelhostとかを入れとくとよいと思われる
values ログの本体を入れる
values[0] ナノ秒まで入ったEPOCH
values[1] ログ本文の文字列
values[2] オプションペイロード。KEY=VALUE

おまけ:Loki exporter for OpenWRTのエラーログ

あのシェルスクリプトを読む気が起きなかったので、なぜこうなっているかはわからない。

BOOT=0 /bin/ash /usr/bin/loki_exporter
openwrt-loki-exporter/v1.0.6-0-gd20fb55-20260322-23413663016 started with BOOT=0
/usr/bin/loki_exporter: line 257: malformed ?: operator

あとがき

去年の8月にはやろうとしていたものの、そのままズルズルと長らく放置していたOpenWrtの監視周りだが、このままではいけないということで、一旦は雑に整備した。

大変雑なのでログ周りは機能するかも怪しいし、私以外が使えるようにも作ってない。最低限動くとかそんなレベル。LLMが書いたコードもろくにレビューしていないので、動いている原理さえ不明だ。

幸い全部で300行そこらなのでおいおい読んで理解していきたいとは思う。

基本原理はlogread -fした結果をいい感じに取り込んでLokiにたたきつけているだけのはずだが、この「いい感じ」が難しく、重くなっていると考えている。例えばログの取得漏れや、重複取得などを考慮しないといけないので、なんかそこら辺をいい感じにやってもらうようにLLMに指示したら一気に重くなった。ベースのコードは私が書いていたのだが、全くの別物になってしまった。

しかし去年の8月にしかかって放置している部分はできていないので、またそこは追々やっていきたいところだ。具体的には今回の対応はサーバー側でメトリクスを見る対応なのでネットワークが死ぬと終わってしまう。そこでルーター側でも簡易に見れるのを作ろうという計画がある。

しかしルーター側はスペックがしょぼいので大したことはできないし、ストレージがeMMCなので頻繁な書き込みもできないから、普段はメモリストレージ(/tmp)に置いておき、定期的に永続化のためにeMMCに吐き出すというのをやろうとしている。

そしてeMMCに端に吐き出すのもパフォーマンスと寿命の影響があるのでファイルシステムレベルでの対策をしてやろうみたいなことを考えていたが、尻切れとんぼのままなので、何とかしていきたいところだ。

2026/06/01(月)フレッツ光クロスでフルポート使えるIPv4が取れるか調べた

フレッツ光クロスとフレッツ光ネクスト隼のコスト比較をしてみたの続きのような記事。

結論から言うと、現実的は難しい。金があれば取れる。

フレッツ光クロス x OCNでの対応状況

取り敢えず私はOCNユーザーなので、まずはOCNの対応状況から調べてみることにした。

OCN IPv6インターネット接続|光回線 | OCNお客さまサポートによると次のようにあり、使えないことが分かった。

(OCN 光 with フレッツ クロス / OCN インターネット 10ギガはPPPoE接続できません。)

またOCNサポートに問い合わせたところ、OCNインターネット10ギガはIPoEのみ対応で、方式はMAP-E、OCNバーチャルコネクトとのことだった。そしてPPPoEは使えず、方式上フルポート使えるIPv4の提供はないと言う話だった。

兵庫県下におけるフレッツ光クロスで従来型IPv4の提供があるISPについて

フレッツ光 対応プロバイダー検索|NTT西日本公式に一覧があるが、対応しているのはIIJのみ。

IIJ IPv6 FiberAccess/F サービス タイプIPoEであればIPv4アドレスの固定割り当てが取れるそうだが、月額14,000円~ということで、到底支払える値段ではない。

IIJのフレッツ光ネクストはIPv6 IPoE、動的IPv4アドレスの場合は2,200円とのことなので、恐らくフレッツ光クロスにするとIPv4が高くなるのだと思う。

あとがき

今回の調査では、前段に外部のリバースプロキシやそれに類するものを置かず自宅サーバーを運用する場合にIPv4を切る必要が出てくることが判明した。

前回の調査ではフレッツ光クロスにすると年3万円コスト増になることが分かっているため、これと合わせるとクロスに移行する場合、年3万の負担増とIPv4でのサーバーサービスを終了しないとならないことが分かった。

中々悩ましい結果だが、回線が逼迫しているわけではないので、OpenWrtのメトリクスなどをもっとちゃんととって、必要が出たあたりで移行できたらいいなとは思う。今でも偶に不審な速度になることはあるので、それの裏が取れたら移行してもいいだろうとは思った。

2026/06/01(月)自鯖を別OSにマイグレーションするかどうか問題

投稿日:

最近自鯖を別環境に移行するかどうかについて少し考えている。

現在はUbuntuで運用しており、記憶が確かならUbuntu 16.04 LTSから24.04 LTSまで使ってきているが、幾つかの問題を感じている。別にクリティカルでも何でもないので、やる必要性も薄い。

移行方法についてもやや難しく、UbuntuはNVMe SSD上で動いているため、本来なら別にNVMe SSDを買ってきてそこに試験的に移行先を作り、移行が環境した時点でUbuntuのNVMe SSDと物理的にすり替えたいところだが、SSDが高騰している関係でこの手が使えず、やるとしたら空いているSATA SSDに環境を入れて、運用が軌道に乗りそうならUbuntuを消し飛ばすしかなくなる。つまり戻せないか、戻す場合はUbuntuの入っているNVMe SSDをddでどっかにバックアップしてやる必要がある。凄いめんどい。

ひとまず、以下に移行したくなった好ましくない理由と、移行先について書いていく。

Ubuntuの好ましくないところ

ここに書いていることはほとんど運用面では関係ない吝嗇である。端的に言えばCanonicalの姿勢が嫌いなのである。

Ubuntuの商業主義が気に食わない

自鯖はLinuxのDesktop環境の検証も兼ねているのでUbuntu Desktopを導入しているが、何かあるとCanoninalの製品に誘導されたり、過去にはMSアカウントとの連携をお勧めしてくる画面とも出会った記憶がある。こういうところがどうも好きになれない。

私はCanonicalに金を払う気がないし、LinuxをMSアカウントや、その他何かしらのアカウントと連携させたいとも思っていない。スタンドアロンこそが正義だ。

いやまぁ、Edgeのアカウントは連携するけどさ。

Snapが気に食わない

Snapに対する私の理解としてはSnapdというデーモンの上で動くアプリケーションという感じだ。

コンテナ化されたアプリケーションがDocker見たいなやつの上で動いている。なんかリソース食いそうだしキモイ。ネイティブアプリケーションはバイナリでそのまま動いてほしい。

噂ではFirefoxはaptでインストールしてもSnapdの上で動くらしい。これはWikipediaにも載ってるほど有名な話だ。何故snapdを使ってないのにそうなるのか?キモすぎる。

私は仮想化に対しては余り良いイメージがない。何故なら仮想環境分のオーバーヘッドを含み、無駄にストレージやメモリを食うこと、ホスト環境とゲスト環境の差異により問題が発生した時の特定が困難なことがある。

明示的に触れるDockerやVMならまだしもSnapdは一般向けで普通カスタマイズしない気もするし、そもそもカスタマイズが必要になるとしたらバカバカしい。なんでFirefox動かすのにそんな設定しないといけないのか?

動作が不安定

インストール直後にapt upgradeを叩くとリポジトリが死んでることがある。これは非常に嫌だ。

なんで公式でキッティングされてるリポジトリが死んでるのか?本当に営利企業がやってるのか?と思う。

他にもノートPCに入れてると蓋を閉じて開きなおしたときにキーボード入力が効かなくなり、一切何も操作できなくなることもあった。これは大分困る。

基本的にUbuntuのDesktop環境は不安定で、よくフリーズやクラッシュすると思う。それでもUbuntu 8.04 LTS辺りのころよりは安定したとは思うが…。

26でのinit.d切り捨て発表

init.dを捨てろという話なのだが、移行がだるい。

Ubuntuの好ましいところ

一方で、Ubuntuにもいいところはある。

広く普及しておりノウハウが豊富

人気のディストリのため、情報が多いのは強みかもしれない。

パッケージリポジトリも多く、基本的にUbuntu対応は多いと思う。

メジャーアップデートが容易

コマンド一個叩けばアップデートできるのは便利だ。設定の移行も手伝ってくれる。

特に何もしなくても大抵のハードウェアが動く

5種類くらいのデバイスに突っ込んだり、NICを増設したり、色々してきたが、今のところドライバを入れるとか何か対応したことはない。楽である。

現在検討している移行先

取り敢えずそんなこんなで移行先を探すことにした。

Debian

人生で最も最初に触ったディストリ。保守的で質実剛健という話を聞くやつ。

得られそうな利点
  • Canonicalの商業主義から解放される
  • Ubuntuより安定している可能性がある
    • Debianは徹底的なテストを経てリリースされているそうなので
懸念点
通信速度が異常に遅かった

懸念点としては何故か通信速度が異常に遅かった点だ。Live installerでiperf3で計測したところ、なんか異常に遅かった。これでは使い物にならない。原因は調べていないがNICは10000Mbpsでリンクアップしていたので、NICより手前で何かが起きていた可能性がある。

以下はDebian 13.5.0のLive installer上で計測した値だ。

Windows -> Debian

Interval Transfer Bitrate Retr Cwnd
0.00-1.00 sec 39.0 MBytes 327 Mbits/sec 1 247 KBytes
1.00-2.00 sec 40.9 MBytes 343 Mbits/sec 3 214 KBytes
2.00-3.00 sec 38.2 MBytes 321 Mbits/sec 4 187 KBytes
3.00-4.00 sec 41.0 MBytes 344 Mbits/sec 3 199 KBytes
4.00-5.00 sec 38.9 MBytes 326 Mbits/sec 3 160 KBytes
5.00-6.00 sec 40.1 MBytes 337 Mbits/sec 0 298 KBytes
6.00-7.00 sec 39.9 MBytes 334 Mbits/sec 0 386 KBytes
7.00-8.00 sec 41.1 MBytes 345 Mbits/sec 2 358 KBytes
8.00-8.81 sec 32.0 MBytes 331 Mbits/sec 0 423 KBytes

Debian -> Windows

Interval Transfer Bitrate
0.00-1.00 sec 37.8 MBytes 315 Mbits/sec
1.00-2.01 sec 41.2 MBytes 342 Mbits/sec
2.01-3.01 sec 38.1 MBytes 321 Mbits/sec
3.01-4.00 sec 40.6 MBytes 344 Mbits/sec
4.00-5.01 sec 39.4 MBytes 327 Mbits/sec
5.01-6.01 sec 40.1 MBytes 339 Mbits/sec
6.01-7.00 sec 39.2 MBytes 330 Mbits/sec
7.00-8.01 sec 41.1 MBytes 342 Mbits/sec
7.00-8.01 sec 41.1 MBytes 342 Mbits/sec
移行しても旨味があまりなさそう

手間がかかるだけでCanonicalの開放以外のメリットがなさそう。

移行の手間としても全ての手順をマニュアルに書き出すかAnsibleのような構成管理ツールでやる必要があり、非常に面倒そうである。

Proxmox

仮想環境をたくさん作ってその中でアプリケーションを運用するやつ。コンテナ単位でのバックアップも取れるなど便利そうだ。

この環境に移行する場合、移行が楽というのが最大のメリットだ。一度適当な環境に仮構築しモジュールごとに移行し、移行完了したらLXCのバックアップを取り、Ubuntu環境を潰し、Proxmoxに入れ替え、バックアップを復旧して移行すればリスクも手間も最低限で済む。

またDebianで発生したNICの極端な通信速度劣化についてもProxmoxでは確認できなかった。但しUbuntuよりは遅く見えた。

懸念点
スペック的に運用できるか怪しい

例えばコンテナ単位でのリソース管理はその一つだ。例えばコンテナごとにCPUやメモリ、ストレージを割り当てるとすると、特定のコンテナが跳ねたときにリミットにかかって動作が劣化するが、ネイティブで動かしていればCPUやメモリ、ストレージは共有なので、なんかいい感じにしてくれる。限界突破しない限りOOMは起きないし、私のサーバースペックであれば普通起きない。

しかしコンテナ化して1コンテナCPU2コア、メモリ2GBとかしていればしょぼいVPSみたいになって動作が劣化しそうだし、そんな立派なスペックでもなく、現状CPU6コアのメモリ32GBなので、この割り当てだとすぐに枯渇するのは自明である。ブレードサーバーを持ったホームラボ、k8sを使った運用のようにクラスタ化された環境なら、これはうまくいきそうだが、しょっぱいスペックのマシン一台で成り立つかどうかは怪しい。

Opus 4.8は成り立つというが、この分野ではLLMの言うことを真に受けたくはない。そもそもLLMの出力なんか何言ってるかわからないけど動くからいいか!で採用するものでしかないと思っている。

運用がだるそう

例えば10個くらいLXCを上げているとして、コンテナのイメージをアップデートしますとかなると全部上げていかないといけないだろうから、これは面倒そうだ。

他にもLXC1とLXC2, LXC4に対して作業する場合、それぞれのLXCにSSHDと鍵を入れる必要があり、無駄なオーバーヘッドが出る。つまりLXCを増やし、そこの中に入る場合は台数分のSSHDが多重起動し、その数分の鍵が必要だ。まぁこれについては最悪一個にしてもいいが…。切り替えについてもnginxでリバプロしてハブを作れば上手くいくかもしれないが、そもそもそれが出来るかよくわかっていない。軽くググった感じはできるらしいが、そもそもスイッチする時どうなるのか見当もつかない。/lxc1/path/toみたいな形式になるのだろうか?

そう考えるだけで運用がだるそうである。

pct setを使えばうまくいく可能性が示唆されているが、どうやらこの方法は前述のように根本にパスを追加して、そこから分けていく考えのようだ。ユーザーやグループとかどうなるんだこれ…?Proxmox側でID揃えてくれるのかな?

あとホストのアップデートもだるそうな気がしている。

監視がだるそう

動作パフォーマンスを取ろうにもホストとゲストのどっちのCPUやメモリの使用率を取るかは悩みである。ホストには空きがあるが、ゲストには空きがなければ広げた方がいいかもしれないし、この辺りについては考えがまとまっていない。

通信速度の比較

Ubuntu 24.04.4 LTS

Windows -> Ubuntu

Interval Transfer Bitrate
0.00-1.00 sec 1.11 GBytes 9.50 Gbits/sec
1.00-2.01 sec 1.11 GBytes 9.47 Gbits/sec
2.01-3.01 sec 1.10 GBytes 9.49 Gbits/sec
3.01-4.01 sec 1.10 GBytes 9.49 Gbits/sec
4.01-5.01 sec 1.11 GBytes 9.48 Gbits/sec
5.01-6.01 sec 1.10 GBytes 9.47 Gbits/sec
6.01-6.57 sec 628 MBytes 9.50 Gbits/sec

Ubuntu -> Windows

Interval Transfer Bitrate
0.00-1.01 sec 1.11 GBytes 9.40 Gbits/sec
1.01-2.00 sec 1.09 GBytes 9.42 Gbits/sec
2.00-3.01 sec 1.10 GBytes 9.40 Gbits/sec
3.01-4.01 sec 1.10 GBytes 9.39 Gbits/sec
3.01-4.01 sec 1.10 GBytes 9.39 Gbits/sec

Debian 13.5.0のLive installer上での計測

以下の計測値は全てクライアント側で取得したもの。Windows側にCwndが出ているので表が逆かもしれない(Proxmoxではクライアント側にCwndが出ていたため)

Windows -> Debian

Interval Transfer Bitrate Retr Cwnd
0.00-1.00 sec 39.0 MBytes 327 Mbits/sec 1 247 KBytes
1.00-2.00 sec 40.9 MBytes 343 Mbits/sec 3 214 KBytes
2.00-3.00 sec 38.2 MBytes 321 Mbits/sec 4 187 KBytes
3.00-4.00 sec 41.0 MBytes 344 Mbits/sec 3 199 KBytes
4.00-5.00 sec 38.9 MBytes 326 Mbits/sec 3 160 KBytes
5.00-6.00 sec 40.1 MBytes 337 Mbits/sec 0 298 KBytes
6.00-7.00 sec 39.9 MBytes 334 Mbits/sec 0 386 KBytes
7.00-8.00 sec 41.1 MBytes 345 Mbits/sec 2 358 KBytes
8.00-8.81 sec 32.0 MBytes 331 Mbits/sec 0 423 KBytes

Debian -> Windows

Interval Transfer Bitrate
0.00-1.00 sec 37.8 MBytes 315 Mbits/sec
1.00-2.01 sec 41.2 MBytes 342 Mbits/sec
2.01-3.01 sec 38.1 MBytes 321 Mbits/sec
3.01-4.00 sec 40.6 MBytes 344 Mbits/sec
4.00-5.01 sec 39.4 MBytes 327 Mbits/sec
5.01-6.01 sec 40.1 MBytes 339 Mbits/sec
6.01-7.00 sec 39.2 MBytes 330 Mbits/sec
7.00-8.01 sec 41.1 MBytes 342 Mbits/sec
7.00-8.01 sec 41.1 MBytes 342 Mbits/sec

Proxmox VE 9.2-1

以下の計測値は全てWindows上で取得したもので、Proxmox->Windows側はProxmox側のログの値ではない(転記が面倒だったためWindows側の値を取っている)

Windows -> Proxmox

Interval Transfer Bitrate
0.00-1.01 sec 1.07 GBytes 9.13 Gbits/sec
1.01-2.01 sec 1.07 GBytes 9.26 Gbits/sec
2.01-3.01 sec 1.07 GBytes 9.25 Gbits/sec
3.01-4.01 sec 1.09 GBytes 9.28 Gbits/sec
4.01-5.01 sec 1.06 GBytes 9.16 Gbits/sec
5.01-6.00 sec 1.02 GBytes 8.78 Gbits/sec
6.00-7.00 sec 1.07 GBytes 9.23 Gbits/sec
7.00-7.88 sec 948 MBytes 9.03 Gbits/sec

Proxmox -> Windows

Proxmox側(クライアント)にはCwndが出ていたが、Windows側(サーバー)の値を取っているため、その情報が欠落している。

Interval Transfer Bitrate
0.00-1.00 sec 1.08 GBytes 9.26 Gbits/sec
1.00-2.01 sec 1.09 GBytes 9.27 Gbits/sec
2.01-3.01 sec 1.08 GBytes 9.28 Gbits/sec
3.01-4.00 sec 1.08 GBytes 9.29 Gbits/sec
4.00-5.00 sec 1.08 GBytes 9.29 Gbits/sec
5.00-6.00 sec 1.08 GBytes 9.28 Gbits/sec
6.00-7.00 sec 1.08 GBytes 9.27 Gbits/sec
7.00-8.01 sec 1.09 GBytes 9.29 Gbits/sec
8.01-9.00 sec 1.07 GBytes 9.28 Gbits/sec
9.00-10.00 sec 1.08 GBytes 9.29 Gbits/sec

あとがき

Proxmoxで運用の支障がなければ環境分離の観点から移行できるとよさそうだが、メンテナンスのだるさを考えた時にどうかというのでぐるぐるしている。

かといって今のUbuntuを拡張すればするほど移行が手間になってくるので、悩ましい。しかし単一ホストで全部運用するのは間違いなく楽だしなぁ…。

取り敢えずDebianに移行する旨味は余りなさそうだし、これはしなくていいかと思った。

Proxmoxはやってみないとわからない部分もあるのでUbuntu環境のバックアップを入念に取ったうえでやるかもしれないが、問題はUbuntuをバックアップするストレージをどうするか…。

そもそも現時点でやる意義も怪しいので、今はやらない方に倒し、必要が出たときにやるのも一つではある。やりたくなった時にはそれはもう地獄が待っているかもしれないが、それ以前に私はやりたいことが無数にあるのだ。

今回は検証ができたという意味では一つ成果だと思うし、一旦ここで留めておこう。

2026/05/21(木)GrafanaでLokiのログからログメッセージを部分一致で検索する

投稿日:

Grafana Logs Drilldownではフィルタ出来るのにExplore > Lokiでクエリを打ってもログを引けなかった。これを引けるようにするのが目的。

確認環境

nginxのログをFluentBitで拾いLokiに送る構成。

Env Ver
Ubuntu 24.04.3 LTS
Loki 3.5.9
FluentBit 4.2.2
nginx 1.26.1
Grafana v12.1.1

やり方

server: mstdn.lycolia.info[error]を含むものを検索する場合、こうしておくと引ける。要点はjson msg="log"で別名をつけること。logのままでは構文エラーになる。

{job="nginx"} |= `error` |= `server: mstdn.lycolia.info` | json msg="log" | msg=~`.*\[error\].*`

|= errorについてはQuery best practices | Grafana Loki documentationで、最初にラインフィルタをかけるとパフォーマンスが上がるということで付けている。

server="mstdn.lycolia.info"を指定するとなぜかうまくいかなかった。

2026/05/11(月)Mastodon周りのメトリクス収集メモ

更新日:
投稿日:

確認環境

Env ver
nginx 1.26.1
Apache2 2.4.58
PostgreSQL 16.13
Redis 7.0.15
Mastodon 4.5.9
Prometheus 3.5.0

Apache2

# 取得
wget https://github.com/Lusitaniae/apache_exporter/releases/download/v1.0.12/apache_exporter-1.0.12.linux-amd64.tar.gz
tar xvfz apache_exporter-1.0.12.linux-amd64.tar.gz

# binを配置
sudo cp apache_exporter-1.0.12.linux-amd64/apache_exporter /usr/local/bin/
ls -la /usr/local/bin/ | grep apache_exporter

# デーモン作成
cat <<'EOF' | sudo tee /etc/systemd/system/apache_exporter.service
[Unit]
Description=Prometheus Apache Exporter
After=network.target

[Service]
Type=simple
User=prometheus
Group=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/apache_exporter --scrape_uri=http://[::]:ここにポート番号/server-status?auto
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# デーモンの有効化
sudo systemctl daemon-reload
sudo systemctl enable --now apache_exporter

# 起動確認
curl "http://[::1]:9117/metrics"

# 掃除
rm -Rf apache_exporter-1.0.12.linux-amd64 apache_exporter-1.0.12.linux-amd64.tar.gz

PostgreSQL

# 取得
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.19.1/postgres_exporter-0.19.1.linux-amd64.tar.gz
tar xvfz postgres_exporter-0.19.1.linux-amd64.tar.gz

# binを配置
sudo cp postgres_exporter-0.19.1.linux-amd64/postgres_exporter /usr/local/bin/
ls -la /usr/local/bin/ | grep postgres_exporter

# 監視ユーザーの作成
sudo -u postgres psql
CREATE USER postgres_exporter WITH PASSWORD 'ここにパスワード';
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
GRANT pg_monitor TO postgres_exporter;
quit

# 監視情報の作成
echo 'DATA_SOURCE_NAME="postgresql://postgres_exporter:ここにパスワード@localhost:5432/postgres?sslmode=disable"' | sudo tee /etc/default/postgres_exporter
sudo chown root:root /etc/default/postgres_exporter
sudo chmod 600 /etc/default/postgres_exporter

# デーモン作成
cat <<'EOF' | sudo tee /etc/systemd/system/postgres_exporter.service
[Unit]
Description=Prometheus PostgreSQL Exporter
After=network.target postgresql.service
Wants=postgresql.service

[Service]
Type=simple
User=prometheus
Group=prometheus
WorkingDirectory=/var/lib/prometheus
EnvironmentFile=/etc/default/postgres_exporter
ExecStart=/usr/local/bin/postgres_exporter \
    --web.listen-address=[::]:9187
Restart=on-failure
RestartSec=5
EOF

# デーモンの有効化
sudo systemctl daemon-reload
sudo systemctl enable --now postgres_exporter

# 起動確認
curl "http://[::1]:9187/metrics"

# 掃除
rm -Rf postgres_exporter-0.19.1.linux-amd64 postgres_exporter-0.19.1.linux-amd64.tar.gz

Redis

# 取得
wget https://github.com/oliver006/redis_exporter/releases/download/v1.82.0/redis_exporter-v1.82.0.linux-amd64.tar.gz
tar xvfz redis_exporter-v1.82.0.linux-amd64.tar.gz

# binを配置
sudo cp redis_exporter-v1.82.0.linux-amd64/redis_exporter /usr/local/bin/
ls -la /usr/local/bin/ | grep redis_exporter

# デーモン作成
cat <<'EOF' | sudo tee /etc/systemd/system/redis_exporter.service
[Unit]
Description=Prometheus Redis Exporter
After=network.target

[Service]
Type=simple
User=prometheus
Group=prometheus
WorkingDirectory=/var/lib/prometheus
ExecStart=/usr/local/bin/redis_exporter --redis.addr=redis://localhost:6379
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# デーモンの有効化
sudo systemctl daemon-reload
sudo systemctl enable --now redis_exporter

# 起動確認
curl "http://[::1]:9121/metrics"

# 掃除
rm -Rf redis_exporter-v1.82.0.linux-amd64 redis_exporter-v1.82.0.linux-amd64.tar.gz

Mastodonの組み込みExporter

  1. .env.productionに以下を追加
    MASTODON_PROMETHEUS_EXPORTER_ENABLED=true
    MASTODON_PROMETHEUS_EXPORTER_SIDEKIQ_DETAILED_METRICS=true
    
  2. デーモンを作る

    cat <<'EOF' | sudo tee /etc/systemd/system/mastodon-prometheus-exporter.service
    [Unit]
    Description=mastodon-prometheus-exporter
    After=network.target
    
    [Service]
    Type=simple
    User=mastodon
    WorkingDirectory=/home/mastodon/live
    Environment="RAILS_ENV=production"
    ExecStart=/home/mastodon/.rbenv/shims/bundle exec prometheus_exporter -b "::" -p 9394
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # デーモンの有効化
    sudo systemctl daemon-reload
    sudo systemctl enable --now mastodon-prometheus-exporter
    
  3. 起動確認
    curl "http://[::1]:9394/metrics"
    # Streamingはv4でしかlistenしてないので[::1]は諦める
    curl "http://localhost:5001/metrics"