diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-11 18:09:37 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-11 18:09:37 +0300 |
commit | a210c43e0aca0311cc1d3d381763b25979ec72dc (patch) | |
tree | 0325d173da7a6e7bd6c2cdf450d0aa1c4e142d0f /app/services/pod_logs/elasticsearch_service.rb | |
parent | c9687bdf58e9d4a9c3942f587bd4841f42e3b5de (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/pod_logs/elasticsearch_service.rb')
-rw-r--r-- | app/services/pod_logs/elasticsearch_service.rb | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/app/services/pod_logs/elasticsearch_service.rb b/app/services/pod_logs/elasticsearch_service.rb new file mode 100644 index 00000000000..7524bf7ce10 --- /dev/null +++ b/app/services/pod_logs/elasticsearch_service.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module PodLogs + class ElasticsearchService < BaseService + steps :check_arguments, + :check_param_lengths, + :get_raw_pods, + :get_pod_names, + :check_pod_name, + :check_container_name, + :check_times, + :check_search, + :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 + %w(pod_name container_name search start end) + end + + def check_times(result) + result[:start] = params['start'] if params.key?('start') && Time.iso8601(params['start']) + result[:end] = params['end'] if params.key?('end') && Time.iso8601(params['end']) + + 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 pod_logs(result) + client = cluster&.application_elastic_stack&.elasticsearch_client + return error(_('Unable to connect to Elasticsearch')) unless client + + result[:logs] = ::Gitlab::Elasticsearch::Logs.new(client).pod_logs( + namespace, + result[:pod_name], + result[:container_name], + result[:search], + result[:start], + result[:end] + ) + + 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 + end +end |