Понадобилось отправлять данные с файла, который содержит данные в формате json в elasticsearch. Для этого конечно я решил использовать filebeat, собственно он и служит для мониторинга файлов.

Итоговая схема доставки: filebeat -> logstash -> elasticsearch.

Настройка filebeat

Тут в целом ничего сложного просто добавляем новый input и задаём файл для мониторинга.

sudo vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tmp/*.json
  json.keys_under_root: true
  json.overwrite_keys: true
  json.add_error_key: true
  json.expand_keys: true
 
  processors:
  - add_tags:
      tags: [json-test]
sudo systemctl restart filebeat

Добавляем данные в файл

Для этого просто создаём файл json в каталоге tmp и заполняем его данными. Для генерации тестовых данных можно воспользоваться онлайн генератором.

Ошибка failed to parse field of type [keyword]

И вроде всё работает, и я получаю данные, т.е. документы появляются в index: filebeat-*, но только если я записываю в файл простой массив без вложенностей.

{"balance":"$3,357.79","picture":"http://placehold.it/32x32","eyeColor":"brown","name":"Murray Suarez","gender":"male","company":"IDEALIS","email":"murraysuarez@idealis.com","phone":"+1 (833) 600-3849","address":"986 Beverly Road, Gulf, Pennsylvania, 9249","registered":"2019-04-24T03:48:24 -06:00","greeting":"Hello, Murray Suarez! You have 10 unread messages.","favoriteFruit":"apple"}

Но вот как только я пытаюсь проиндексировать уже сложный массив я получаю ошибку: failed to parse field [friends] of type [keyword]. Ошибка появляется на этапе передачи документа в elasticsearch, т.е. на последнем этапе.

{"balance":"$1,325.77","picture":"http://placehold.it/32x32","eyeColor":"green","name":"Janette Becker","gender":"female","company":"TETAK","email":"janettebecker@tetak.com","phone":"+1 (908) 551-2528","address":"106 Coleman Street, Frizzleburg, Iowa, 1948","registered":"2020-06-08T05:07:20 -06:00","greeting":"Hello, Janette Becker! You have 5 unread messages.","favoriteFruit":"banana","friends":[{"id":0,"name":"Kristie Ewing"},{"id":1,"name":"Vance Wooten"},{"id":2,"name":"Clark Mcfadden"}]}

Решение failed to parse field of type [keyword]

Ошибка заключается в том, что elasticsearch не может правильно сопоставить тип поля. И нужно вручную сопоставить тип поля в шаблоне (mapping).

Но если там куча полей сопоставлять их вручную это ад. Один из вариантов упростить это, который я и выбрал будет просто проиндексировать всё в новый index в следствии чего автоматом сделается нормальный mapping, который мы можем дальше использовать для шаблона.

sudo vim /etc/logstash/conf.d/output.conf
output {
  if "filebeat" in [agent][type] and "json-test" in [tags] {
    elasticsearch {
      hosts => ["https://elk-1:9000","https://elk-2:9000","https://elk-3:9000"]
      index => "json-test-%{+YYYY.MM.dd}"
    }
  }
  if "filebeat" in [agent][type] and "json-test" not in [tags] {
    elasticsearch {
      hosts => ["https://elk-1:9000","https://elk-2:9000","https://elk-3:9000"]
      index => "filebeat-%{+YYYY.MM.dd}"
    }
  }
}

В итоге всё проиндексировалось, и я получил данные. Дальше можно получить весь mapping и уже дальше его использовать в своём template, ну а так как мне всё равно нужен был новый index меня всё устраивает.

Если проанализировать вывод ниже понятно, что elasticsearch пытался создать поле friends с типом keyword, тогда как тип должен быть long.

GET json-test-2021.12.08/_mapping
{
  "json-test-2021.12.08" : {
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        },
        "@version" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "agent" : {
          "properties" : {
            "ephemeral_id" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "hostname" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "id" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "type" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "version" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "balance" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "company" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "ecs" : {
          "properties" : {
            "version" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "email" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "eyeColor" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "favoriteFruit" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "friends" : {
          "properties" : {
            "id" : {
              "type" : "long"
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "gender" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "greeting" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "host" : {
          "properties" : {
            "architecture" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "containerized" : {
              "type" : "boolean"
            },
            "hostname" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "id" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "ip" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "mac" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "os" : {
              "properties" : {
                "codename" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "family" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "kernel" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "platform" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "type" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "version" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            }
          }
        },
        "input" : {
          "properties" : {
            "type" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "log" : {
          "properties" : {
            "file" : {
              "properties" : {
                "path" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "offset" : {
              "type" : "long"
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "phone" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "picture" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "registered" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}