fluentd-sentry-output 0.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/fluent/plugin/out_sentry.rb +137 -0
  3. metadata +43 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: db79c0915f16f98dbce0b660d5550f73c29a4683ee31894cd4a493a9358e3321
4
+ data.tar.gz: 4f955c3c65976e70b81bc4599a84a4568a0f04352e705248ecbbbe2aace5ec6f
5
+ SHA512:
6
+ metadata.gz: 8382652f3e751c788438f3b0c3d6ebdd1e6586fda2142fd34ab87bdc9a4bee954e0440bb0797e78d3a15d3f2aaff22c0355a9e2e9d4cc87aced259ef2b2d2998
7
+ data.tar.gz: 8c9c19411b292f999fa6067ab8c72da63d27eae2be3a42f7bdc8c61c4c5554482d01b0c2fd4bfd18d2240501f003440f6d9248ba5ab33000f0db19ecf097eebb
@@ -0,0 +1,137 @@
1
+ require 'fluent/plugin/output'
2
+ require 'fluent/plugin_helper/thread'
3
+ require 'net/http'
4
+ require 'json'
5
+
6
+ class SentryException
7
+ attr_accessor :values
8
+
9
+ def initialize(exception)
10
+ self.values = []
11
+ trace = {}
12
+ trace['stacktrace'] = {}
13
+ trace['stacktrace']['frames'] = []
14
+ values.push(trace)
15
+
16
+ frames = exception['frames']
17
+ frames.each do |frame|
18
+ add_values(frame)
19
+ end
20
+
21
+ add_error_type_and_message(exception['error_type'], exception['error_message'])
22
+ values[0]['mechanism'] = {}
23
+ values[0]['mechanism']['type'] = 'generic'
24
+ values[0]['mechanism']['handled'] = true
25
+ end
26
+
27
+ def add_values(frame)
28
+ sentry_frame = {
29
+ in_app: frame['in_app'] || false,
30
+ function: frame['function_name'] || nil,
31
+ filename: frame['filename'] || nil,
32
+ lineno: frame['line_number'] || nil,
33
+ colno: frame['column_number'] || nil
34
+ }
35
+
36
+ values[0]['stacktrace']['frames'].push(sentry_frame)
37
+ end
38
+
39
+ def add_error_type_and_message(type, message)
40
+ values[0]['type'] = type
41
+ values[0]['value'] = message
42
+ end
43
+
44
+ def to_json(*_args)
45
+ hash = {}
46
+ instance_variables.each do |var|
47
+ hash[var.to_s.delete '@'] = instance_variable_get var
48
+ end
49
+ hash.to_json
50
+ end
51
+ end
52
+
53
+ class SentryMessageFormat
54
+ attr_accessor :event_id, :server_name, :timestamp, :environment,
55
+ :release, :tags, :request, :user, :transaction, :exception,
56
+ :error_type, :error_message, :platform
57
+
58
+ def initialize(
59
+ timestamp,
60
+ event_id,
61
+ component_name,
62
+ environment,
63
+ release,
64
+ tags,
65
+ request,
66
+ exception,
67
+ platform
68
+ )
69
+ @event_id = event_id
70
+ @timestamp = timestamp
71
+ @server_name = component_name
72
+ @environment = environment
73
+ @release = release
74
+ @tags = tags
75
+ @request = request
76
+ @platform = platform
77
+ self.exception = SentryException.new(exception)
78
+ end
79
+
80
+ def to_json(*_args)
81
+ hash = {}
82
+ instance_variables.each do |var|
83
+ hash[var.to_s.delete '@'] = instance_variable_get var
84
+ end
85
+
86
+ hash.to_json
87
+ end
88
+ end
89
+
90
+ module Fluent::Plugin
91
+ class SentryOutput < Output
92
+ Fluent::Plugin.register_output('sentry', self)
93
+
94
+ helpers :thread
95
+
96
+ config_param :ingest_url, :string
97
+ config_param :auth_token, :string
98
+ config_param :project_id, :string
99
+
100
+ def write(chunk)
101
+ real_path = extract_placeholders(@path, chunk)
102
+
103
+ chunk.each do |time, record|
104
+ begin
105
+ send_to_sentry(record, time)
106
+ rescue => e
107
+ log.error 'Unable to send event to Sentry, Err class - ', e.class, ', error message - ', e.message
108
+ end
109
+ end
110
+ end
111
+
112
+ def create_sentry_event_ingestion_url
113
+ "#{@ingest_url}/api/#{@project_id}/store/?sentry_key=#{@auth_token}&sentry_version=7"
114
+ end
115
+
116
+ def send_to_sentry(record, time)
117
+ event = SentryMessageFormat.new(
118
+ record['timestamp'] || Time.at(time).to_i || Time.now.to_i,
119
+ SecureRandom.hex(16),
120
+ record['component_name'] || nil,
121
+ record['environment'] || nil,
122
+ record['commitId'] || nil,
123
+ record['tags'] || nil,
124
+ record['request'] || nil,
125
+ record['exception'] || nil,
126
+ record['platform'] || 'node'
127
+ )
128
+
129
+ url = create_sentry_event_ingestion_url
130
+ request_payload = event.to_json
131
+
132
+ log.debug 'Sending payload - ', request_payload, ' to - ', url
133
+ Net::HTTP.post(URI(url), request_payload)
134
+ end
135
+
136
+ end
137
+ end
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluentd-sentry-output
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Anirudh Singh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/fluent/plugin/out_sentry.rb
20
+ homepage: https://rubygems.org/gems/fluentd-sentry-output
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.6.0
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubygems_version: 3.0.3.1
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: An output plugin for Fluentd to export errors to Sentry
43
+ test_files: []