web-dev-qa-db-ja.com

Python)を使用してElasticSearchに@timestampフィールドを追加します

Pythonを使用してローカルElasticSearch(localhost:9200)にエントリを追加しています

現在、私はこの方法を使用しています:

_def insertintoes(data):
"""
Insert data into ElasicSearch
:param data: dict
:return:
"""
timestamp = data.get('@timestamp')
logstashIndex = 'logstash-' + timestamp.strftime("%Y.%m.%d")
es = Elasticsearch()
if not es.indices.exists(logstashIndex):
    # Setting mappings for index
    mapping = '''
        {
            "mappings": {
                  "_default_": {
                    "_all": {
                      "enabled": true,
                      "norms": false
                    },
                    "dynamic_templates": [
                      {
                        "message_field": {
                          "path_match": "message",
                          "match_mapping_type": "string",
                          "mapping": {
                            "norms": false,
                            "type": "text"
                          }
                        }
                      },
                      {
                        "string_fields": {
                          "match": "*",
                          "match_mapping_type": "string",
                          "mapping": {
                            "fields": {
                              "keyword": {
                                "type": "keyword"
                              }
                            },
                            "norms": false,
                            "type": "text"
                          }
                        }
                      }
                    ],
                    "properties": {
                      "@timestamp": {
                        "type": "date",
                        "include_in_all": true
                      },
                      "@version": {
                        "type": "keyword",
                        "include_in_all": true
                      }
                    }
                  }
            }
        }
    '''
    es.indices.create(logstashIndex, ignore=400, body=mapping)

es.index(index=logstashIndex, doc_type='system', timestamp=timestamp, body=data)
_

datadict構造体であり、有効な_@timestamp_は次のように定義されていますdata['@timestamp'] = datetime.datetime.now()

問題は、データにタイムスタンプ値が含まれていても、Kibanaが"discovery"フィールドにエントリを表示しないことです。 :(

ElasicSearchの完全なエントリの例を次に示します。

{ "_index": "logstash-2017.06.25", "_type": "system", "_id": "AVzf3QX3iazKBndbIkg4", "_score": 1, "_source": { "priority": 6, "uid": 0, "gid": 0, "systemd_slice": "system.slice", "cap_effective": "1fffffffff", "exe": "/usr/bin/bash", "hostname": "ns3003395", "syslog_facility": 9, "comm": "crond", "systemd_cgroup": "/system.slice/cronie.service", "systemd_unit": "cronie.service", "syslog_identifier": "CROND", "message": "(root) CMD (/usr/local/rtm/bin/rtm 14 > /dev/null 2> /dev/null)", "systemd_invocation_id": "9228b6c72e6a4624a1806e4c59af8d04", "syslog_pid": 26652, "pid": 26652, "@timestamp": "2017-06-25T17:27:01.734453" } }

ご覧のとおり、IS _@timestamp_フィールドがありますが、Kibanaが期待しているものではないようです。

そして、私のエントリをKibanaで表示するにはどうすればよいかわかりません。

何か案が ?

5
chindit

Elasticsearchは@timestampを日付としてではなく、文字列として認識します。データ['@timestamp']が日時オブジェクトの場合は、自動的に認識されるISO文字列に変換してみてください。次のことを試してください。

timestamp = data.get('@timestamp').isoformat()

タイムスタンプは文字列になりますが、ISO形式です

6
ugosan