Elasticsearchのデータ構造とKibanaの基本について

ElasticsearchとかKibanaがどういう物なのかをなんとな〜く知った人向けのことを書きます。

Elasticsearchのデータ構造

図としてはこんな感じです

f:id:etogen:20171119200051p:plain

データ構造について – AWSで始めるElasticSearch(4) | Developers.IO

RDBに例えればわかりやすいのではないでしょうか

ElasticSearch RDB
index database
type table
document row (record)
field column

documentのデータ構造

次にdocumentのデータ構造について見ていきましょう。ElasticSearchには「1 document = 1 data」という感じで保存されていきます。たとえば以下のようなdocumentを例にあげましょう。

{
  "_index": "filebeat-6.0.0-2017.11.19",
  "_type": "doc",
  "_id": "AV_Tuh4K3i1qtwcm1WAq",
  "_version": 1,
  "_score": null,
  "_source": {
    "@timestamp": "2017-11-19T10:01:44.000Z",
    "offset": 2162,
    "nginx": {
      "access": {
        "referrer": "-",
        "response_code": "304",
        "remote_ip": "219.117.123.123",
        "geoip": {
          "continent_name": "Asia",
          "city_name": "Nakano",
          "country_iso_code": "JP",
          "region_name": "Kanagawa",
          "location": {
            "lon": 139.2728,
            "lat": 35.5711
          }
        },
        "method": "GET",
        "user_name": "-",
        "http_version": "1.1",
        "body_sent": {
          "bytes": "0"
        },
        "remote_ip_list": [
          "297.117.123.123"
        ],
        "url": "/",
        "user_agent": {
          "patch": "3163",
          "major": "61",
          "minor": "0",
          "os": "Mac OS X 10.12.6",
          "os_minor": "12",
          "os_major": "10",
          "name": "Chrome",
          "os_name": "Mac OS X",
          "device": "Other"
        }
      }
    },
    "beat": {
      "hostname": "91869e7c4814",
      "name": "91869e7c4814",
      "version": "6.0.0"
    },
    "prospector": {
      "type": "log"
    },
    "read_timestamp": "2017-11-19T10:01:49.854Z",
    "source": "/nginxlog/access.log",
    "fileset": {
      "module": "nginx",
      "name": "access"
    }
  },
  "fields": {
    "@timestamp": [
      1511085704000
    ]
  },
  "sort": [
    1511085704000
  ]
}

documentの実態はJSON形式のデータです。いろんなkeyがありますが、特に重要なのはアンダーバーがついたものでしょうか。_source以外はdocumentにつけられる一種のメタデータです。

key 内容
_index documentの索引
_type documentの種類を分けるもの。indexの中に複数作れる
_id documentのID。全てのdocumentに一意なものが割り当てられる
_version documentをバージョニングするためのもの。documentが更新される度にインクリメントされる
_score documentにつける重み的なもの
_source documentのデータ部分

_sourceの中でもちょっと重要なkey(field)についても紹介しておきますね。Kibanaを使う人は絶対これらを知っておきましょう。

key(field) 内容
@timestamp documentに付与されたtimestamp。Kibanaのtime filterとして使われることがしばしば
fields time filterとして使えるfieldのリスト。@timestamp以外にも追加することが可能です


もっと詳しく知りたい人は以下のリンクを参考に

初めてKibanaアクセスした時に表示されるアレ

Kibanaを起動した後、Webページに接続すると最初にこんな感じのページが表示されることかと思います。

f:id:etogen:20171119222440p:plain

ここではKibanaで可視化するデータが詰まったindexと、indexのdocumentに対して適用するtime filterを指定できます。

まずindex patternですが、ここではElasticsearchに存在するindexを正規表現で指定します。Kibanaではここで指定したパターンにマッチするindexに属するdocumentをまとめて扱うことができるようになります。

たとえばLogstashからElasticsearchに向けてデータを送っている場合、特別な設定がされていなければlogstash-YYYY.MM.DDというindexが自動で作られます。ここでindex patternをlogstash-*というようにしましょう。するとLogstashから送られてきた全ての日付のデータをまとめて扱うことができます。

さっきから「まとめて扱う」と言っていますがこれは具体的にどういうことかというと、Discoverでデータを表示する時、Visualizeでデータをグラフ化する時のデータソースにできるということを意味します。異なるindex patternに属するdocumentを一緒に扱うことはできないので注意しましょう(timelionなんかは複数のindexのデータを扱えるみたいですが)

time filterは、Kibanaでfilterとして使用できる日時のfieldのことです。DiscoverやDashboardの右上にあるTime Rangeはこれを用いています。これがないと「Last 1 hour」などでdocumentにフィルタリングをかけることができません。

f:id:etogen:20171119215851p:plain