semlogr-sinks-seq 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: be108635842d0272886fa9f86981c5bfceffdbd3583f22dda283bdf40fbc220e
4
+ data.tar.gz: d2284aea604a7a9bfe929ff49b2f3e00c1245d0c299a6ea1af6056d2c6a2af97
5
+ SHA512:
6
+ metadata.gz: e048c37bed8374cd78d78c8f8aa637d3aeb669928010fd1de15b716f767d209e38d162a859f724f2b11b20badad92c6512667e963f3c654051ba5abd00c3deaf
7
+ data.tar.gz: f7a11437f867d83f37a06fc347134182d12c49ddae874438892b05e9babd9879cc8bbc8f98286440eb83835755d69ed86224726e827d416eaf352725da65ceb4
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .tags*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,36 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.2
3
+
4
+ Documentation:
5
+ Enabled: false
6
+ OrderedGems:
7
+ Enabled: false
8
+
9
+ Layout/MultilineMethodCallIndentation:
10
+ EnforcedStyle: indented
11
+
12
+ # Do not use Rubocop to enforce complexity rules, these will me
13
+ # managed via the PR prorcess to not let in clearly complex code.
14
+ Metrics/ClassLength:
15
+ Enabled: false
16
+ Metrics/ModuleLength:
17
+ Enabled: false
18
+ Metrics/MethodLength:
19
+ Enabled: false
20
+ Metrics/BlockNesting:
21
+ Enabled: false
22
+ Metrics/AbcSize:
23
+ Enabled: false
24
+ Metrics/CyclomaticComplexity:
25
+ Enabled: false
26
+ Metrics/ParameterLists:
27
+ Enabled: false
28
+ Metrics/BlockLength:
29
+ Enabled: false
30
+ Metrics/PerceivedComplexity:
31
+ Enabled: false
32
+ Metrics/LineLength:
33
+ Enabled: false
34
+
35
+ Style/EmptyMethod:
36
+ EnforcedStyle: expanded
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.4
5
+ before_install: gem install bundler -v 1.13.6
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ### 0.2.1
4
+
5
+ - Use new semlogr component registry
6
+
7
+ ### 0.1.3
8
+
9
+ - Rubocop update (nothing useful)
10
+
11
+ ### 0.1.2
12
+
13
+ - Remove dependency on logstash-logger and implement connection and queue using ruby-stud
14
+
15
+ ### 0.1.1
16
+
17
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ ![Codeship Status for semlogr/semlogr](https://codeship.com/projects/9677cdd0-8768-0134-57f3-36c2ccf79a16/status?branch=master)
2
+
3
+ # Seq sink for Semlogr
4
+
5
+ This sink provides support for writing logs to [seq](https://getseq.net/), the sink uses [ruby-stud](https://github.com/jordansissel/ruby-stud) to provide batch flushing of events using the Seq HTTP API.
6
+
7
+ ## Installation
8
+
9
+ To install:
10
+
11
+ gem install semlogr-sinks-seq
12
+
13
+ Or if using bundler, add semlogr to your Gemfile:
14
+
15
+ gem 'semlogr-sinks-seq'
16
+
17
+ then:
18
+
19
+ bundle install
20
+
21
+ ## Getting Started
22
+
23
+ Create an instance of the logger configuring the seq sink with your token.
24
+
25
+ ```ruby
26
+ require 'semlogr'
27
+ require 'semlogr/sinks/seq'
28
+
29
+ Semlogr.logger = Semlogr.create_logger do |c|
30
+ c.log_at :info
31
+
32
+ c.write_to :seq, server_url: 'http://seq', api_key: '1234'
33
+ end
34
+
35
+ Semlogr.info('Customer {customer_id} did something interesting', customer_id: 1234)
36
+ ```
37
+
38
+ ## Development
39
+
40
+ After cloning the repository run `bundle install` to get up and running, to run the specs just run `rake spec`.
41
+
42
+ ## Contributing
43
+
44
+ See anything broken or something you would like to improve? feel free to submit an issue or better yet a pull request!
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new(:rubocop)
7
+
8
+ task default: %i[spec rubocop]
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'semlogr/sinks/seq'
5
+ require 'pry'
6
+
7
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+ IFS=$'\n\t'
5
+ set -vx
6
+
7
+ bundle install
@@ -0,0 +1,29 @@
1
+ require 'faraday'
2
+
3
+ module Semlogr
4
+ module Sinks
5
+ module Seq
6
+ class SeqApi
7
+ def initialize(server_url, api_key)
8
+ @server_url = server_url
9
+ @api_key = api_key
10
+ end
11
+
12
+ def post_events(payload)
13
+ connection = Faraday.new(url: @server_url) do |c|
14
+ c.request :retry
15
+ c.response :raise_error
16
+ c.adapter :net_http
17
+ end
18
+
19
+ connection.post('/api/events/raw') do |req|
20
+ req.headers['Content-Type'] = 'application/vnd.serilog.clef'
21
+ req.headers['X-Api-Key'] = @api_key if @api_key
22
+
23
+ req.body = payload
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,63 @@
1
+ require 'stud/buffer'
2
+ require 'semlogr/formatters/json_formatter'
3
+ require 'semlogr/sinks/seq/seq_api'
4
+
5
+ module Semlogr
6
+ module Sinks
7
+ module Seq
8
+ class Sink
9
+ include Stud::Buffer
10
+
11
+ def initialize(opts = {})
12
+ @options = opts
13
+ @formatter = Formatters::JsonFormatter.new
14
+ @client = create_client(opts)
15
+
16
+ buffer_initialize(opts)
17
+ end
18
+
19
+ def emit(log_event)
20
+ buffer_receive(log_event)
21
+ end
22
+
23
+ def flush(log_events, _group = nil)
24
+ payload = ''
25
+
26
+ log_events.each do |log_event|
27
+ payload << @formatter.format(log_event) do |event|
28
+ seq_event = event[:properties] || {}
29
+ seq_event = seq_event.merge(
30
+ '@t' => event[:timestamp],
31
+ '@l' => event[:severity],
32
+ '@mt' => event[:message_template]
33
+ )
34
+
35
+ add_error(seq_event, event[:error])
36
+
37
+ seq_event
38
+ end
39
+ end
40
+
41
+ @client.post_events(payload)
42
+ end
43
+
44
+ private
45
+
46
+ def create_client(opts)
47
+ server_url = opts.fetch(:server_url, 'http://localhost:5341')
48
+ api_key = opts.fetch(:api_key, nil)
49
+
50
+ SeqApi.new(server_url, api_key)
51
+ end
52
+
53
+ def add_error(seq_event, error)
54
+ return unless error
55
+ seq_event['@x'] = "#{error[:type]}: #{error[:message]}"
56
+
57
+ return unless error[:backtrace] && error[:backtrace].any?
58
+ seq_event['@x'] += "\n\s\s#{error[:backtrace].join("\n\s\s")}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ module Semlogr
2
+ module Sinks
3
+ module Seq
4
+ VERSION = '0.1.0'.freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'semlogr/sinks/seq/version'
2
+ require 'semlogr/sinks/seq/sink'
3
+ require 'semlogr/component_registry'
4
+
5
+ module Semlogr
6
+ module Sinks
7
+ module Seq
8
+ def self.new(opts = {})
9
+ Sink.new(opts)
10
+ end
11
+ end
12
+
13
+ ComponentRegistry.register(:sink, seq: Seq)
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'semlogr/sinks/seq/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'semlogr-sinks-seq'
7
+ spec.version = Semlogr::Sinks::Seq::VERSION
8
+ spec.authors = ['Stefan Sedich']
9
+ spec.email = ['stefan.sedich@gmail.com']
10
+
11
+ spec.summary = 'A semlogr sink for logging to seq.'
12
+ spec.description = 'A semlogr sink for logging to seq.'
13
+ spec.homepage = 'https://github.com/semlogr/semlogr-sinks-seq'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = 'exe'
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_dependency 'faraday', '~> 0.14'
21
+ spec.add_dependency 'semlogr', '~> 0.2'
22
+ spec.add_dependency 'stud', '~> 0.0.10'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.13'
25
+ spec.add_development_dependency 'pry', '~> 0.11'
26
+ spec.add_development_dependency 'rake', '~> 12.3'
27
+ spec.add_development_dependency 'rspec', '~> 3.7'
28
+ spec.add_development_dependency 'rubocop', '~> 0.53'
29
+ end
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: semlogr-sinks-seq
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Stefan Sedich
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-03-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: semlogr
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: stud
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.10
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.10
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.13'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.13'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.11'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '12.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '12.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.53'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.53'
125
+ description: A semlogr sink for logging to seq.
126
+ email:
127
+ - stefan.sedich@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".rubocop.yml"
135
+ - ".travis.yml"
136
+ - CHANGELOG.md
137
+ - Gemfile
138
+ - README.md
139
+ - Rakefile
140
+ - bin/console
141
+ - bin/setup
142
+ - lib/semlogr/sinks/seq.rb
143
+ - lib/semlogr/sinks/seq/seq_api.rb
144
+ - lib/semlogr/sinks/seq/sink.rb
145
+ - lib/semlogr/sinks/seq/version.rb
146
+ - semlogr-sinks-seq.gemspec
147
+ homepage: https://github.com/semlogr/semlogr-sinks-seq
148
+ licenses: []
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.7.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: A semlogr sink for logging to seq.
170
+ test_files: []