Class: ElasticGraph::HealthCheck::HealthChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/elastic_graph/health_check/health_checker.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema:, config:, datastore_search_router:, datastore_query_builder:, datastore_clients_by_name:, clock:, logger:) ⇒ HealthChecker

Returns a new instance of HealthChecker.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/elastic_graph/health_check/health_checker.rb', line 33

def initialize(
  schema:,
  config:,
  datastore_search_router:,
  datastore_query_builder:,
  datastore_clients_by_name:,
  clock:,
  logger:
)
  @schema = schema
  @datastore_search_router = datastore_search_router
  @datastore_query_builder = datastore_query_builder
  @datastore_clients_by_name = datastore_clients_by_name
  @clock = clock
  @logger = logger
  @indexed_document_types_by_name = @schema.indexed_document_types.to_h { |t| [t.name.to_s, t] }

  @config = validate_and_normalize_config(config)
end

Class Method Details

.build_from(graphql) ⇒ Object

Static factory method that builds a HealthChecker from an ElasticGraph::GraphQL instance.



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/elastic_graph/health_check/health_checker.rb', line 21

def self.build_from(graphql)
  new(
    schema: graphql.schema,
    config: HealthCheck::Config.from_parsed_yaml(graphql.config.extension_settings) || HealthCheck::Config.new,
    datastore_search_router: graphql.datastore_search_router,
    datastore_query_builder: graphql.datastore_query_builder,
    datastore_clients_by_name: graphql.datastore_core.clients_by_name,
    clock: graphql.clock,
    logger: graphql.logger
  )
end

Instance Method Details

#check_healthObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/elastic_graph/health_check/health_checker.rb', line 53

def check_health
  recency_queries_by_type_name = @config.data_recency_checks.to_h do |type_name, recency_config|
    [type_name, build_recency_query_for(type_name, recency_config)]
  end

  recency_results_by_query, *cluster_healths = execute_in_parallel(
    lambda { datastore_msearch(recency_queries_by_type_name) },
    *@config.clusters_to_consider.map do |cluster|
      lambda { [cluster, @datastore_clients_by_name.fetch(cluster).get_cluster_health] }
    end
  )

  HealthStatus.new(
    cluster_health_by_name: build_cluster_health_by_name(cluster_healths.to_h),
    latest_record_by_type: build_latest_record_by_type(recency_results_by_query, recency_queries_by_type_name)
  )
end