module KubernetesMetadata::Common

Public Instance Methods

match_annotations(annotations) click to toggle source
# File lib/fluent/plugin/kubernetes_metadata_common.rb, line 29
def match_annotations(annotations)
  result = {}
  @annotations_regexps.each do |regexp|
    annotations.each do |key, value|
      if ::Fluent::StringUtil.match_regexp(regexp, key.to_s)
        result[key] = value
      end
    end
  end
  result
end
parse_namespace_metadata(namespace_object) click to toggle source
# File lib/fluent/plugin/kubernetes_metadata_common.rb, line 41
def parse_namespace_metadata(namespace_object)
  labels = ''
  labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless @skip_labels

  annotations = match_annotations(syms_to_strs(namespace_object[:metadata][:annotations].to_h))
  if @de_dot
    de_dot!(labels) unless @skip_labels
    de_dot!(annotations)
  end
  if @de_slash
    de_slash!(labels) unless @skip_labels
    de_slash!(annotations)
  end
  kubernetes_metadata = {
    'namespace_id' => namespace_object[:metadata][:uid],
    'creation_timestamp' => namespace_object[:metadata][:creationTimestamp]
  }
  kubernetes_metadata['namespace_labels'] = labels unless labels.empty?
  kubernetes_metadata['namespace_annotations'] = annotations unless annotations.empty?
  kubernetes_metadata
end
parse_pod_metadata(pod_object) click to toggle source
# File lib/fluent/plugin/kubernetes_metadata_common.rb, line 63
def parse_pod_metadata(pod_object)
  labels = ''
  labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless @skip_labels

  annotations = match_annotations(syms_to_strs(pod_object[:metadata][:annotations].to_h))
  if @de_dot
    de_dot!(labels) unless @skip_labels
    de_dot!(annotations)
  end
  if @de_slash
    de_slash!(labels) unless @skip_labels
    de_slash!(annotations)
  end

  # collect container information
  container_meta = {}
  begin
    pod_object[:status][:containerStatuses].each do |container_status|
      # get plain container id (eg. docker://hash -> hash)
      container_id = container_status[:containerID] ? container_status[:containerID].sub(%r{^[-_a-zA-Z0-9]+://}, '') : container_status[:name]
      container_meta[container_id] = if @skip_container_metadata
                                       {
                                         'name' => container_status[:name]
                                       }
                                     else
                                       {
                                         'name' => container_status[:name],
                                         'image' => container_status[:image],
                                         'image_id' => container_status[:imageID]
                                       }
                                     end
    end if pod_object[:status] && pod_object[:status][:containerStatuses]
  rescue StandardError=>e
    log.warn("parsing container meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}")
  end

  kubernetes_metadata = {
    'namespace_name' => pod_object[:metadata][:namespace],
    'pod_id' => pod_object[:metadata][:uid],
    'pod_name' => pod_object[:metadata][:name],
    'pod_ip' => pod_object[:status][:podIP],
    'containers' => syms_to_strs(container_meta),
    'host' => pod_object[:spec][:nodeName]
  }
  kubernetes_metadata['annotations'] = annotations unless annotations.empty?
  kubernetes_metadata['labels'] = labels unless labels.empty?
  kubernetes_metadata['master_url'] = @kubernetes_url unless @skip_master_url
  kubernetes_metadata
end
syms_to_strs(hsh) click to toggle source
# File lib/fluent/plugin/kubernetes_metadata_common.rb, line 113
def syms_to_strs(hsh)
  newhsh = {}
  hsh.each_pair do |kk, vv|
    if vv.is_a?(Hash)
      vv = syms_to_strs(vv)
    end
    if kk.is_a?(Symbol)
      newhsh[kk.to_s] = vv
    else
      newhsh[kk] = vv
    end
  end
  newhsh
end