logstash-output-scalyr 0.1.22.beta → 0.1.23.beta
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/logstash/outputs/scalyr.rb +83 -65
- data/lib/scalyr/constants.rb +1 -1
- data/logstash-output-scalyr.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e2757da74eb03ea09a88597ed713db01bc050e17c31c771558bdb16a80ca40e
|
4
|
+
data.tar.gz: 1bc8519d1b30aea135d66b8b9ecfb632f688fd62abd58cd3b91cc92c4ad8957f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 327a3e2ba020f3166b0c435700bdfedf4f96598a352f1f66f45fe9e671a053ee684aa812d686a4d58b5dd9f319e8b0f87e2ea8290d876e504b8416a8010795ed
|
7
|
+
data.tar.gz: 1ba44520daddda5c17da810221063ce815af082645ae3fd12e76b031247ff8a13cb3e7dab4fbf69e84e5a876605290702785cc17639de69435f0b780a74691f9
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Beta
|
2
2
|
|
3
|
+
## 0.1.23.beta
|
4
|
+
- Add testing support for disabling estimation of serialized event size for each event in the batch.
|
5
|
+
|
3
6
|
## 0.1.22.beta
|
4
7
|
- Add new plugin metric for tracking the duration of ``build_multi_event_request_array`` method.
|
5
8
|
- Update internal dependencies (``manticore``) to latest stable version.
|
@@ -140,11 +140,17 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
140
140
|
# Whether or not to create fresh quantile estimators after a status send. Depending on what you want to gather from
|
141
141
|
# these stas this might be wanted or not.
|
142
142
|
config :flush_quantile_estimates_on_status_send, :validate => :boolean, :default => false
|
143
|
-
|
143
|
+
|
144
144
|
# Causes this plugin to act as if it successfully uploaded the logs, while actually returning as quickly as possible
|
145
145
|
# after no work being done.
|
146
146
|
config :noop_mode, :validate => :boolean, :default => false
|
147
147
|
|
148
|
+
# Set to true to disable estimiating the size of each serialized event to make sure we don't go over the max request
|
149
|
+
# size (5.5) and split batch into multiple Scalyr requests, if needed. Since this estimation is not "free", especially
|
150
|
+
# for large batches, it may make sense to disable this option when logstash batch size is configured in a way that
|
151
|
+
# Scalyr single request limit won't be reached.
|
152
|
+
config :estimate_each_event_size, :validate => :boolean, :default => true
|
153
|
+
|
148
154
|
# Manticore related options
|
149
155
|
config :http_connect_timeout, :validate => :number, :default => 10
|
150
156
|
config :http_socket_timeout, :validate => :number, :default => 10
|
@@ -316,16 +322,12 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
316
322
|
begin
|
317
323
|
records_count = events.to_a.length
|
318
324
|
|
319
|
-
# We also time the duration of the build_multi_event_request_array method
|
325
|
+
# We also time the duration of the build_multi_event_request_array method. To avoid locking twice,
|
326
|
+
# we store the duration value here and record metric at the end.
|
320
327
|
start_time = Time.now.to_f
|
321
328
|
|
322
329
|
multi_event_request_array = build_multi_event_request_array(events)
|
323
|
-
|
324
|
-
if records_count > 0
|
325
|
-
@stats_lock.synchronize do
|
326
|
-
@plugin_metrics[:build_multi_duration_secs].observe(Time.now.to_f - start_time)
|
327
|
-
end
|
328
|
-
end
|
330
|
+
build_multi_duration_secs = Time.now.to_f - start_time
|
329
331
|
|
330
332
|
# Loop over all array of multi-event requests, sending each multi-event to Scalyr
|
331
333
|
sleep_interval = @retry_initial_interval
|
@@ -439,6 +441,7 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
439
441
|
if records_count > 0
|
440
442
|
@stats_lock.synchronize do
|
441
443
|
@multi_receive_statistics[:total_multi_receive_secs] += (Time.now.to_f - start_time)
|
444
|
+
@plugin_metrics[:build_multi_duration_secs].observe(build_multi_duration_secs)
|
442
445
|
@plugin_metrics[:multi_receive_duration_secs].observe(Time.now.to_f - start_time)
|
443
446
|
@plugin_metrics[:multi_receive_event_count].observe(records_count)
|
444
447
|
@plugin_metrics[:batches_per_multi_receive].observe(total_batches)
|
@@ -675,67 +678,74 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
675
678
|
scalyr_event[:log] = logs_ids[log_identifier]
|
676
679
|
end
|
677
680
|
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
@
|
681
|
+
if @estimate_each_event_size
|
682
|
+
# get json string of event to keep track of how many bytes we are sending
|
683
|
+
begin
|
684
|
+
event_json = scalyr_event.to_json
|
685
|
+
log_json = nil
|
686
|
+
if add_log
|
687
|
+
log_json = logs[log_identifier].to_json
|
688
|
+
end
|
689
|
+
rescue JSON::GeneratorError, Encoding::UndefinedConversionError => e
|
690
|
+
@logger.warn "#{e.class}: #{e.message}"
|
691
|
+
|
692
|
+
# Send the faulty event to a label @ERROR block and allow to handle it there (output to exceptions file for ex)
|
693
|
+
# TODO
|
694
|
+
# atime = Fluent::EventTime.new( sec, nsec )
|
695
|
+
# router.emit_error_event(serverHost, time, record, e)
|
696
|
+
|
697
|
+
scalyr_event[:attrs].each do |key, value|
|
698
|
+
@logger.debug "\t#{key} (#{value.encoding.name}): '#{value}'"
|
699
|
+
scalyr_event[:attrs][key] = value.encode(
|
700
|
+
"UTF-8", :invalid => :replace, :undef => :replace, :replace => "<?>"
|
701
|
+
).force_encoding('UTF-8')
|
702
|
+
end
|
703
|
+
event_json = scalyr_event.to_json
|
704
|
+
rescue Java::JavaLang::ClassCastException => e
|
705
|
+
# Most likely we ran into the issue described here: https://github.com/flori/json/issues/336
|
706
|
+
# Because of the version of jruby logstash works with we don't have the option to just update this away,
|
707
|
+
# so if we run into it we convert bignums into strings so we can get the data in at least.
|
708
|
+
# This is fixed in JRuby 9.2.7, which includes json 2.2.0
|
709
|
+
@logger.warn("Error serializing events to JSON, likely due to the presence of Bignum values. Converting Bignum values to strings.")
|
710
|
+
@stats_lock.synchronize do
|
711
|
+
@multi_receive_statistics[:total_java_class_cast_errors] += 1
|
712
|
+
end
|
713
|
+
Scalyr::Common::Util.convert_bignums(scalyr_event)
|
714
|
+
event_json = scalyr_event.to_json
|
715
|
+
log_json = nil
|
716
|
+
if add_log
|
717
|
+
log_json = logs[log_identifier].to_json
|
718
|
+
end
|
708
719
|
end
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
720
|
+
|
721
|
+
# generate new request if json size of events in the array exceed maximum request buffer size
|
722
|
+
append_event = true
|
723
|
+
add_bytes = event_json.bytesize
|
724
|
+
if log_json
|
725
|
+
add_bytes = add_bytes + log_json.bytesize
|
714
726
|
end
|
715
|
-
end
|
716
727
|
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
728
|
+
if total_bytes + add_bytes > @max_request_buffer
|
729
|
+
# make sure we always have at least one event
|
730
|
+
if scalyr_events.size == 0
|
731
|
+
scalyr_events << scalyr_event
|
732
|
+
l_events << l_event
|
733
|
+
append_event = false
|
734
|
+
end
|
735
|
+
|
736
|
+
multi_event_request = self.create_multi_event_request(scalyr_events, l_events, current_threads, logs)
|
737
|
+
multi_event_request_array << multi_event_request
|
738
|
+
|
739
|
+
total_bytes = 0
|
740
|
+
current_threads = Hash.new
|
741
|
+
logs = Hash.new
|
742
|
+
logs_ids = Hash.new
|
743
|
+
scalyr_events = Array.new
|
744
|
+
l_events = Array.new
|
729
745
|
end
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
total_bytes = 0
|
734
|
-
current_threads = Hash.new
|
735
|
-
logs = Hash.new
|
736
|
-
logs_ids = Hash.new
|
737
|
-
scalyr_events = Array.new
|
738
|
-
l_events = Array.new
|
746
|
+
else
|
747
|
+
# If size estimation is disabled we simply append the event and handle splitting later on (if needed)
|
748
|
+
append_event = true
|
739
749
|
end
|
740
750
|
|
741
751
|
# if we haven't consumed the current event already
|
@@ -812,6 +822,14 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
812
822
|
end
|
813
823
|
end_time = Time.now.to_f
|
814
824
|
serialization_duration = end_time - start_time
|
825
|
+
|
826
|
+
serialized_request_size = serialized_body.bytesize
|
827
|
+
|
828
|
+
if serialized_request_size >= @max_request_buffer
|
829
|
+
# TODO: If we end up here is estimate config opsion is false, split the request here into multiple ones
|
830
|
+
@logger.warn("Serialized request size (#{serialized_request_size}) is larger than max_request_buffer (#{max_request_buffer})!")
|
831
|
+
end
|
832
|
+
|
815
833
|
{
|
816
834
|
:body => serialized_body, :record_count => scalyr_events.size, :serialization_duration => serialization_duration,
|
817
835
|
:logstash_events => logstash_events
|
data/lib/scalyr/constants.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
PLUGIN_VERSION = "v0.1.
|
2
|
+
PLUGIN_VERSION = "v0.1.23.beta"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-scalyr'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.23.beta'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = "Scalyr output plugin for Logstash"
|
6
6
|
s.description = "Sends log data collected by Logstash to Scalyr (https://www.scalyr.com)"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-scalyr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.23.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edward Chee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|