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 +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +36 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +3 -0
- data/README.md +44 -0
- data/Rakefile +8 -0
- data/bin/console +7 -0
- data/bin/setup +7 -0
- data/lib/semlogr/sinks/seq/seq_api.rb +29 -0
- data/lib/semlogr/sinks/seq/sink.rb +63 -0
- data/lib/semlogr/sinks/seq/version.rb +7 -0
- data/lib/semlogr/sinks/seq.rb +15 -0
- data/semlogr-sinks-seq.gemspec +29 -0
- metadata +170 -0
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
data/.rspec
ADDED
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
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
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+

|
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
data/bin/console
ADDED
data/bin/setup
ADDED
@@ -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,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: []
|