mirror of
https://github.com/elastic/logstash.git
synced 2025-04-19 04:15:23 -04:00
96 lines
3.7 KiB
Ruby
96 lines
3.7 KiB
Ruby
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
# or more contributor license agreements. Licensed under the Elastic License;
|
|
# you may not use this file except in compliance with the Elastic License.
|
|
|
|
require "logstash/bootstrap_check/default_config"
|
|
require "logstash/logging/logger"
|
|
require "logstash/errors"
|
|
|
|
java_import java.util.concurrent.TimeUnit
|
|
|
|
module LogStash
|
|
module ConfigManagement
|
|
# Override the default Logstash's bootstrap check
|
|
# instead of making the `-e` and the `-f` mandatory we rely
|
|
# on the elasticsearch source.
|
|
#
|
|
# If we don't use config management we checks for CLI flags/logstash.yml options
|
|
class BootstrapCheck
|
|
include LogStash::Util::Loggable
|
|
|
|
def self.check(settings)
|
|
check_path_config(settings)
|
|
|
|
if settings.get("config.string")
|
|
raise LogStash::BootstrapCheckError, "You cannot use -e since Elasticsearch is configured as the config store."
|
|
end
|
|
|
|
if settings.get("config.test_and_exit")
|
|
raise LogStash::BootstrapCheckError, "You cannot use -t since Elasticsearch is configured as the config store"
|
|
end
|
|
|
|
if !settings.get("modules.cli").empty? || !settings.get("modules").empty?
|
|
raise LogStash::BootstrapCheckError, "You cannot use --modules since Elasticsearch is configured as the config store"
|
|
end
|
|
|
|
interval = settings.get("xpack.management.logstash.poll_interval")
|
|
|
|
# override core settings, so the agent will trigger the auto reload
|
|
settings.set("config.reload.automatic", true)
|
|
settings.set("config.reload.interval", interval)
|
|
|
|
|
|
pipeline_ids = settings.get("xpack.management.pipeline.id")
|
|
|
|
if pipeline_ids.reject { |id| id.strip.empty? }.empty?
|
|
raise LogStash::BootstrapCheckError, "You need to specify the ID of the pipelines with the `xpack.management.pipeline.id` options in your logstash.yml"
|
|
end
|
|
|
|
duplicate_ids = find_duplicate_ids(pipeline_ids)
|
|
if duplicate_ids.size > 0
|
|
raise LogStash::BootstrapCheckError, "Duplicate pipeline ids found in `xpack.management.pipeline.id`, defined IDs must be unique, Duplicated ids: #{duplicate_ids.join(', ')}"
|
|
end
|
|
|
|
logger.info("Using Elasticsearch as config store", :pipeline_id => pipeline_ids, :poll_interval => "#{interval}ns")
|
|
end
|
|
|
|
|
|
def self.check_path_config(settings)
|
|
path_config = settings.get("path.config")
|
|
return if (path_config.nil? || path_config.empty?)
|
|
configs_count = Dir.glob(path_config).size
|
|
return if configs_count.zero?
|
|
msg = sprintf("There are config files (%i) in the '%s' folder.", configs_count, path_config)
|
|
msg.concat(" Elasticsearch is configured as the config store so configs cannot be sourced")
|
|
msg.concat(" via the command line with -f or via logstash.yml with path.config")
|
|
logger.error(msg)
|
|
raise LogStash::BootstrapCheckError, msg
|
|
end
|
|
|
|
def self.find_duplicate_ids(ids)
|
|
normalized_ids = ids.dup
|
|
.map(&:to_s)
|
|
.map(&:strip)
|
|
.map(&:downcase)
|
|
.group_by { |id| id }
|
|
|
|
duplicate_ids = []
|
|
ids.each do |id|
|
|
if normalized_ids.fetch(id.downcase).size > 1
|
|
duplicate_ids << id
|
|
end
|
|
end
|
|
|
|
# We normalize the pipeline id into lowercase string,
|
|
# this allow us to detect weird capitalized ids and all lowercase ids.
|
|
# But when reporting the ids, its more useful to the user
|
|
# report the `uniq` with the appropriate capitalization.
|
|
#
|
|
# Example:
|
|
# pipeline1, pipeline1 => ["pipeline1"]
|
|
# pipeline1, PIPELINE1 => ["pipeline1", "PIPELINE1"]
|
|
duplicate_ids.uniq
|
|
end
|
|
end
|
|
end
|
|
end
|