diff options
Diffstat (limited to 'app/services/pod_logs')
-rw-r--r-- | app/services/pod_logs/base_service.rb | 6 | ||||
-rw-r--r-- | app/services/pod_logs/elasticsearch_service.rb | 21 | ||||
-rw-r--r-- | app/services/pod_logs/kubernetes_service.rb | 19 |
3 files changed, 36 insertions, 10 deletions
diff --git a/app/services/pod_logs/base_service.rb b/app/services/pod_logs/base_service.rb index 8cc8fb913a2..2451ab8e0ce 100644 --- a/app/services/pod_logs/base_service.rb +++ b/app/services/pod_logs/base_service.rb @@ -62,13 +62,11 @@ module PodLogs end def get_raw_pods(result) - result[:raw_pods] = cluster.kubeclient.get_pods(namespace: namespace) - - success(result) + raise NotImplementedError end def get_pod_names(result) - result[:pods] = result[:raw_pods].map(&:metadata).map(&:name) + result[:pods] = result[:raw_pods].map { |p| p[:name] } success(result) end diff --git a/app/services/pod_logs/elasticsearch_service.rb b/app/services/pod_logs/elasticsearch_service.rb index 0a5185999ab..aac0fa424ca 100644 --- a/app/services/pod_logs/elasticsearch_service.rb +++ b/app/services/pod_logs/elasticsearch_service.rb @@ -23,6 +23,23 @@ module PodLogs super + %i(cursor) end + 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 + def check_times(result) 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']) @@ -48,7 +65,7 @@ module PodLogs client = cluster&.application_elastic_stack&.elasticsearch_client return error(_('Unable to connect to Elasticsearch')) unless client - response = ::Gitlab::Elasticsearch::Logs.new(client).pod_logs( + response = ::Gitlab::Elasticsearch::Logs::Lines.new(client).pod_logs( namespace, pod_name: result[:pod_name], container_name: result[:container_name], @@ -69,7 +86,7 @@ module PodLogs # 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 }) - rescue ::Gitlab::Elasticsearch::Logs::InvalidCursor + rescue ::Gitlab::Elasticsearch::Logs::Lines::InvalidCursor error(_('Invalid cursor value provided')) end end diff --git a/app/services/pod_logs/kubernetes_service.rb b/app/services/pod_logs/kubernetes_service.rb index 31e26912c73..0a8072a9037 100644 --- a/app/services/pod_logs/kubernetes_service.rb +++ b/app/services/pod_logs/kubernetes_service.rb @@ -21,6 +21,17 @@ module PodLogs private + def get_raw_pods(result) + result[:raw_pods] = cluster.kubeclient.get_pods(namespace: namespace).map do |pod| + { + name: pod.metadata.name, + container_names: pod.spec.containers.map(&:name) + } + end + + success(result) + end + def check_pod_name(result) # If pod_name is not received as parameter, get the pod logs of the first # pod of this namespace. @@ -43,11 +54,11 @@ module PodLogs end def check_container_name(result) - pod_details = result[:raw_pods].find { |p| p.metadata.name == result[:pod_name] } - containers = pod_details.spec.containers.map(&:name) + pod_details = result[:raw_pods].find { |p| p[:name] == result[:pod_name] } + container_names = pod_details[:container_names] # select first container if not specified - result[:container_name] ||= containers.first + result[:container_name] ||= container_names.first unless result[:container_name] return error(_('No containers available')) @@ -58,7 +69,7 @@ module PodLogs ' %{max_length} chars' % { max_length: K8S_NAME_MAX_LENGTH })) end - unless containers.include?(result[:container_name]) + unless container_names.include?(result[:container_name]) return error(_('Container does not exist')) end |