Создание маппинга в Elasticsearch при помощи Fluentd

Пытаюсь создать маппинг в Elasticsearch при помощи Fluentd, к которому подключается Node.js.

Пример маппинга Elasticsearch:

PUT http://host:9200/test_mapping
{
  "mappings": {
    "properties": {
        "response_code": {
            "type": "text",
            "fielddata": true
        },
        "response_text": {
            "type": "text",
            "fielddata": true
        },
        "status": {
            "type": "boolean"
        },
        "ip": {
            "type": "ip"
        },
        "login": {
            "type": "text",
            "fielddata": true
        }
    }
  }
}

Пример конфигурации Fluentd:

<source>
  @type forward
  port 24225
</source>

<match mapping.doc>
  # Используем плагин Elasticsearch
  @type elasticsearch
  # Logstash-формат
  logstash_format "#{ENV['LOGSTASH_FORMAT']}"
  # Схема HTTP
  scheme "#{ENV['SCHEME']}"
  # Хост
  host "#{ENV['HOST']}"
  # Порт
  port "#{ENV['PORT']}"
  # index - новые данные добавляются, существующие данные переиндексируются
  write_operation index
  # Индекс
  index_name "#{ENV['INDEX_NAME']}"
  # Частота сбора данных
  flush_interval "#{ENV['FLUSH_INTERVAL']}"
</match>

Пример кода на Node.js:

// ...
require('dotenv').config();
const env = process.env;
const loggerfluentd = require('fluent-logger');
loggerfluentd.configure('mapping', {
            host: env.FLUENTD_HOST,
            port: Number.parseInt(env.FLUENTD_PORT),
            timeout: 3.0,
            reconnectInterval: 10000 // 10 sec
        });

function EmitMapping(data) {
    loggerfluentd.emit(env.INDEX_NAME, data);
}

exports.EmitMapping = EmitMapping;

Такая конфигурация не создает маппинг, а просто добавляет новые документы в Elasticsearch.

Возможно ли изменить конфигурацию так, чтобы выполнив функцию EmitMapping() не добавлять новые документы (с автоматически присвоенными типами данных в маппинге), а именно создать свой собственный маппинг со своими типами данных?


Ответы (1 шт):

Автор решения: fedor-sg

Есть вероятность, что плагин elasticsearch не создает и не изменяет индекс, а просто пишет в индекс, потому я воспользовался плагином http:

<match mapping.doc>
  # Используем плагин HTTP
  @type http
  # Точка входа
  endpoint "#{ENV['SCHEME']}://#{ENV['HOST']}:#{ENV['PORT']}/#{ENV['INDEX_NAME']}"
  # HTTP-метод
  http_method put
  # Заголовки
  headers {"Content-Type":"application/json"}
  # Тайм-аут открытия соединения в секундах
  open_timeout 2
  <buffer>
    flush_interval "#{ENV['FLUSH_INTERVAL']}"
  </buffer>
</match>
→ Ссылка