fluent-plugin-viaq_data_model 0.0.9 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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