logstash-output-honeycomb_json_batch 0.1.1 → 0.1.2

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: 2b2a7b660d8b854fb0607a4fa80dabe4329e4e41
4
- data.tar.gz: c0bf451645c3755d6c7ac39cdb031f7ab08b6516
3
+ metadata.gz: c90c885174ae440377b402eac734980422d3192d
4
+ data.tar.gz: c6e29760a336290dece1dd18bbc33f10b2b2fd2d
5
5
  SHA512:
6
- metadata.gz: f5055fc55d3cbd3be58411d4565894df2eb5f9f68f6fb711c5590e6e4613cc57565ed1ba5e556eb7f3c0d3da2961cd6797ee8fb1a86084fd6900368ea7116425
7
- data.tar.gz: 379e0423f7822931c219a15e3f0a379d30f9f869fa48a71c0d901754840dfe502f921229abb8db1a68e52c8c61bb8aea4929be2804d3cf288087002ee5b30e83
6
+ metadata.gz: b9c755b2655e7218d4141c822a0a784cc1fc6006f943c891c1d7d2a993ce2f1c7436717dca1c860a9e016ce8cde6355f4a4c8f98647240d4951b855fca7986d1
7
+ data.tar.gz: 6584d584c082375794988dd6cbe94c4410acc89d478c760ff62c03de8f5817421b4e358f6a6d4956285ada7c8da390441f0d2f09c880aab910fcf168cea49866
data/README.md CHANGED
@@ -34,6 +34,39 @@ output {
34
34
  }
35
35
  ```
36
36
 
37
+ Additional arguments to `honeycomb_json_batch`:
38
+
39
+ Consider these when tuning performance:
40
+
41
+ - `flush_size`: Default batch size, defaults to 50
42
+ - `idle_flush_time`: Default flush interval in seconds, defaults to 5
43
+ - `pool_max`: Maximum number of requests to be run in parallel, defaults to 10
44
+ - `retry_individual`: On failed requests, whether to retry event sends individually, defaults to true
45
+ - `api_host`: Allows you to override the Honeycomb host, defaults to https://api.honeycomb.io
46
+
47
+ Special logstash fields that will be extracted:
48
+
49
+ - `@timestamp`: Logstash events contain timestamps by default, and this output will extract it for use as the Honeycomb timestamp
50
+ - `@samplerate`: If this special field is populated (e.g. via the `filter` section, this particular event will be weighted as `@samplerate` events in Honeycomb). See the **Sampling** section below.
51
+
52
+ ### Sampling
53
+
54
+ High volume sites may want to send only a fraction of all traffic to Honeycomb. The drop filter can drop a portion of your traffic, and a mutate filter will ensure that Honeycomb understands that transmitted events are coming through as the result of sampling.
55
+
56
+ ```
57
+ filter {
58
+ drop {
59
+ # keep 1/4 of the event stream
60
+ percentage => 75
61
+ }
62
+ mutate {
63
+ add_field => {
64
+ # the events that do make it through represent 4 events
65
+ "@samplerate" => "4"
66
+ }
67
+ }
68
+ }
69
+ ```
37
70
 
38
71
  ## Development
39
72
 
@@ -12,7 +12,6 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
12
12
 
13
13
  config_name "honeycomb_json_batch"
14
14
 
15
- # URL host to use, defaults to https://api.honeycomb.io
16
15
  config :api_host, :validate => :string
17
16
 
18
17
  config :write_key, :validate => :string, :required => true
@@ -25,7 +24,7 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
25
24
 
26
25
  config :retry_individual, :validate => :boolean, :default => true
27
26
 
28
- config :pool_max, :validate => :number, :default => 50
27
+ config :pool_max, :validate => :number, :default => 10
29
28
 
30
29
  def register
31
30
  # We count outstanding requests with this queue
@@ -64,6 +63,11 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
64
63
  buffer_receive(event)
65
64
  end
66
65
 
66
+ def close
67
+ buffer_flush(:final => true)
68
+ client.close
69
+ end
70
+
67
71
  public
68
72
  def flush(events, close=false)
69
73
  documents = [] #this is the array of hashes that we push to Fusion as documents
@@ -71,7 +75,11 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
71
75
  events.each do |event|
72
76
  data = event.to_hash()
73
77
  timestamp = data.delete("@timestamp")
74
- documents.push({ "time" => timestamp, "data" => data })
78
+ doc = { "time" => timestamp, "data" => data }
79
+ if samplerate = data.delete("@samplerate")
80
+ doc["samplerate"] = samplerate.to_i
81
+ end
82
+ documents.push(doc)
75
83
  end
76
84
 
77
85
  make_request(documents)
@@ -116,8 +124,11 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
116
124
  :total => @total)
117
125
  else
118
126
  if documents.length > 1 && @retry_individual
119
- documents.each do |doc|
120
- make_request([doc])
127
+ if statuses = JSON.parse(response.body).values.first
128
+ status.each_with_index do |status, i|
129
+ next if status >= 200 && status < 300
130
+ make_request([documents[i]])
131
+ end
121
132
  end
122
133
  else
123
134
  @total_failed += documents.length
@@ -147,14 +158,14 @@ class LogStash::Outputs::HoneycombJSONBatch < LogStash::Outputs::Base
147
158
  )
148
159
  end
149
160
 
150
- Thread.new do
151
- client.execute!
152
- end
161
+ client.execute!
162
+ rescue Exception => e
163
+ log_failure("Got totally unexpected exception #{e.message}", :docs => documents.length)
153
164
  end
154
165
 
155
166
  # This is split into a separate method mostly to help testing
156
167
  def log_failure(message, opts)
157
- @logger.error("[HTTP Output Failure] #{message}", opts)
168
+ @logger.error("[Honeycomb Batch Output Failure] #{message}", opts)
158
169
  end
159
170
 
160
171
  def request_headers()
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-honeycomb_json_batch'
3
- s.version = '0.1.1'
3
+ s.version = '0.1.2'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = "This output lets you `POST` batches of events to the Honeycomb.io API endpoint"
6
6
  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"
@@ -76,6 +76,22 @@ describe LogStash::Outputs::HoneycombJSONBatch do
76
76
  @honeycomb.buffer_flush(:force => true)
77
77
  end
78
78
 
79
+ it "should extract timestamp and samplerate from the data" do
80
+ with_samplerate = LogStash::Event.new("alpha" => 1.0, "@samplerate" => "17.5")
81
+ data = with_samplerate.to_hash()
82
+ data.delete("@timestamp")
83
+ data.delete("@samplerate")
84
+
85
+ expect(client).to receive(:post).
86
+ with("#{ api_host }/1/batch", hash_including(:body => LogStash::Json.dump({
87
+ DATASET => [ { "time" => event.timestamp.to_s, "data" => data, "samplerate" => 17 } ]
88
+ }))).once.
89
+ and_call_original
90
+
91
+ @honeycomb.receive(with_samplerate)
92
+ @honeycomb.buffer_flush(:force => true)
93
+ end
94
+
79
95
  it "should wrap multiple events up in the right structure" do
80
96
  event1 = LogStash::Event.new("alpha" => 1.0)
81
97
  event2 = LogStash::Event.new("beta" => 2.0)
metadata CHANGED
@@ -1,107 +1,105 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-honeycomb_json_batch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Honeycomb
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-31 00:00:00.000000000 Z
11
+ date: 2017-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: logstash-core-plugin-api
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - '>='
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '1.60'
20
- - - <=
19
+ - - "<="
21
20
  - !ruby/object:Gem::Version
22
21
  version: '2.99'
23
- type: :runtime
22
+ name: logstash-core-plugin-api
24
23
  prerelease: false
24
+ type: :runtime
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - '>='
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.60'
30
- - - <=
30
+ - - "<="
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.99'
33
33
  - !ruby/object:Gem::Dependency
34
- name: logstash-mixin-http_client
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
- - - '>='
36
+ - - ">="
38
37
  - !ruby/object:Gem::Version
39
38
  version: 2.2.1
40
- - - <
39
+ - - "<"
41
40
  - !ruby/object:Gem::Version
42
41
  version: 5.0.0
43
- type: :runtime
42
+ name: logstash-mixin-http_client
44
43
  prerelease: false
44
+ type: :runtime
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: 2.2.1
50
- - - <
50
+ - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: 5.0.0
53
53
  - !ruby/object:Gem::Dependency
54
- name: logstash-devutils
55
54
  requirement: !ruby/object:Gem::Requirement
56
55
  requirements:
57
- - - '>='
56
+ - - ">="
58
57
  - !ruby/object:Gem::Version
59
58
  version: '0'
60
- type: :development
59
+ name: logstash-devutils
61
60
  prerelease: false
61
+ type: :development
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - '>='
64
+ - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: '0'
67
- description: This gem is a Logstash plugin required to be installed on top of the
68
- Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
69
- gem is not a stand-alone program
67
+ 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
70
68
  email: support@honeycomb.io
71
69
  executables: []
72
70
  extensions: []
73
71
  extra_rdoc_files: []
74
72
  files:
75
- - lib/logstash/outputs/honeycomb_json_batch.rb
76
- - spec/outputs/honeycomb_json_batch_spec.rb
77
- - logstash-output-honeycomb_json_batch.gemspec
78
- - README.md
79
73
  - Gemfile
80
74
  - LICENSE
75
+ - README.md
76
+ - lib/logstash/outputs/honeycomb_json_batch.rb
77
+ - logstash-output-honeycomb_json_batch.gemspec
78
+ - spec/outputs/honeycomb_json_batch_spec.rb
81
79
  homepage: https://honeycomb.io
82
80
  licenses:
83
81
  - Apache-2.0
84
82
  metadata:
85
83
  logstash_plugin: 'true'
86
84
  logstash_group: output
87
- post_install_message:
85
+ post_install_message:
88
86
  rdoc_options: []
89
87
  require_paths:
90
88
  - lib
91
89
  required_ruby_version: !ruby/object:Gem::Requirement
92
90
  requirements:
93
- - - '>='
91
+ - - ">="
94
92
  - !ruby/object:Gem::Version
95
93
  version: '0'
96
94
  required_rubygems_version: !ruby/object:Gem::Requirement
97
95
  requirements:
98
- - - '>='
96
+ - - ">="
99
97
  - !ruby/object:Gem::Version
100
98
  version: '0'
101
99
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.0.14.1
104
- signing_key:
100
+ rubyforge_project:
101
+ rubygems_version: 2.6.8
102
+ signing_key:
105
103
  specification_version: 4
106
104
  summary: This output lets you `POST` batches of events to the Honeycomb.io API endpoint
107
105
  test_files: