logstash-filter-mutate 3.1.3 → 3.1.5

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: a56a7078074ef2704ec10834c3e7fe7a664ee647
4
- data.tar.gz: 726266e6349d2ecbb8570932c19260a029d0b321
3
+ metadata.gz: 501e5df0525fdfe75cd9037ef0c9359a5508f5b5
4
+ data.tar.gz: 544b226c746ce230aed79bff95e8570a98b70c72
5
5
  SHA512:
6
- metadata.gz: c034a0c3708ed37330f6fd18746f6fe47a1f0524417e78483c1f56b6115469b0d37da39621c8b67be9ecc187f6c0a9b30fd3f8f37f181b62ec7573ef5f66af5e
7
- data.tar.gz: b9f614d74196e90d942b87f376c8f64d4127d544126331b17b20f105bc30b61e1e9545a3d87ce093cad416b8272ab397d29e2bebb67227aa310e544ba82f9f51
6
+ metadata.gz: 76bb61eff6123e02ea18749d8e797c1617a018b2bdd66b751c0937372da059c5e23074295531c6d0191ce090d85214b3751d7d4d17ea26e827a855351870a4e4
7
+ data.tar.gz: 9729bc0839d86afe04cd8d515c9fe624c7e70cefe83d489774d98118ca9f2fe9b3deaf0fc90240f504a67c54c8eca9eabdb892c87b3268b57c843023612b942e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.1.4
2
+ - feature: Allow to copy fields.
3
+
1
4
  ## 3.1.3
2
5
  - Don't create empty fields when lower/uppercasing a non-existant field
3
6
 
data/Gemfile CHANGED
@@ -1,4 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in logstash-mass_effect.gemspec
4
3
  gemspec
4
+
5
+ logstash_path = ENV["LOGSTASH_PATH"] || "../../logstash"
6
+ use_logstash_source = ENV["LOGSTASH_SOURCE"] && ENV["LOGSTASH_SOURCE"].to_s == "1"
7
+
8
+ if Dir.exist?(logstash_path) && use_logstash_source
9
+ gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
10
+ gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
11
+ end
@@ -0,0 +1,282 @@
1
+ :plugin: mutate
2
+ :type: filter
3
+
4
+ ///////////////////////////////////////////
5
+ START - GENERATED VARIABLES, DO NOT EDIT!
6
+ ///////////////////////////////////////////
7
+ :version: %VERSION%
8
+ :release_date: %RELEASE_DATE%
9
+ :changelog_url: %CHANGELOG_URL%
10
+ :include_path: ../../../../logstash/docs/include
11
+ ///////////////////////////////////////////
12
+ END - GENERATED VARIABLES, DO NOT EDIT!
13
+ ///////////////////////////////////////////
14
+
15
+ [id="plugins-{type}-{plugin}"]
16
+
17
+ === Mutate filter plugin
18
+
19
+ include::{include_path}/plugin_header.asciidoc[]
20
+
21
+ ==== Description
22
+
23
+ The mutate filter allows you to perform general mutations on fields. You
24
+ can rename, remove, replace, and modify fields in your events.
25
+
26
+ [id="plugins-{type}s-{plugin}-options"]
27
+ ==== Mutate Filter Configuration Options
28
+
29
+ This plugin supports the following configuration options plus the <<plugins-{type}s-{plugin}-common-options>> described later.
30
+
31
+ [cols="<,<,<",options="header",]
32
+ |=======================================================================
33
+ |Setting |Input type|Required
34
+ | <<plugins-{type}s-{plugin}-convert>> |<<hash,hash>>|No
35
+ | <<plugins-{type}s-{plugin}-copy>> |<<hash,hash>>|No
36
+ | <<plugins-{type}s-{plugin}-gsub>> |<<array,array>>|No
37
+ | <<plugins-{type}s-{plugin}-join>> |<<hash,hash>>|No
38
+ | <<plugins-{type}s-{plugin}-lowercase>> |<<array,array>>|No
39
+ | <<plugins-{type}s-{plugin}-merge>> |<<hash,hash>>|No
40
+ | <<plugins-{type}s-{plugin}-rename>> |<<hash,hash>>|No
41
+ | <<plugins-{type}s-{plugin}-replace>> |<<hash,hash>>|No
42
+ | <<plugins-{type}s-{plugin}-split>> |<<hash,hash>>|No
43
+ | <<plugins-{type}s-{plugin}-strip>> |<<array,array>>|No
44
+ | <<plugins-{type}s-{plugin}-update>> |<<hash,hash>>|No
45
+ | <<plugins-{type}s-{plugin}-uppercase>> |<<array,array>>|No
46
+ |=======================================================================
47
+
48
+ Also see <<plugins-{type}s-{plugin}-common-options>> for a list of options supported by all
49
+ filter plugins.
50
+
51
+ &nbsp;
52
+
53
+ [id="plugins-{type}s-{plugin}-convert"]
54
+ ===== `convert`
55
+
56
+ * Value type is <<hash,hash>>
57
+ * There is no default value for this setting.
58
+
59
+ Convert a field's value to a different type, like turning a string to an
60
+ integer. If the field value is an array, all members will be converted.
61
+ If the field is a hash, no action will be taken.
62
+
63
+ If the conversion type is `boolean`, the acceptable values are:
64
+
65
+ * **True:** `true`, `t`, `yes`, `y`, and `1`
66
+ * **False:** `false`, `f`, `no`, `n`, and `0`
67
+
68
+ If a value other than these is provided, it will pass straight through
69
+ and log a warning message.
70
+
71
+ Valid conversion targets are: integer, float, string, and boolean.
72
+
73
+ Example:
74
+ [source,ruby]
75
+ filter {
76
+ mutate {
77
+ convert => { "fieldname" => "integer" }
78
+ }
79
+ }
80
+
81
+ [id="plugins-{type}s-{plugin}-copy"]
82
+ ===== `copy`
83
+
84
+ * Value type is <<hash,hash>>
85
+ * There is no default value for this setting.
86
+
87
+ Copy an existing field to another field. Existing target field will be overriden.
88
+
89
+ Example:
90
+ [source,ruby]
91
+ filter {
92
+ mutate {
93
+ copy => { "source_field" => "dest_field" }
94
+ }
95
+ }
96
+
97
+ [id="plugins-{type}s-{plugin}-gsub"]
98
+ ===== `gsub`
99
+
100
+ * Value type is <<array,array>>
101
+ * There is no default value for this setting.
102
+
103
+ Convert a string field by applying a regular expression and a replacement.
104
+ If the field is not a string, no action will be taken.
105
+
106
+ This configuration takes an array consisting of 3 elements per
107
+ field/substitution.
108
+
109
+ Be aware of escaping any backslash in the config file.
110
+
111
+ Example:
112
+ [source,ruby]
113
+ filter {
114
+ mutate {
115
+ gsub => [
116
+ # replace all forward slashes with underscore
117
+ "fieldname", "/", "_",
118
+ # replace backslashes, question marks, hashes, and minuses
119
+ # with a dot "."
120
+ "fieldname2", "[\\?#-]", "."
121
+ ]
122
+ }
123
+ }
124
+
125
+
126
+ [id="plugins-{type}s-{plugin}-join"]
127
+ ===== `join`
128
+
129
+ * Value type is <<hash,hash>>
130
+ * There is no default value for this setting.
131
+
132
+ Join an array with a separator character. Does nothing on non-array fields.
133
+
134
+ Example:
135
+ [source,ruby]
136
+ filter {
137
+ mutate {
138
+ join => { "fieldname" => "," }
139
+ }
140
+ }
141
+
142
+ [id="plugins-{type}s-{plugin}-lowercase"]
143
+ ===== `lowercase`
144
+
145
+ * Value type is <<array,array>>
146
+ * There is no default value for this setting.
147
+
148
+ Convert a string to its lowercase equivalent.
149
+
150
+ Example:
151
+ [source,ruby]
152
+ filter {
153
+ mutate {
154
+ lowercase => [ "fieldname" ]
155
+ }
156
+ }
157
+
158
+ [id="plugins-{type}s-{plugin}-merge"]
159
+ ===== `merge`
160
+
161
+ * Value type is <<hash,hash>>
162
+ * There is no default value for this setting.
163
+
164
+ Merge two fields of arrays or hashes.
165
+ String fields will be automatically be converted into an array, so:
166
+ ==========================
167
+ `array` + `string` will work
168
+ `string` + `string` will result in an 2 entry array in `dest_field`
169
+ `array` and `hash` will not work
170
+ ==========================
171
+ Example:
172
+ [source,ruby]
173
+ filter {
174
+ mutate {
175
+ merge => { "dest_field" => "added_field" }
176
+ }
177
+ }
178
+
179
+ [id="plugins-{type}s-{plugin}-rename"]
180
+ ===== `rename`
181
+
182
+ * Value type is <<hash,hash>>
183
+ * There is no default value for this setting.
184
+
185
+ Rename one or more fields.
186
+
187
+ Example:
188
+ [source,ruby]
189
+ filter {
190
+ mutate {
191
+ # Renames the 'HOSTORIP' field to 'client_ip'
192
+ rename => { "HOSTORIP" => "client_ip" }
193
+ }
194
+ }
195
+
196
+ [id="plugins-{type}s-{plugin}-replace"]
197
+ ===== `replace`
198
+
199
+ * Value type is <<hash,hash>>
200
+ * There is no default value for this setting.
201
+
202
+ Replace a field with a new value. The new value can include `%{foo}` strings
203
+ to help you build a new value from other parts of the event.
204
+
205
+ Example:
206
+ [source,ruby]
207
+ filter {
208
+ mutate {
209
+ replace => { "message" => "%{source_host}: My new message" }
210
+ }
211
+ }
212
+
213
+ [id="plugins-{type}s-{plugin}-split"]
214
+ ===== `split`
215
+
216
+ * Value type is <<hash,hash>>
217
+ * There is no default value for this setting.
218
+
219
+ Split a field to an array using a separator character. Only works on string
220
+ fields.
221
+
222
+ Example:
223
+ [source,ruby]
224
+ filter {
225
+ mutate {
226
+ split => { "fieldname" => "," }
227
+ }
228
+ }
229
+
230
+ [id="plugins-{type}s-{plugin}-strip"]
231
+ ===== `strip`
232
+
233
+ * Value type is <<array,array>>
234
+ * There is no default value for this setting.
235
+
236
+ Strip whitespace from field. NOTE: this only works on leading and trailing whitespace.
237
+
238
+ Example:
239
+ [source,ruby]
240
+ filter {
241
+ mutate {
242
+ strip => ["field1", "field2"]
243
+ }
244
+ }
245
+
246
+ [id="plugins-{type}s-{plugin}-update"]
247
+ ===== `update`
248
+
249
+ * Value type is <<hash,hash>>
250
+ * There is no default value for this setting.
251
+
252
+ Update an existing field with a new value. If the field does not exist,
253
+ then no action will be taken.
254
+
255
+ Example:
256
+ [source,ruby]
257
+ filter {
258
+ mutate {
259
+ update => { "sample" => "My new message" }
260
+ }
261
+ }
262
+
263
+ [id="plugins-{type}s-{plugin}-uppercase"]
264
+ ===== `uppercase`
265
+
266
+ * Value type is <<array,array>>
267
+ * There is no default value for this setting.
268
+
269
+ Convert a string to its uppercase equivalent.
270
+
271
+ Example:
272
+ [source,ruby]
273
+ filter {
274
+ mutate {
275
+ uppercase => [ "fieldname" ]
276
+ }
277
+ }
278
+
279
+
280
+
281
+ [id="plugins-{type}s-{plugin}-common-options"]
282
+ include::{include_path}/{type}.asciidoc[]
@@ -162,6 +162,17 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
162
162
  # }
163
163
  config :merge, :validate => :hash
164
164
 
165
+ # Copy an existing field to another field. Existing target field will be overriden.
166
+ # ==========================
167
+ # Example:
168
+ # [source,ruby]
169
+ # filter {
170
+ # mutate {
171
+ # copy => { "source_field" => "dest_field" }
172
+ # }
173
+ # }
174
+ config :copy, :validate => :hash
175
+
165
176
  TRUE_REGEX = (/^(true|t|yes|y|1)$/i).freeze
166
177
  FALSE_REGEX = (/^(false|f|no|n|0)$/i).freeze
167
178
  CONVERT_PREFIX = "convert_".freeze
@@ -212,6 +223,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
212
223
  split(event) if @split
213
224
  join(event) if @join
214
225
  merge(event) if @merge
226
+ copy(event) if @copy
215
227
 
216
228
  filter_matched(event)
217
229
  end
@@ -427,4 +439,12 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
427
439
  end
428
440
  end
429
441
  end
442
+
443
+ def copy(event)
444
+ @copy.each do |src_field, dest_field|
445
+ original = event.get(src_field)
446
+ next if original.nil?
447
+ event.set(dest_field,LogStash::Util.deep_clone(original))
448
+ end
449
+ end
430
450
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-mutate'
4
- s.version = '3.1.3'
4
+ s.version = '3.1.5'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "The mutate filter allows you to perform general mutations on fields. You can rename, remove, replace, and modify fields in your events."
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.require_paths = ["lib"]
12
12
 
13
13
  # Files
14
- s.files = Dir['lib/**/*','spec/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
14
+ s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "docs/**/*"]
15
15
 
16
16
  # Tests
17
17
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
@@ -10,7 +10,10 @@ unless LogStash::Environment.const_defined?(:LOGSTASH_HOME)
10
10
  end
11
11
 
12
12
  describe LogStash::Filters::Mutate do
13
- let(:pipeline) { LogStash::Pipeline.new(config) }
13
+ let(:pipeline) do
14
+ new_pipeline_from_string(config)
15
+ end
16
+
14
17
  let(:events) do
15
18
  arr = event.is_a?(Array) ? event : [event]
16
19
  arr.map do |evt|
@@ -178,6 +178,51 @@ describe LogStash::Filters::Mutate do
178
178
  end
179
179
  end
180
180
 
181
+ describe "#copy" do
182
+
183
+ let(:config) do
184
+ { "copy" => {"field" => "target" } }
185
+ end
186
+
187
+ context "when source field is a string" do
188
+
189
+ let(:attrs) { { "field" => "foobar" } }
190
+
191
+ it "should deep copy the field" do
192
+ subject.filter(event)
193
+ expect(event.get("target")).to eq(event.get("field"))
194
+ #fields should be independant
195
+ event.set("field",nil);
196
+ expect(event.get("target")).not_to eq(event.get("field"))
197
+ end
198
+ end
199
+
200
+ context "when source field is an array" do
201
+
202
+ let(:attrs) { { "field" => ["foo","bar"] } }
203
+
204
+ it "should not modify source field nil" do
205
+ subject.filter(event)
206
+ expect(event.get("target")).to eq(event.get("field"))
207
+ #fields should be independant
208
+ event.set("field",event.get("field") << "baz")
209
+ expect(event.get("target")).not_to eq(event.get("field"))
210
+ end
211
+ end
212
+
213
+ context "when source field is a hash" do
214
+
215
+ let(:attrs) { { "field" => { "foo" => "bar"} } }
216
+
217
+ it "should not modify source field nil" do
218
+ subject.filter(event)
219
+ expect(event.get("target")).to eq(event.get("field"))
220
+ #fields should be independant
221
+ event.set("[field][foo]","baz")
222
+ expect(event.get("[target][foo]")).not_to eq(event.get("[field][foo]"))
223
+ end
224
+ end
225
+ end
181
226
  end
182
227
 
183
228
  describe LogStash::Filters::Mutate do
@@ -187,7 +232,7 @@ describe LogStash::Filters::Mutate do
187
232
  config <<-CONFIG
188
233
  filter {
189
234
  mutate {
190
- convert => [ "message", "int"] //should be integer
235
+ convert => [ "message", "int"] #should be integer
191
236
  }
192
237
  }
193
238
  CONFIG
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-mutate
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.3
4
+ version: 3.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-29 00:00:00.000000000 Z
11
+ date: 2017-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +84,7 @@ files:
84
84
  - LICENSE
85
85
  - NOTICE.TXT
86
86
  - README.md
87
+ - docs/index.asciidoc
87
88
  - lib/logstash/filters/mutate.rb
88
89
  - logstash-filter-mutate.gemspec
89
90
  - spec/filters/integration/multi_stage_spec.rb