honeycomb-beeline 2.1.2 → 2.2.0

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
  SHA256:
3
- metadata.gz: 7f19c4aff5f79d28bb532e24562c1070a1e4f6b2ee86d627e114a4fad388539f
4
- data.tar.gz: f4a64e080f22e85e32e3e75b8655c8bd7e126ef67d6b928a69089df3ee57f4cf
3
+ metadata.gz: 861b65eb2d7ef9f82cad990b966247465eebb0eac7ec4fa6d668491d979e9eee
4
+ data.tar.gz: 2e1b7ef3a15d2b2be27a4593eafabe399331909df925724abc3978cc47aed01c
5
5
  SHA512:
6
- metadata.gz: 8d6289b4ad7b7e1e82520925f59096761be2adff0c028a503676b692039138d3c0501df71b9a2fe6b2687fe592cc5abdcc6447476553bf0ca73eb630e7f9a43f
7
- data.tar.gz: cf4f69a76786874d9e1e0cc2ef016365412613e9113913b863d0c7240e0cc034e8aa528ffc17cf54c95886ebc1cf6010a986a419ea59cfd4c82a45c3ec054224
6
+ metadata.gz: b50cd4118393ff03349894bb4942bb166baafb51fdf587b76a5e8f1b34411d2a49c8698cc9bb8f28746211143f93bf88e5fc23de13479acbd526383f7065410d
7
+ data.tar.gz: f123f2ad239e1f72874199999d08a8b3137b318f1d92d9a295b3bfdb4d17d8097c3577ebca666e7b26d0d9d5940fe6b6db2ec92f9028dfbffa1740898e43281c
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- honeycomb-beeline (2.1.2)
4
+ honeycomb-beeline (2.2.0)
5
5
  libhoney (~> 1.14, >= 1.14.2)
6
6
 
7
7
  GEM
@@ -19,6 +19,9 @@ GEM
19
19
  byebug (10.0.2)
20
20
  childprocess (0.9.0)
21
21
  ffi (~> 1.0, >= 1.0.11)
22
+ codecov (0.2.8)
23
+ json
24
+ simplecov
22
25
  coderay (1.1.2)
23
26
  crack (0.4.3)
24
27
  safe_yaml (~> 1.0.0)
@@ -43,6 +46,7 @@ GEM
43
46
  ffi-compiler (>= 1.0, < 2.0)
44
47
  iniparse (1.5.0)
45
48
  jaro_winkler (1.5.4)
49
+ json (2.3.1)
46
50
  libhoney (1.14.5)
47
51
  addressable (~> 2.0)
48
52
  http (>= 2.0, < 5.0)
@@ -113,6 +117,7 @@ DEPENDENCIES
113
117
  appraisal
114
118
  bump
115
119
  bundler
120
+ codecov
116
121
  honeycomb-beeline!
117
122
  overcommit (~> 0.46.0)
118
123
  pry (< 0.13.0)
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Build Status](https://circleci.com/gh/honeycombio/beeline-ruby.svg?style=svg)](https://circleci.com/gh/honeycombio/beeline-ruby)
4
4
  [![Gem Version](https://badge.fury.io/rb/honeycomb-beeline.svg)](https://badge.fury.io/rb/honeycomb-beeline)
5
+ [![codecov](https://codecov.io/gh/honeycombio/beeline-ruby/branch/main/graph/badge.svg)](https://codecov.io/gh/honeycombio/beeline-ruby)
5
6
 
6
7
  This package makes it easy to instrument your Ruby web app to send useful events to [Honeycomb](https://www.honeycomb.io), a service for debugging your software in production.
7
8
  - [Usage and Examples](https://docs.honeycomb.io/getting-data-in/beelines/ruby-beeline/)
@@ -42,6 +42,7 @@ Gem::Specification.new do |spec|
42
42
  spec.add_development_dependency "appraisal"
43
43
  spec.add_development_dependency "bump"
44
44
  spec.add_development_dependency "bundler"
45
+ spec.add_development_dependency "codecov"
45
46
  spec.add_development_dependency "overcommit", "~> 0.46.0"
46
47
  spec.add_development_dependency "pry", "< 0.13.0"
47
48
  spec.add_development_dependency "pry-byebug", "~> 3.6.0"
@@ -3,7 +3,7 @@
3
3
  module Honeycomb
4
4
  module Beeline
5
5
  NAME = "honeycomb-beeline".freeze
6
- VERSION = "2.1.2".freeze
6
+ VERSION = "2.2.0".freeze
7
7
  USER_AGENT_SUFFIX = "#{NAME}/#{VERSION}".freeze
8
8
  end
9
9
  end
@@ -4,63 +4,16 @@ require "base64"
4
4
  require "json"
5
5
  require "uri"
6
6
 
7
+ require "honeycomb/propagation/honeycomb"
8
+
7
9
  module Honeycomb
8
10
  # Parse trace headers
9
11
  module PropagationParser
10
- def parse(serialized_trace)
11
- unless serialized_trace.nil?
12
- version, payload = serialized_trace.split(";", 2)
13
-
14
- if version == "1"
15
- trace_id, parent_span_id, trace_fields, dataset = parse_v1(payload)
16
-
17
- if !trace_id.nil? && !parent_span_id.nil?
18
- return [trace_id, parent_span_id, trace_fields, dataset]
19
- end
20
- end
21
- end
22
-
23
- [nil, nil, nil, nil]
24
- end
25
-
26
- def parse_v1(payload)
27
- trace_id, parent_span_id, trace_fields, dataset = nil
28
- payload.split(",").each do |entry|
29
- key, value = entry.split("=", 2)
30
- case key
31
- when "dataset"
32
- dataset = URI.decode_www_form_component(value)
33
- when "trace_id"
34
- trace_id = value
35
- when "parent_id"
36
- parent_span_id = value
37
- when "context"
38
- Base64.decode64(value).tap do |json|
39
- begin
40
- trace_fields = JSON.parse json
41
- rescue JSON::ParserError
42
- trace_fields = {}
43
- end
44
- end
45
- end
46
- end
47
-
48
- [trace_id, parent_span_id, trace_fields, dataset]
49
- end
12
+ include HoneycombPropagation::UnmarshalTraceContext
50
13
  end
51
14
 
52
15
  # Serialize trace headers
53
16
  module PropagationSerializer
54
- def to_trace_header
55
- context = Base64.urlsafe_encode64(JSON.generate(trace.fields)).strip
56
- encoded_dataset = URI.encode_www_form_component(builder.dataset)
57
- data_to_propogate = [
58
- "dataset=#{encoded_dataset}",
59
- "trace_id=#{trace.id}",
60
- "parent_id=#{id}",
61
- "context=#{context}",
62
- ]
63
- "1;#{data_to_propogate.join(',')}"
64
- end
17
+ include HoneycombPropagation::MarshalTraceContext
65
18
  end
66
19
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Honeycomb
4
+ # Parsing and propagation for AWS trace headers
5
+ module AWSPropagation
6
+ # Parse trace headers
7
+ module UnmarshalTraceContext
8
+ def parse(serialized_trace)
9
+ unless serialized_trace.nil?
10
+ split = serialized_trace.split(";")
11
+
12
+ trace_id, parent_span_id, trace_fields = get_fields(split)
13
+
14
+ parent_span_id = trace_id if parent_span_id.nil?
15
+
16
+ trace_fields = nil if trace_fields.empty?
17
+
18
+ if !trace_id.nil? && !parent_span_id.nil?
19
+ # return nil for dataset
20
+ return [trace_id, parent_span_id, trace_fields, nil]
21
+ end
22
+ end
23
+
24
+ [nil, nil, nil, nil]
25
+ end
26
+
27
+ def get_fields(fields)
28
+ trace_id, parent_span_id = nil
29
+ trace_fields = {}
30
+ fields.each do |entry|
31
+ key, value = entry.split("=", 2)
32
+ case key.downcase
33
+ when "root"
34
+ trace_id = value
35
+ when "self"
36
+ parent_span_id = value
37
+ when "parent"
38
+ parent_span_id = value if parent_span_id.nil?
39
+ else
40
+ trace_fields[key] = value unless key.empty?
41
+ end
42
+ end
43
+
44
+ [trace_id, parent_span_id, trace_fields]
45
+ end
46
+ end
47
+
48
+ # Serialize trace headers
49
+ module MarshalTraceContext
50
+ def to_trace_header
51
+ context = [""]
52
+ unless trace.fields.keys.nil?
53
+ trace.fields.keys.each do |key|
54
+ context.push("#{key}=#{trace.fields[key]}")
55
+ end
56
+ end
57
+
58
+ data_to_propagate = [
59
+ "Root=#{trace.id}",
60
+ "Parent=#{id}",
61
+ ]
62
+ "#{data_to_propagate.join(';')}#{context.join(';')}"
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "json"
5
+ require "uri"
6
+
7
+ module Honeycomb
8
+ # Parsing and propagation for honeycomb trace headers
9
+ module HoneycombPropagation
10
+ # Parse trace headers
11
+ module UnmarshalTraceContext
12
+ def parse(serialized_trace)
13
+ unless serialized_trace.nil?
14
+ version, payload = serialized_trace.split(";", 2)
15
+
16
+ if version == "1"
17
+ trace_id, parent_span_id, trace_fields, dataset = parse_v1(payload)
18
+
19
+ if !trace_id.nil? && !parent_span_id.nil?
20
+ return [trace_id, parent_span_id, trace_fields, dataset]
21
+ end
22
+ end
23
+ end
24
+
25
+ [nil, nil, nil, nil]
26
+ end
27
+
28
+ def parse_v1(payload)
29
+ trace_id, parent_span_id, trace_fields, dataset = nil
30
+ payload.split(",").each do |entry|
31
+ key, value = entry.split("=", 2)
32
+ case key.downcase
33
+ when "dataset"
34
+ dataset = URI.decode_www_form_component(value)
35
+ when "trace_id"
36
+ trace_id = value
37
+ when "parent_id"
38
+ parent_span_id = value
39
+ when "context"
40
+ Base64.decode64(value).tap do |json|
41
+ begin
42
+ trace_fields = JSON.parse json
43
+ rescue JSON::ParserError
44
+ trace_fields = {}
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ [trace_id, parent_span_id, trace_fields, dataset]
51
+ end
52
+ end
53
+
54
+ # Serialize trace headers
55
+ module MarshalTraceContext
56
+ def to_trace_header
57
+ context = Base64.urlsafe_encode64(JSON.generate(trace.fields)).strip
58
+ encoded_dataset = URI.encode_www_form_component(builder.dataset)
59
+ data_to_propogate = [
60
+ "dataset=#{encoded_dataset}",
61
+ "trace_id=#{trace.id}",
62
+ "parent_id=#{id}",
63
+ "context=#{context}",
64
+ ]
65
+ "1;#{data_to_propogate.join(',')}"
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Honeycomb
4
+ # Parsing and propagation for W3C trace headers
5
+ module W3CPropagation
6
+ # Parse trace headers
7
+ module UnmarshalTraceContext
8
+ INVALID_TRACE_ID = "00000000000000000000000000000000".freeze
9
+ INVALID_SPAN_ID = "0000000000000000".freeze
10
+
11
+ def parse(serialized_trace)
12
+ unless serialized_trace.nil?
13
+ version, payload = serialized_trace.split("-", 2)
14
+ # version should be 2 hex characters
15
+ if version =~ /^[A-Fa-f0-9]{2}$/
16
+ trace_id, parent_span_id = parse_v1(payload)
17
+
18
+ if !trace_id.nil? && !parent_span_id.nil?
19
+ # return nil for dataset
20
+ return [trace_id, parent_span_id, nil, nil]
21
+ end
22
+ end
23
+ end
24
+ [nil, nil, nil, nil]
25
+ end
26
+
27
+ def parse_v1(payload)
28
+ trace_id, parent_span_id, trace_flags = payload.split("-", 3)
29
+
30
+ if trace_flags.nil?
31
+ # if trace_flags is nil, it means a field is missing
32
+ return [nil, nil]
33
+ end
34
+
35
+ if trace_id == INVALID_TRACE_ID || parent_span_id == INVALID_SPAN_ID
36
+ return [nil, nil]
37
+ end
38
+
39
+ [trace_id, parent_span_id]
40
+ end
41
+ end
42
+
43
+ # Serialize trace headers
44
+ module MarshalTraceContext
45
+ def to_trace_header
46
+ # do not propagate malformed ids
47
+ if trace.id =~ /^[A-Fa-f0-9]{32}$/ && id =~ /^[A-Fa-f0-9]{16}$/
48
+ return "00-#{trace.id}-#{id}-01"
49
+ end
50
+
51
+ nil
52
+ end
53
+ end
54
+ end
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeycomb-beeline
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Holman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-26 00:00:00.000000000 Z
11
+ date: 2020-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: libhoney
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: codecov
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: overcommit
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -259,6 +273,9 @@ files:
259
273
  - lib/honeycomb/integrations/sinatra.rb
260
274
  - lib/honeycomb/integrations/warden.rb
261
275
  - lib/honeycomb/propagation.rb
276
+ - lib/honeycomb/propagation/aws.rb
277
+ - lib/honeycomb/propagation/honeycomb.rb
278
+ - lib/honeycomb/propagation/w3c.rb
262
279
  - lib/honeycomb/rollup_fields.rb
263
280
  - lib/honeycomb/span.rb
264
281
  - lib/honeycomb/trace.rb