debian-mirror-gitlab/app/services/pod_logs/elasticsearch_service.rb

94 lines
3.1 KiB
Ruby
Raw Normal View History

2020-04-08 14:13:33 +05:30
# frozen_string_literal: true
module PodLogs
class ElasticsearchService < PodLogs::BaseService
steps :check_arguments,
:get_raw_pods,
:get_pod_names,
:check_times,
:check_search,
:check_cursor,
:pod_logs,
:filter_return_keys
self.reactive_cache_worker_finder = ->(id, _cache_key, namespace, params) { new(::Clusters::Cluster.find(id), namespace, params: params) }
private
def valid_params
2020-04-22 19:07:51 +05:30
super + %w(search start_time end_time cursor)
2020-04-08 14:13:33 +05:30
end
def success_return_keys
super + %i(cursor)
end
2020-04-22 19:07:51 +05:30
def get_raw_pods(result)
client = cluster&.application_elastic_stack&.elasticsearch_client
return error(_('Unable to connect to Elasticsearch')) unless client
result[:raw_pods] = ::Gitlab::Elasticsearch::Logs::Pods.new(client).pods(namespace)
success(result)
rescue Elasticsearch::Transport::Transport::ServerError => e
::Gitlab::ErrorTracking.track_exception(e)
error(_('Elasticsearch returned status code: %{status_code}') % {
# ServerError is the parent class of exceptions named after HTTP status codes, eg: "Elasticsearch::Transport::Transport::Errors::NotFound"
# there is no method on the exception other than the class name to determine the type of error encountered.
status_code: e.class.name.split('::').last
})
end
2020-04-08 14:13:33 +05:30
def check_times(result)
2020-04-22 19:07:51 +05:30
result[:start_time] = params['start_time'] if params.key?('start_time') && Time.iso8601(params['start_time'])
result[:end_time] = params['end_time'] if params.key?('end_time') && Time.iso8601(params['end_time'])
2020-04-08 14:13:33 +05:30
success(result)
rescue ArgumentError
error(_('Invalid start or end time format'))
end
def check_search(result)
result[:search] = params['search'] if params.key?('search')
success(result)
end
def check_cursor(result)
result[:cursor] = params['cursor'] if params.key?('cursor')
success(result)
end
def pod_logs(result)
client = cluster&.application_elastic_stack&.elasticsearch_client
return error(_('Unable to connect to Elasticsearch')) unless client
2020-04-22 19:07:51 +05:30
response = ::Gitlab::Elasticsearch::Logs::Lines.new(client).pod_logs(
2020-04-08 14:13:33 +05:30
namespace,
2020-04-22 19:07:51 +05:30
pod_name: result[:pod_name],
2020-04-08 14:13:33 +05:30
container_name: result[:container_name],
search: result[:search],
2020-04-22 19:07:51 +05:30
start_time: result[:start_time],
end_time: result[:end_time],
2020-04-08 14:13:33 +05:30
cursor: result[:cursor]
)
result.merge!(response)
success(result)
rescue Elasticsearch::Transport::Transport::ServerError => e
::Gitlab::ErrorTracking.track_exception(e)
error(_('Elasticsearch returned status code: %{status_code}') % {
# ServerError is the parent class of exceptions named after HTTP status codes, eg: "Elasticsearch::Transport::Transport::Errors::NotFound"
# there is no method on the exception other than the class name to determine the type of error encountered.
status_code: e.class.name.split('::').last
})
2020-04-22 19:07:51 +05:30
rescue ::Gitlab::Elasticsearch::Logs::Lines::InvalidCursor
2020-04-08 14:13:33 +05:30
error(_('Invalid cursor value provided'))
end
end
end