Metricbeat 8.6.0のインストールと設定

Metricbeat 8.6.0をインストールして動かすまで

FreeBSDにメトリックデータを取得するエージェントのMetricbeat 8.6.0をインストールして動かすまで。

Metricbeatのインストール

# cd /usr/ports/sysutils/beats8
# make install

configオプション
 [ ] AUDITBEAT   Auditbeat
 [x] FILEBEAT    Filebeat
 [ ] HEARTBEAT   Heartbeat
 [x] METRICBEAT  Metricbeat
 [ ] PACKETBEAT  Packetbeat

システムのメトリクス情報収集とログ収集だけであればMetricbeat(と今回は関係ないけどFilebeat)があれば十分かと。

大量のファイルの読み込みと長いビルド時間を待つことになる。Golang未インストールシステムだとさらに長く待たされます。

Metricbeatの設定

設定ファイルの編集
/usr/local/etc/beats/metricbeat.yml (編集)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
metricbeat.config.modules:
  path: ${path.config}/metricbeat.modules.d/*.yml  (初期値のまま)
  reload.enabled: true   (falseからtrueに変更)

setup.dashboards.enabled: true
setup.dashboards.directory: /usr/local/share/beats/metricbeat/kibana/

setup.kibana:
  host: "192.168.2.16:5601"     (KibanaのIPアドレス:5601)
  protocol: "https"
  username: "elastic"
  password: "前回記事の方法で作成したパスワード"
  kibanaのSSL/TLSの設定がオレオレ認証局を使った証明書でなければ(前回記事ではLet's Encript使用)CA証明書の指定は要らない筈。

output.elasticsearch:
  hosts: ["192.168.2.16:9200"]  (ElasticsearchのIPアドレス:9200)
  protocol: "https"
  ssl.certificate_authorities: ["/usr/local/etc/beats/http_ca.crt"]  (ElasticsearchのCA証明書ファイルをコピーしてくる)
  username: "elastic"
  password: "前回記事の方法で作成したパスワード"

logging.to_syslog: false
logging.to_files: false

beats8インストール直後は /usr/local/etc/beats/metricbeat.modules.d が空。(READMEファイルはある) モジュールの設定ファイルの雛形が /usr/local/share/examples/beats/metricbeat.modules.d にあるので、とりあえず system.yml と elasticsearch-xpack.yml.disabled と、kibana-xpack.yml.disableの3つだけを /usr/local/etc/beats/metricbeat.modules.d にコピーする。他のモジュールの設定ファイルも使用するならそのファイルをコピーする。system.yml以外はファイル名の最後に.disableが付いているので注意。

システムモジュールの設定ファイルを編集する。
/usr/local/etc/beats/metricbeat.modules.d/system.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Module: system
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/8.5/metricbeat-module-system.html

- module: system
  period: 10s
  metricsets:
    - cpu
    - load
    - memory
    - network
    #- process
    - process_summary
    #- socket_summary
    #- entropy
    - core
    - diskio
    #- socket
    #- service
    #- users
  process.include_top_n:
    by_cpu: 5      # include top 5 processes by CPU
    by_memory: 5   # include top 5 processes by memory
# Configure the mount point of the host’s filesystem for use in monitoring a host from within a container
# hostfs: "/hostfs"

- module: system
  period: 1m
  metricsets:
    #- filesystem
    #- fsstat
  processors:
  - drop_event.when.regexp:
      system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)'

- module: system
  period: 15m
  metricsets:
    - uptime

#- module: system
#  period: 5m
#  metricsets:
#    - raid
#  raid.mount_point: '/'

元がLinux用ということもありFreeBSDでは値を取得できないメトリックセットがあるので#を付けてコメントに変える。

/usr/local/etc/beats/metricbeat.modules.d/elasticsearch-xpack.yml.disable (編集)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Module: elasticsearch
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/8.5/metricbeat-module-elasticsearch.html

- module: elasticsearch
  xpack.enabled: true
  period: 10s
  hosts: ["https://es.example.com:9200"]    (Elasticsearchがあるホスト名 この例ではLet's Encryptの証明書があるとする)
  protocol: "https"
  username: "elastic"
  password: "前回記事の方法で作成したパスワード"
/usr/local/etc/beats/metricbeat.modules.d/kibana-xpack.yml.disable (編集)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Module: kibana
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/8.5/metricbeat-module-kibana.html

- module: kibana
  xpack.enabled: true
  period: 10s
  hosts: ["https://kibana.example.com:5601"]
  protocol: "https"
  username: "elastic"
  password: "前回記事の方法で作成したパスワード"
  ssl.certificate_authorities: ["/usr/local/etc/beats/http_ca.crt"]

設定ファイルを用意したら(編集の有無には関わらない筈だが)モジュールの有効化を行う。実際はモジュールファイル名の.disableを付ける付けないの操作だけと思われます。

現状の確認
# cd /usr/local/etc/beats    (他所のディレクトリで実行するなら次のコマンドに -path.config /usr/local/etc/beatsを付ける)
# metricbeat modules list
Enabled:   (有効モジュール)
system

Disabled:   (無効モジュール)
elasticsearch-xpack
kibana-xpack
system(有効化済み), elasticsearch-xpack, kibana-xpackの3つのモジュールを有効化する。
# metricbeat modules enable system
Module system is already enabled  (有効化済みのモジュールなので怒られますが問題ありません)
# metricbeat modules enable elasticsearch-xpack
Enabled elasticsearch-xpack
# metricbeat modules enable kibana-xpack
Enabled kibana-xpack
再度、状態を確認します。
# metricbeat modules list   (/usr/local/etc/beatsディレクトリで実行)
Enabled:   (有効モジュール)
elasticsearch-xpack
kibana-xpack
system

Disabled:   (無効モジュール)

3つのモジュールが有効化されていることが確認できました。

設定ファイルのテストを実行

# metricbeat test config   (/usr/local/etc/beatsディレクトリで実行)
Config OK

YAMLファイルとしての体裁が出来ているかの確認だけ?あまり役に立たないかも。

モジュールの動作を確認します。
# metricbeat test modules system
system...
  cpu...OK
    result:
    {
     "@timestamp": "2023-01-17T14:04:05.116Z",
     "event": {
      "dataset": "system.cpu",
      "duration": 223590,
      "module": "system"
     },
     "host": {
      "cpu": {
       "usage": 0.126
中略
  process...
    error... ERROR timeout waiting for an event
  process_summary...OK
    result:
    {
     "@timestamp": "2023-01-17T14:04:10.127Z",
後略

ズラズラ出ます。エラーになる項目は情報が取得できないので修正するかsystemモジュールの設定で無効化します。

elasticsearch-xpackモジュールをテストします。このテストは-eオプションを付けないと返事を得ることができません。
# metricbeat test modules elasticsearch-xpack -e
{"log.level":"info","@timestamp":"2023-01-17T23:43:56.965+0900","log.origin":{"file.name":"instance/beat.go","file.line":724},"message":"Home path: [/usr/local/etc/beats] Config path: [/usr/local/etc/beats] Data path: [/usr/local/etc/beats/data] Logs path: [/usr/local/etc/beats/logs]","service.name":"metricbeat","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2023-01-17T23:43:56.965+0900","log.origin":{"file.name":"instance/beat.go","file.line":732},"message":"Beat ID: 5ada71b4-6d21-45de-ade1-a27b60e85fd6","service.name":"metricbeat","ecs.version":"1.6.0"}
{"log.level":"warn","@timestamp":"2023-01-17T23:43:57.202+0900","log.logger":"processes","log.origin":{"file.name":"process/process_common.go","file.line":159},"message":"Getting host details: unimplemented","service.name":"metricbeat","ecs.version":"1.6.0"}

証明書周りでエラー文言が含まれていないことを確認しておきます。

elasticsearch-xpackモジュールをテストします。このテストは-eオプションを付けないと返事を得ることができません。
# metricbeat test modules kibana-xpack -e
{"log.level":"info","@timestamp":"2023-01-17T23:44:05.266+0900","log.origin":{"file.name":"instance/beat.go","file.line":724},"message":"Home path: [/usr/local/etc/beats] Config path: [/usr/local/etc/beats] Data path: [/usr/local/etc/beats/data] Logs path: [/usr/local/etc/beats/logs]","service.name":"metricbeat","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2023-01-17T23:44:05.266+0900","log.origin":{"file.name":"instance/beat.go","file.line":732},"message":"Beat ID: 5ada71b4-6d21-45de-ade1-a27b60e85fd6","service.name":"metricbeat","ecs.version":"1.6.0"}
{"log.level":"warn","@timestamp":"2023-01-17T23:44:05.503+0900","log.logger":"processes","log.origin":{"file.name":"process/process_common.go","file.line":159},"message":"Getting host details: unimplemented","service.name":"metricbeat","ecs.version":"1.6.0"}

証明書周りでエラー文言が含まれていないことを確認しておきます。

一応、出力テストも行います。

# metricbeat test output
elasticsearch: https://192.168.2.16:9200...
  parse url... OK
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 192.168.2.16
    dial up... OK
  TLS...
    security: server's certificate chain verification is enabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK
  version: 8.6.0

TLS周りでエラーになりやすいかと思われますが、このようにエラー無しになればOK。

Metricbeatのセットアップ

Metricbeatが標準で持っているセットアップオプションは、ダッシュボード,インデックス,パイプラインがあり、「すべてのモジュールとファイルセットが有効になっているかのように振る舞う」というenable-all-filesetsというオプションがあります。(最後のは挙動不明)

# metricbeat setup -e  (すべてのセットアップを一括で実行)
Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
個別に実行するなら
# metricbeat setup --index-management -e (インデックスマネージメント)
ズラズラ出ます
Index setup finished.

出力される文字列の中にErrorが無いことを確認します。何かエラーが発生しているならMetricbeatとElasticsearchの接続(特にSSL/TLS)に問題があるか接続するユーザーの認証または権限を確認します。つまり、主に確認するのはmetricbeat.ymlのoutput.elasticsearch:関連です。

# metricbeat setup --dashboards -e (ダッシュボード)
Loading dashboards (Kibana must be running and reachable)
ズラズラ出ます
Loaded dashboards

出力される文字列の中にErrorが無いことを確認します。何かエラーが発生しているならMetricbeatとKibanaの接続(特にSSL/TLS)に問題があるか接続するユーザーの認証または権限を確認します。つまり、主に確認するのはmetricbeat.ymlのsetup.kibana:関連です。また、setup.dashboards.〜の設定を忘れずに有効化してください。

なお、このMetricbeatのセットアップで流し込んだダッシュボードはElastic Stack 7系までは普通に機能したと思われますが、インデックスパターンからデータビュー/データストリームに変わっている?Elastic Stack 8系では旧系と同じ作業で使えるのか不明です。Metricbeat 8に含まれるダッシュボード用のテンプレートが7系用のものであるという点から心配しています。(未確認)

# setup --pipelines -e (パイプライン)
数行出ます

出力される文字列の中にErrorが無いことを確認します。何かエラーが発生しているならMetricbeatとElasticsearchの接続(特にSSL/TLS)に問題があるか接続するユーザーの認証または権限を確認します。つまり、主に確認するのはmetricbeat.ymlのoutput.elasticsearch:関連です。

すべて-eオプションを付けて実行してください。-eオプション無しだとエラーが発生していても気付くことができません。正常に実行したと思い込んで、以後正常に動作しなくて悩むことになります。

Metricbeatサービス起動

/etc/rc.conf (追記1行)
metricbeat_enable="YES"
Metricbeatサービス起動
# service metricbeat start  (サービス起動)

ところで、Metricbeatの停止は service metricbeat stop だが、実際には停止しないっぽい。

/usr/local/etc/rc.d/meticbeat を見てみると

前略
pidfile="/var/run/${name}"   (/var/run/metricbeat のこと)
中略
metricbeat_stop() {
    pkill -9 -F ${pidfile} > /dev/null 2>&1
    pkill -9 -F ${pidfile}.child > /dev/null 2>&1
}
後略

のように書かれていて ${pidfile}.child の部分がよくわからない。実際に機能していない。(対応は後述)

もう一つ、どうしてもmetricbeatがメトリックを送信しないという事象。

metricbeat -e (手動実行) を行うと普通はメトリックデータをドカドカとelasticsearchに送る動作になる筈だが、数行吐いてすぐに終了してしまい理由がさっぱり判らなかった。

Metricbeatを停止した状態で /usr/local/etc/beats/data ディレクトリを確認したところ何故かロックファイルが存在した。

# ls -l /usr/local/etc/beats/data
total 8
-rw-------  1 root  wheel  99 Jan 11 16:19 meta.json
-rw-------  1 root  wheel  63 Jan 16 16:40 metricbeat.lock    (←犯人はこいつっぽい)

このロックファイルを削除したら正常に動作するようになった。このロックファイルにはプロセスIDが含まれるのだが、それが存在しないプロセス番号なので意味不明。

上の2つの問題を踏まえて以下のようにMetricbeat終了時のコマンドを以下のように変更した。 /usr/local/etc/rc.d/metricbeat (変更)

metricbeat_stop() {
    kill -9 `pgrep -f metricbeat` > /dev/null 2>&1
    rm /usr/local/etc/beats/data/metricbeat.lock > /dev/null 2>&1
}

とりあえず、上のように書き換えてやる。(metricbeatが動いてないときに service metricbeat stop をやるとエラーだが表示上は問題ない筈)

なお、ports/pkgでバージョンを更新するとこの変更が上書きされる可能性があるので更新後の確認をお忘れなく。

なお、手動で metricbeat -e 〜オプション〜 で実行した後は逐次 kill -9 「metricbeatプロセスID」 で手動で停めてください。

この記事ではElasticsearchとの接続のユーザー認証に全て特権ユーザーの「elastic」を使っていますが、適切なロールを与えたユーザーを作成し、そのAPI Keyを作成してusername, passwordの代わりに入力するのが適切だと思われます。ユーザー作成とAPI Key作成は次回以降の予定です。

関連記事: