# # Fluentd Kubernetes Output Plugin - Enrich Fluentd events with Kubernetes # metadata # # Copyright 2015 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'open3' class Fluent::KubernetesOutput < Fluent::Output Fluent::Plugin.register_output('kubernetes', self) config_param :container_id, :string config_param :tag, :string config_param :kubernetes_pod_regex, :string, default: '^[^_]+_([^\.]+)\.[^_]+_([^\.]+)\.([^\.]+)' def initialize super end def configure(conf) super require 'docker' end def emit(tag, es, chain) es.each do |time,record| Fluent::Engine.emit('kubernetes', time, enrich_record(tag, record)) end chain.next end private def interpolate(tag, str) tag_parts = tag.split('.') str.gsub(/\$\{tag_parts\[(\d+)\]\}/) { |m| tag_parts[$1.to_i] } end def enrich_record(tag, record) if @container_id id = interpolate(tag, @container_id) record['container_id'] = id container = Docker::Container.get(id) if container container_name = container.json['Name'] if container_name record["container_name"] = container_name[1..-1] regex = Regexp.new(@kubernetes_pod_regex) match = container_name.match(regex) if match pod_container_name, pod_name, pod_namespace = match.captures record["pod_namespace"] = pod_namespace record["pod"] = pod_name record["pod_container"] = pod_container_name end end end end record end end