Monitoringでログ表示


はじめに

気が付くと、いろいろな機能が追加されているElastic Stackです。
今回はちょっと小さな機能ですが、ピリリとくる(かな?)。

Monitoringでのログ表示

Monitoring機能では各ノードやインデックスのメトリックが表示されていましたが、Infra AppのLogsと連携してログを表示する機能が追加されました。

が、デフォルトではメッセージが表示されるだけで何も出てくれません。
書いてある通りに、ちゃんとFilebeatをセットアップして表示してみましょう。

Filebeatの設定

設定は、こんな感じで。
Elasticsearchが乗っているサーバにFilebeatを入れます。今回はMonitoring用クラスタがあるわけではないので、そのままローカルのElasticsearchに送り込みます。

filebeat.yml
filebeat.config:
   modules:
     path: /etc/filebeat/modules.d/*.yml
   module: elasticsearch
output.elasticsearch:
   hosts: ["localhost:9200"]

この設定で起動すると、以下のような画面が出てきます。

(さっきとはバージョン違いますが、まぁ、お茶目ってことで)

GithubのIssueを見る限り、ワーニングは色違いで出してくれるようです。

ログの表示

Overviewの場合

ここで表示されるのは、最新の10件だけです。ログの下にはLogs UIへのリンクもあるので、全部見たければそちらに移動します。
押すとLogs UIにとんで、Cluster UUIDでフィルタリングされたログが表示されます。

Nodeの場合

Overviewと同様に、ログが表示されます。ここでは、表示されているノードに関連したものが表示されます。

Logs UIにとんでみると、ちゃんとフィルタリングされます。

Indexの場合

Indexでフィルタリングされたログが表示されます。
Logs UIに飛んでみます。

コンテナへの組み込み

ElasticsearchをDockerなりのコンテナで起動すること、ありますよね。
そんな時にログを簡単に見れるように、Filebeatを組み込んでみます。
といっても、Elasticsearchのコンテナに入れちゃうのではなく、別コンテナに入れたFilebeatでログを読み込んでElasticsearchにログを投げ込みます。

docker-compose.ymlとfilebeat.ymlを、以下のようにして作って見ます。

docker-compose.yml
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0-SNAPSHOT
    container_name: elasticsearch4
    environment:
      - cluster.name=docker-cluster
      - node.name=node-1
      - cluster.initial_master_nodes=node-1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - path.repo=/usr/share/elasticsearch/snapshots
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    ports:
      - 9204:9200
    networks:
      - esnet
  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.0-SNAPSHOT
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch4:9200
    container_name: kibana4
    ports:
      - 5605:5601
    networks:
      - esnet
  beats4:
    image: docker.elastic.co/beats/filebeat:7.1.0-SNAPSHOT
    user: root
    environment:
      - ELASTICSEARCH_CONTAINER_NAME=elasticsearch4
      - ELASTICSEARCH_HOSTS=http://elasticsearch4:9200
      - KIBANA_HOST=http://kibana4:5601
    volumes:
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
    networks:
      - esnet

volumes:
  esdata1:
    driver: local

networks:
  esnet:

ホストのdocker関連ディレクトリを参照する権限が必要なので、Filebeatの起動ユーザをrootにしています。

filebeat.yml
filebeat.autodiscover:
  providers:
    - type: docker
      labels.dedot: true
      templates:
        - condition:
            contains:
              docker.container.name: ${ELASTICSEARCH_CONTAINER_NAME:elasticsearch}
          config:
             - module: elasticsearch
               server:
                 enabled: true
                 input:
                   type: docker
                   containers.ids:
                     - "${data.docker.container.id}"
setup.kibana:
  host: "${KIBANA_HOST:kibana:5601}"
output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'

さいごに

こんな感じで、ログも表示されるとなると、Monitoring用のクラスタも運用したくなってきますね。
あとは、ほかの製品群もログが見れるようになるとうれしいかな。