fluent-plugin-viaq_data_model 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a18e41903af1963acc60e14cfa67a97e1150c2e4
4
- data.tar.gz: 16197edf63812241935d2c2d29e806865bfbe7eb
3
+ metadata.gz: b9e299245761d3debf06c0c4ae48413be713f5be
4
+ data.tar.gz: aa684c6a42046d65849734c7989e3ab4f5435029
5
5
  SHA512:
6
- metadata.gz: 67b5c1ac90d3b88aa6e0d7bf27a613fe9480adec00ae22d4e7ab1ecf5287ff292744799dfafb7abdd43165d6fa7d8f0ab4ea4fe93997781e804853261ad541fa
7
- data.tar.gz: 8a459c3fa776e944a397a0bb8443ec7d245696f86ba3df9c670d4d9604855142fee65b2061f433d862ad147f3981909a2a65a5ef7578f16327a6606112fa7de5
6
+ metadata.gz: 150204ed3baf62ed86df87117935753d9f99a94cabcd8f19f75233a5f29ed353f71f0245d93f129c67b2b46c753013edba80a77bf9106d2595065502d7fd66c8
7
+ data.tar.gz: 8513d7f9af3799646c8e670c45716ab288e6f128af022d78757c36298fbce3d7c62a3702e6c8ea4b0b0b7b33bce352cf030c575d12c41b04db1e2d1f84feb669
@@ -7,7 +7,7 @@ FLUENTD_VERSION = ENV['FLUENTD_VERSION'] || "0.12.0"
7
7
 
8
8
  Gem::Specification.new do |gem|
9
9
  gem.name = "fluent-plugin-viaq_data_model"
10
- gem.version = "0.0.9"
10
+ gem.version = "0.0.11"
11
11
  gem.authors = ["Rich Megginson"]
12
12
  gem.email = ["rmeggins@redhat.com"]
13
13
  gem.description = %q{Filter plugin to ensure data is in the ViaQ common data model}
@@ -140,6 +140,8 @@ module Fluent
140
140
  config_param :elasticsearch_index_name_field, :string, default: 'viaq_index_name'
141
141
  desc 'Store the Elasticsearch index prefix in this field'
142
142
  config_param :elasticsearch_index_prefix_field, :string, default: 'viaq_index_prefix'
143
+ desc 'Optionally turn off processing of kubernetes events'
144
+ config_param :process_kubernetes_events, :bool, default: true
143
145
 
144
146
  def configure(conf)
145
147
  super
@@ -259,6 +261,7 @@ module Fluent
259
261
  end
260
262
  record['time'] = rectime.utc.to_datetime.rfc3339(6)
261
263
  end
264
+ transform_eventrouter(tag, record)
262
265
  end
263
266
 
264
267
  def check_for_match_and_format(tag, time, record)
@@ -286,14 +289,16 @@ module Fluent
286
289
  end
287
290
 
288
291
  def add_pipeline_metadata (tag, time, record)
289
- (record['pipeline_metadata'] ||= {})[@pipeline_type.to_s] = {
290
- "ipaddr4" => @ipaddr4,
291
- "ipaddr6" => @ipaddr6,
292
- "inputname" => "fluent-plugin-systemd",
293
- "name" => "fluentd",
294
- "received_at" => Time.now.utc.to_datetime.rfc3339(6),
295
- "version" => @pipeline_version
296
- }
292
+ record['pipeline_metadata'] = {} unless record.key?('pipeline_metadata')
293
+ pipeline_type = @pipeline_type.to_s
294
+ # this will catch the case where pipeline_type doesn't exist, or is not a Hash
295
+ record['pipeline_metadata'][pipeline_type] = {} unless record['pipeline_metadata'][pipeline_type].respond_to?(:fetch)
296
+ record['pipeline_metadata'][pipeline_type]['ipaddr4'] = @ipaddr4
297
+ record['pipeline_metadata'][pipeline_type]['ipaddr6'] = @ipaddr6
298
+ record['pipeline_metadata'][pipeline_type]['inputname'] = 'fluent-plugin-systemd'
299
+ record['pipeline_metadata'][pipeline_type]['name'] = 'fluentd'
300
+ record['pipeline_metadata'][pipeline_type]['received_at'] = Time.now.utc.to_datetime.rfc3339(6)
301
+ record['pipeline_metadata'][pipeline_type]['version'] = @pipeline_version
297
302
  end
298
303
 
299
304
  def add_elasticsearch_index_name_field(tag, time, record)
@@ -358,6 +363,22 @@ module Fluent
358
363
  end
359
364
  end
360
365
 
366
+ def transform_eventrouter(tag, record)
367
+ return unless @process_kubernetes_events
368
+ if record.key?("event")
369
+ if record.key?("verb")
370
+ record["event"]["verb"] = record.delete("verb")
371
+ end
372
+ record["kubernetes"] = {} unless record.key?("kubernetes")
373
+ record["kubernetes"]["event"] = record.delete("event")
374
+ if record["kubernetes"]["event"].key?('message')
375
+ ((record['pipeline_metadata'] ||= {})[@pipeline_type.to_s] ||= {})['original_raw_message'] = record['message']
376
+ end
377
+ record['message'] = record["kubernetes"]["event"].delete("message")
378
+ record['time'] = record["kubernetes"]["event"]["metadata"].delete("creationTimestamp")
379
+ end
380
+ end
381
+
361
382
  def filter(tag, time, record)
362
383
  if ENV['CDM_DEBUG']
363
384
  unless tag == ENV['CDM_DEBUG_IGNORE_TAG']
@@ -107,7 +107,8 @@ module ViaqDataModelFilterSystemd
107
107
  record['level'] = ["emerg", "alert", "crit", "err", "warning", "notice", "info", "debug", "trace", "unknown"][pri_index]
108
108
  JOURNAL_TIME_FIELDS.each do |field|
109
109
  if (val = record[field])
110
- record['time'] = Time.at(val.to_f / 1000000.0).utc.to_datetime.rfc3339(6)
110
+ vali = val.to_i
111
+ record['time'] = Time.at(vali / 1000000, vali % 1000000).utc.to_datetime.rfc3339(6)
111
112
  break
112
113
  end
113
114
  end
@@ -129,6 +130,7 @@ module ViaqDataModelFilterSystemd
129
130
  else
130
131
  record['hostname'] = record['_HOSTNAME']
131
132
  end
133
+ transform_eventrouter(tag, record)
132
134
  end
133
135
  end
134
136
  end
@@ -317,6 +317,12 @@ class ViaqDataModelFilterTest < Test::Unit::TestCase
317
317
  "UDEV_DEVLINK" =>"UDEV_DEVLINK"
318
318
  }
319
319
  end
320
+ def add_event(input)
321
+ input = input.merge({})
322
+ input['verb'] = 'ADDED'
323
+ input['event'] = {'message'=>'event message','metadata'=>{'creationTimestamp'=>'2017-07-27T17:23:46.216527+00:00'}}
324
+ input
325
+ end
320
326
  test 'match records with journal_system_record_tag' do
321
327
  rec = emit_with_tag('journal.system', {'a'=>'b', 'MESSAGE'=>'here'}, '
322
328
  <formatter>
@@ -516,6 +522,72 @@ class ViaqDataModelFilterTest < Test::Unit::TestCase
516
522
  dellist = 'log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID'.split(',')
517
523
  dellist.each{|field| assert_nil(rec[field])}
518
524
  end
525
+ test 'process a kubernetes journal record with event from eventrouter, default settings' do
526
+ ENV['IPADDR4'] = '127.0.0.1'
527
+ ENV['IPADDR6'] = '::1'
528
+ ENV['FLUENTD_VERSION'] = 'fversion'
529
+ ENV['DATA_VERSION'] = 'dversion'
530
+ input = add_event(normal_input)
531
+ rec = emit_with_tag('kubernetes.journal.container', input, '
532
+ <formatter>
533
+ tag "kubernetes.journal.container**"
534
+ type k8s_journal
535
+ remove_keys log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID
536
+ </formatter>
537
+ pipeline_type collector
538
+ ')
539
+ assert_equal(normal_output_t, rec['systemd']['t'])
540
+ assert_equal(normal_output_u, rec['systemd']['u'])
541
+ assert_equal(normal_output_k, rec['systemd']['k'])
542
+ assert_equal('ADDED', rec['kubernetes']['event']['verb'])
543
+ assert_equal('event message', rec['message'])
544
+ assert_equal('hello world', rec['pipeline_metadata']['collector']['original_raw_message'])
545
+ assert_equal('info', rec['level'])
546
+ assert_equal('myhost', rec['hostname'])
547
+ assert_equal('2017-07-27T17:23:46.216527+00:00', rec['@timestamp'])
548
+ assert_equal('127.0.0.1', rec['pipeline_metadata']['collector']['ipaddr4'])
549
+ assert_equal('::1', rec['pipeline_metadata']['collector']['ipaddr6'])
550
+ assert_equal('fluent-plugin-systemd', rec['pipeline_metadata']['collector']['inputname'])
551
+ assert_equal('fluentd', rec['pipeline_metadata']['collector']['name'])
552
+ assert_equal('fversion dversion', rec['pipeline_metadata']['collector']['version'])
553
+ assert_equal(@timestamp_str, rec['pipeline_metadata']['collector']['received_at'])
554
+ dellist = 'log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID,event,verb'.split(',')
555
+ dellist.each{|field| assert_nil(rec[field])}
556
+ end
557
+ test 'process a kubernetes journal record with event from eventrouter, disable event processing' do
558
+ ENV['IPADDR4'] = '127.0.0.1'
559
+ ENV['IPADDR6'] = '::1'
560
+ ENV['FLUENTD_VERSION'] = 'fversion'
561
+ ENV['DATA_VERSION'] = 'dversion'
562
+ input = add_event(normal_input)
563
+ rec = emit_with_tag('kubernetes.journal.container', input, '
564
+ <formatter>
565
+ tag "kubernetes.journal.container**"
566
+ type k8s_journal
567
+ remove_keys log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID
568
+ </formatter>
569
+ process_kubernetes_events false
570
+ pipeline_type collector
571
+ ')
572
+ assert_equal('ADDED', rec['verb'])
573
+ assert_equal({'message'=>'event message','metadata'=>{'creationTimestamp'=>'2017-07-27T17:23:46.216527+00:00'}}, rec['event'])
574
+ assert_equal(normal_output_t, rec['systemd']['t'])
575
+ assert_equal(normal_output_u, rec['systemd']['u'])
576
+ assert_equal(normal_output_k, rec['systemd']['k'])
577
+ assert_equal('hello world', rec['message'])
578
+ assert_equal('info', rec['level'])
579
+ assert_equal('myhost', rec['hostname'])
580
+ assert_equal('2017-07-27T17:27:46.216527+00:00', rec['@timestamp'])
581
+ assert_equal('127.0.0.1', rec['pipeline_metadata']['collector']['ipaddr4'])
582
+ assert_equal('::1', rec['pipeline_metadata']['collector']['ipaddr6'])
583
+ assert_equal('fluent-plugin-systemd', rec['pipeline_metadata']['collector']['inputname'])
584
+ assert_equal('fluentd', rec['pipeline_metadata']['collector']['name'])
585
+ assert_equal('fversion dversion', rec['pipeline_metadata']['collector']['version'])
586
+ assert_equal(@timestamp_str, rec['pipeline_metadata']['collector']['received_at'])
587
+ dellist = 'log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID'.split(',')
588
+ dellist.each{|field| assert_nil(rec[field])}
589
+ assert_nil(rec['pipeline_metadata']['collector']['original_raw_message'])
590
+ end
519
591
  test 'disable kubernetes journal record processing' do
520
592
  ENV['IPADDR4'] = '127.0.0.1'
521
593
  ENV['IPADDR6'] = '::1'
@@ -717,6 +789,35 @@ class ViaqDataModelFilterTest < Test::Unit::TestCase
717
789
  dellist = 'host,pid,ident'.split(',')
718
790
  dellist.each{|field| assert_nil(rec[field])}
719
791
  end
792
+ test 'process a k8s json-file record with event from eventrouter, default settings' do
793
+ ENV['IPADDR4'] = '127.0.0.1'
794
+ ENV['IPADDR6'] = '::1'
795
+ ENV['FLUENTD_VERSION'] = 'fversion'
796
+ ENV['DATA_VERSION'] = 'dversion'
797
+ input = {'kubernetes'=>{'host'=>'k8shost'},'stream'=>'stderr','time'=>@timestamp_str,'log'=>'mymessage'}
798
+ input = add_event(input)
799
+ rec = emit_with_tag('kubernetes.var.log.containers.name.name_this_that_other_log', input, '
800
+ <formatter>
801
+ tag "kubernetes.var.log.containers**"
802
+ type k8s_json_file
803
+ remove_keys log,stream
804
+ </formatter>
805
+ pipeline_type collector
806
+ ')
807
+ assert_equal('ADDED', rec['kubernetes']['event']['verb'])
808
+ assert_equal('event message', rec['message'])
809
+ assert_equal('mymessage', rec['pipeline_metadata']['collector']['original_raw_message'])
810
+ assert_equal('err', rec['level'])
811
+ assert_equal('2017-07-27T17:23:46.216527+00:00', rec['@timestamp'])
812
+ assert_equal('127.0.0.1', rec['pipeline_metadata']['collector']['ipaddr4'])
813
+ assert_equal('::1', rec['pipeline_metadata']['collector']['ipaddr6'])
814
+ assert_equal('fluent-plugin-systemd', rec['pipeline_metadata']['collector']['inputname'])
815
+ assert_equal('fluentd', rec['pipeline_metadata']['collector']['name'])
816
+ assert_equal('fversion dversion', rec['pipeline_metadata']['collector']['version'])
817
+ assert_equal(@timestamp_str, rec['pipeline_metadata']['collector']['received_at'])
818
+ dellist = 'host,pid,ident,event,verb'.split(',')
819
+ dellist.each{|field| assert_nil(rec[field])}
820
+ end
720
821
  test 'process a k8s json-file record with a string valued timestamp' do
721
822
  ENV['IPADDR4'] = '127.0.0.1'
722
823
  ENV['IPADDR6'] = '::1'
@@ -1126,6 +1227,31 @@ class ViaqDataModelFilterTest < Test::Unit::TestCase
1126
1227
  </elasticsearch_index_name>
1127
1228
  ')
1128
1229
  assert_equal('.operations.2017.07.27', rec['viaq_index_name'])
1129
- end
1230
+ end
1231
+ test 'construct an operations index name from a kubernetes record in an operations namespace' do
1232
+ input = normal_input.merge({})
1233
+ input['kubernetes'] = {'namespace_name'=>'default', 'namespace_id'=>'uuid'}
1234
+ rec = emit_with_tag('kubernetes.journal.container._default_', input, '
1235
+ <formatter>
1236
+ tag "journal.system**"
1237
+ type sys_journal
1238
+ remove_keys log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID
1239
+ </formatter>
1240
+ <formatter>
1241
+ tag "kubernetes.journal.container**"
1242
+ type k8s_journal
1243
+ remove_keys log,stream,MESSAGE,_SOURCE_REALTIME_TIMESTAMP,__REALTIME_TIMESTAMP,CONTAINER_ID,CONTAINER_ID_FULL,CONTAINER_NAME,PRIORITY,_BOOT_ID,_CAP_EFFECTIVE,_CMDLINE,_COMM,_EXE,_GID,_HOSTNAME,_MACHINE_ID,_PID,_SELINUX_CONTEXT,_SYSTEMD_CGROUP,_SYSTEMD_SLICE,_SYSTEMD_UNIT,_TRANSPORT,_UID,_AUDIT_LOGINUID,_AUDIT_SESSION,_SYSTEMD_OWNER_UID,_SYSTEMD_SESSION,_SYSTEMD_USER_UNIT,CODE_FILE,CODE_FUNCTION,CODE_LINE,ERRNO,MESSAGE_ID,RESULT,UNIT,_KERNEL_DEVICE,_KERNEL_SUBSYSTEM,_UDEV_SYSNAME,_UDEV_DEVNODE,_UDEV_DEVLINK,SYSLOG_FACILITY,SYSLOG_IDENTIFIER,SYSLOG_PID
1244
+ </formatter>
1245
+ <elasticsearch_index_name>
1246
+ tag "journal.system** system.var.log** **_default_** **_openshift_** **_openshift-infra_** mux.ops"
1247
+ name_type operations_full
1248
+ </elasticsearch_index_name>
1249
+ <elasticsearch_index_name>
1250
+ tag "**"
1251
+ name_type project_full
1252
+ </elasticsearch_index_name>
1253
+ ')
1254
+ assert_equal('.operations.2017.07.27', rec['viaq_index_name'])
1255
+ end
1130
1256
  end
1131
1257
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-viaq_data_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rich Megginson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-13 00:00:00.000000000 Z
11
+ date: 2017-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -147,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
147
  version: '0'
148
148
  requirements: []
149
149
  rubyforge_project:
150
- rubygems_version: 2.5.2
150
+ rubygems_version: 2.6.13
151
151
  signing_key:
152
152
  specification_version: 4
153
153
  summary: Filter plugin to ensure data is in the ViaQ common data model