fluent-plugin-claymore 1.0.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/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +20 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +69 -0
- data/LICENSE +0 -0
- data/README.md +127 -0
- data/Rakefile +13 -0
- data/circle.yml +12 -0
- data/example/1516312455_log.txt +1755 -0
- data/example/fluentd.conf +13 -0
- data/fluent-plugin-claymore.gemspec +29 -0
- data/lib/claymore/asset_symbol.rb +11 -0
- data/lib/claymore/gpu_hash_rate.rb +55 -0
- data/lib/claymore/total_hash_rate.rb +37 -0
- data/lib/fluent/plugin/parser_claymore.rb +70 -0
- data/test/claymore/test_gpu_hash_rate.rb +43 -0
- data/test/claymore/test_total_hash_rate.rb +23 -0
- data/test/helper.rb +9 -0
- data/test/plugin/test_parser_claymore.rb +82 -0
- metadata +157 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = 'fluent-plugin-claymore'
|
6
|
+
spec.version = '1.0.0'
|
7
|
+
spec.authors = ['Timothy Stott']
|
8
|
+
spec.email = ['stott.timothy@gmail.com']
|
9
|
+
|
10
|
+
spec.summary = 'Fluentd parser plugin for Claymore Dual Miner logs'
|
11
|
+
spec.description = 'Extract time series metrics from Claymore Dual Miner logs'
|
12
|
+
spec.homepage = 'https://github.com/timstott/fluent-plugin-claymore'
|
13
|
+
spec.license = 'Apache-2.0'
|
14
|
+
|
15
|
+
test_files, files = `git ls-files -z`.split("\x0").partition do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
spec.files = files
|
19
|
+
spec.executables = files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = test_files
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
24
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
25
|
+
spec.add_development_dependency 'rubocop', '~> 0.50.0'
|
26
|
+
spec.add_development_dependency 'test-unit', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'timecop', '~> 0.9'
|
28
|
+
spec.add_runtime_dependency 'fluentd', ['>= 0.14.10', '< 2']
|
29
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'claymore/asset_symbol'
|
2
|
+
|
3
|
+
module Claymore
|
4
|
+
# Extracts asset, gpu index and gpu hash rate
|
5
|
+
# Sets hash rate to -1 when gpu is off
|
6
|
+
#
|
7
|
+
# Example input:
|
8
|
+
# 05:45:16:028 2100 ETH: GPU0 29.586 Mh/s, GPU1 off
|
9
|
+
#
|
10
|
+
# Example output:
|
11
|
+
# [
|
12
|
+
# { 'asset' => 'ETH', 'gpu' => 0, 'hash_rate' => 29.586, 'type' => 'GPU_HASH_RATE' },
|
13
|
+
# { 'asset' => 'ETH', 'gpu' => 1, 'hash_rate' => -1.0, 'type' => 'GPU_HASH_RATE' }
|
14
|
+
# ]
|
15
|
+
class GPUHashRate
|
16
|
+
include AssetSymbol
|
17
|
+
|
18
|
+
RATES_REGEXP = %r{GPU(?<index>\d+) (?<rate>\d+(?:\.\d+)? Mh\/s|off)}
|
19
|
+
LINE_REGEXP = Regexp.new("#{ASSET_REGEXP.source} #{RATES_REGEXP.source}")
|
20
|
+
|
21
|
+
def self.call(line)
|
22
|
+
new(line).call
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :line
|
26
|
+
|
27
|
+
def initialize(line)
|
28
|
+
@line = line
|
29
|
+
end
|
30
|
+
|
31
|
+
# rubocop:disable Metrics/MethodLength
|
32
|
+
def call
|
33
|
+
(match = LINE_REGEXP.match(line)) || return
|
34
|
+
|
35
|
+
raw_rates.each_with_object([]) do |(raw_index, raw_rate), acc|
|
36
|
+
hash_rate = raw_rate == 'off' ? -1.0 : raw_rate.to_f.round(3)
|
37
|
+
index = raw_index.to_i
|
38
|
+
|
39
|
+
acc << {
|
40
|
+
'type' => 'GPU_HASH_RATE',
|
41
|
+
'asset' => match[:asset],
|
42
|
+
'gpu' => index,
|
43
|
+
'hash_rate' => hash_rate
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
# rubocop:enable Metrics/MethodLength
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def raw_rates
|
52
|
+
line.scan(RATES_REGEXP)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'claymore/asset_symbol'
|
2
|
+
|
3
|
+
module Claymore
|
4
|
+
# Extracts total hash rate with asset symbol
|
5
|
+
#
|
6
|
+
# Example input:
|
7
|
+
# 05:45:16:028 2100 ETH - Total Speed: 90.118 Mh/s, Total Shares: 237, Rejected: 0, Time: 06:50
|
8
|
+
#
|
9
|
+
# Example output:
|
10
|
+
# { 'asset' => 'ETH', 'hash_rate' => 90.118, 'type' => 'TOTAL_HASH_RATE' }
|
11
|
+
class TotalHashRate
|
12
|
+
include AssetSymbol
|
13
|
+
|
14
|
+
TOTAL_RATE_REGEXP = %r{Total Speed: (?<rate>\d+\.\d+ Mh\/s)}
|
15
|
+
LINE_REGEXP = Regexp.new("#{ASSET_REGEXP.source} #{TOTAL_RATE_REGEXP.source}")
|
16
|
+
|
17
|
+
def self.call(line)
|
18
|
+
new(line).call
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :line
|
22
|
+
|
23
|
+
def initialize(line)
|
24
|
+
@line = line
|
25
|
+
end
|
26
|
+
|
27
|
+
def call
|
28
|
+
(match = LINE_REGEXP.match(line)) || return
|
29
|
+
|
30
|
+
{
|
31
|
+
'asset' => match[:asset],
|
32
|
+
'hash_rate' => match[:rate].to_f.round(3),
|
33
|
+
'type' => 'TOTAL_HASH_RATE'
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'fluent/plugin/parser'
|
2
|
+
require 'claymore/gpu_hash_rate'
|
3
|
+
require 'claymore/total_hash_rate'
|
4
|
+
|
5
|
+
module Fluent
|
6
|
+
module Plugin
|
7
|
+
class ClaymoreParser < Fluent::Plugin::Parser
|
8
|
+
Fluent::Plugin.register_parser('claymore', self)
|
9
|
+
|
10
|
+
# Extract gpu index, temperature, old and new fan speed
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
# 09:27:02:820 1834 GPU 4 temp = 45, old fan speed = 0, new fan speed = 75
|
14
|
+
# { 'gpu' => 4, 'old_fan' => 0, 'new_fan' => 75, 'temperature' => 45 }
|
15
|
+
GPU_TEMP = lambda do |text|
|
16
|
+
match = text.match(/GPU (?<gpu>\d) temp = (?<temperature>\d+), old.+= (?<old_fan>\d+), new.+= (?<new_fan>\d+)/)
|
17
|
+
match.names.zip(match.captures).map { |(k, v)| [k, v.to_i] }.push(%w[type GPU_TEMP]).to_h if match
|
18
|
+
end
|
19
|
+
|
20
|
+
# Extract gpu share found
|
21
|
+
#
|
22
|
+
# Example:
|
23
|
+
# 11:04:02:920 234c ETH: 12/17/17-11:04:02 - SHARE FOUND - (GPU 5)
|
24
|
+
# { 'asset' => 'ETH', 'gpu' => 5, 'share_found' => 1 }
|
25
|
+
GPU_SHARE_FOUND = lambda do |text|
|
26
|
+
match = text.match(/(?<asset>[A-Z]{2,}):.+SHARE FOUND.+\(GPU (?<gpu>\d+)/)
|
27
|
+
{ 'type' => 'GPU_SHARE_FOUND', 'asset' => match[:asset], 'gpu' => match[:gpu].to_i, 'count' => 1 } if match
|
28
|
+
end
|
29
|
+
|
30
|
+
# Extract connection lost
|
31
|
+
#
|
32
|
+
# Example:
|
33
|
+
# 20:15:08:451 2338 ETH: Connection lost, retry in 20 sec..
|
34
|
+
# { 'asset' => 'ETH', 'connection_lost' => 1 }
|
35
|
+
CONNECTION_LOST = lambda do |text|
|
36
|
+
match = text.match(/(?<asset>[A-Z]{2,}):.+Connection lost/)
|
37
|
+
{ 'type' => 'CONNECTION_LOST', 'asset' => match[:asset], 'count' => 1 } if match
|
38
|
+
end
|
39
|
+
|
40
|
+
INCORRECT_SHARE = lambda do |text|
|
41
|
+
match = text.match(/GPU #(?<gpu>\d+) got incorrect share/)
|
42
|
+
{ 'type' => 'INCORRECT_SHARE', 'gpu' => match[:gpu].to_i, 'count' => 1 } if match
|
43
|
+
end
|
44
|
+
|
45
|
+
EXTRACTORS = [
|
46
|
+
CONNECTION_LOST,
|
47
|
+
Claymore::GPUHashRate,
|
48
|
+
Claymore::TotalHashRate,
|
49
|
+
GPU_SHARE_FOUND,
|
50
|
+
GPU_TEMP,
|
51
|
+
INCORRECT_SHARE
|
52
|
+
].freeze
|
53
|
+
|
54
|
+
def parse(text)
|
55
|
+
EXTRACTORS
|
56
|
+
.map { |extractor| extractor.call(text) }
|
57
|
+
.reject { |result| result.nil? || result.empty? }
|
58
|
+
.compact
|
59
|
+
.flatten
|
60
|
+
.each { |result| yield time, result }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Claymore filename include the date however,
|
64
|
+
# Claymore log line include time without date
|
65
|
+
def time
|
66
|
+
parse_time(nil)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'claymore/gpu_hash_rate.rb'
|
3
|
+
|
4
|
+
class GPUHashRateTest < Test::Unit::TestCase
|
5
|
+
test 'return nil when no match' do
|
6
|
+
assert_nil service('ETH: GPU0')
|
7
|
+
assert_nil service('GPU0 24.1 Mh/s')
|
8
|
+
assert_nil service('SC - Total Speed: 292.684 Mh/s')
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'extracts individual GPU hash rates when available' do
|
12
|
+
text = 'ETH: GPU0 24.314 Mh/s, GPU1 24.01 Mh/s, GPU20 24.1 Mh/s'
|
13
|
+
assert_equal service(text), [
|
14
|
+
{ 'asset' => 'ETH', 'gpu' => 0, 'hash_rate' => 24.314, 'type' => 'GPU_HASH_RATE' },
|
15
|
+
{ 'asset' => 'ETH', 'gpu' => 1, 'hash_rate' => 24.01, 'type' => 'GPU_HASH_RATE' },
|
16
|
+
{ 'asset' => 'ETH', 'gpu' => 20, 'hash_rate' => 24.1, 'type' => 'GPU_HASH_RATE' }
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'extracts asset name' do
|
21
|
+
text = 'SC: GPU0 292.862 Mh/s'
|
22
|
+
assert_equal service(text), [
|
23
|
+
{ 'asset' => 'SC', 'gpu' => 0, 'hash_rate' => 292.862, 'type' => 'GPU_HASH_RATE' }
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'assigns -1 hash rate value when GPU is off' do
|
28
|
+
text = 'ETH: GPU0 29 Mh/s, GPU1 off'
|
29
|
+
assert_equal service(text), [
|
30
|
+
{ 'asset' => 'ETH', 'gpu' => 0, 'hash_rate' => 29, 'type' => 'GPU_HASH_RATE' },
|
31
|
+
{ 'asset' => 'ETH', 'gpu' => 1, 'hash_rate' => -1.0, 'type' => 'GPU_HASH_RATE' }
|
32
|
+
]
|
33
|
+
|
34
|
+
text = 'LBC: GPU0 off'
|
35
|
+
assert_equal service(text), [
|
36
|
+
{ 'asset' => 'LBC', 'gpu' => 0, 'hash_rate' => -1.0, 'type' => 'GPU_HASH_RATE' }
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
def service(text)
|
41
|
+
Claymore::GPUHashRate.call(text)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'claymore/total_hash_rate.rb'
|
3
|
+
|
4
|
+
class TotalHashRateTest < Test::Unit::TestCase
|
5
|
+
test 'return nil when no match' do
|
6
|
+
assert_nil service('ETH: job is the same')
|
7
|
+
assert_nil service('ETH: checking pool connection...')
|
8
|
+
assert_nil service('ETH: GPU0 29 Mh/s, GPU1 off')
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'extracts asset name and total hash rate' do
|
12
|
+
line = 'ETH - Total Speed: 90.118 Mh/s, Total Shares: 237, Rejected: 0, Time: 06:50'
|
13
|
+
assert_equal ({
|
14
|
+
'asset' => 'ETH',
|
15
|
+
'hash_rate' => 90.118,
|
16
|
+
'type' => 'TOTAL_HASH_RATE'
|
17
|
+
}), service(line)
|
18
|
+
end
|
19
|
+
|
20
|
+
def service(line)
|
21
|
+
Claymore::TotalHashRate.call(line)
|
22
|
+
end
|
23
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../', __FILE__))
|
2
|
+
require 'test-unit'
|
3
|
+
require 'timecop'
|
4
|
+
require 'fluent/test'
|
5
|
+
require 'fluent/test/driver/parser'
|
6
|
+
require 'fluent/test/helpers'
|
7
|
+
|
8
|
+
Test::Unit::TestCase.include(Fluent::Test::Helpers)
|
9
|
+
Test::Unit::TestCase.extend(Fluent::Test::Helpers)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'fluent/plugin/parser_claymore.rb'
|
3
|
+
|
4
|
+
class ClaymoreParserTest < Test::Unit::TestCase
|
5
|
+
setup do
|
6
|
+
Fluent::Test.setup
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'uses current Time instead of file/line time' do
|
10
|
+
t1 = '2017-12-20T07:30:05.123+00:00'
|
11
|
+
Timecop.freeze(t1) do
|
12
|
+
parse('') do |time, _record|
|
13
|
+
assert_equal time, Time.parse(t1)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'returns nothing when no match' do
|
19
|
+
parse('blahblah') do |_time, record|
|
20
|
+
assert_nil record
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'extracts gpu hash rates' do
|
25
|
+
line = '17:22:59:067 25e8 ETH: GPU0 24.314 Mh/s, GPU1 24.01 Mh/s, GPU2 24.1 Mh/s'
|
26
|
+
records = []
|
27
|
+
parse(line) { |_time, record| records.push record }
|
28
|
+
assert_equal records, [
|
29
|
+
{ 'asset' => 'ETH', 'gpu' => 0, 'hash_rate' => 24.314, 'type' => 'GPU_HASH_RATE' },
|
30
|
+
{ 'asset' => 'ETH', 'gpu' => 1, 'hash_rate' => 24.01, 'type' => 'GPU_HASH_RATE' },
|
31
|
+
{ 'asset' => 'ETH', 'gpu' => 2, 'hash_rate' => 24.1, 'type' => 'GPU_HASH_RATE' }
|
32
|
+
]
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'extracts gpu hash rates with off gpus' do
|
36
|
+
line = '1559:05:45:16:028 2100 ETH: GPU0 29.586 Mh/s, GPU1 off'
|
37
|
+
records = []
|
38
|
+
parse(line) { |_time, record| records.push record }
|
39
|
+
assert_equal records, [
|
40
|
+
{ 'asset' => 'ETH', 'gpu' => 0, 'hash_rate' => 29.586, 'type' => 'GPU_HASH_RATE' },
|
41
|
+
{ 'asset' => 'ETH', 'gpu' => 1, 'hash_rate' => -1, 'type' => 'GPU_HASH_RATE' }
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
test 'extracts gpu temperature, old and new fan speed' do
|
46
|
+
line = '09:27:02:820 1834 GPU 4 temp = 45, old fan speed = 0, new fan speed = 75'
|
47
|
+
parse(line) do |_time, record|
|
48
|
+
assert_equal record, 'gpu' => 4, 'old_fan' => 0, 'new_fan' => 75, 'temperature' => 45, 'type' => 'GPU_TEMP'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
test 'extracts gpu share found' do
|
53
|
+
line = '11:04:02:920 234c ETH: 12/17/17-11:04:02 - SHARE FOUND - (GPU 5)'
|
54
|
+
parse(line) do |_time, record|
|
55
|
+
assert_equal record, 'asset' => 'ETH', 'gpu' => 5, 'count' => 1, 'type' => 'GPU_SHARE_FOUND'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'extracts connection lost' do
|
60
|
+
line = '20:15:08:451 2338 ETH: Connection lost, retry in 20 sec...'
|
61
|
+
parse(line) do |_time, record|
|
62
|
+
assert_equal record, 'asset' => 'ETH', 'count' => 1, 'type' => 'CONNECTION_LOST'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
test 'extracts incorrect share' do
|
67
|
+
line = '05:07:23:959 acc GPU #3 got incorrect share. If you see this warning often, make sure you did not overclock it too much!'
|
68
|
+
parse(line) do |_time, record|
|
69
|
+
assert_equal record, 'gpu' => 3, 'count' => 1, 'type' => 'INCORRECT_SHARE'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def parse(txt, &block)
|
76
|
+
create_driver({}).instance.parse(txt, &block)
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_driver(conf)
|
80
|
+
Fluent::Test::Driver::Parser.new(Fluent::Plugin::ClaymoreParser).configure(conf)
|
81
|
+
end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-claymore
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Timothy Stott
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-01-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.14'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.50.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.50.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: timecop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.9'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.9'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: fluentd
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.14.10
|
90
|
+
- - "<"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '2'
|
93
|
+
type: :runtime
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.14.10
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '2'
|
103
|
+
description: Extract time series metrics from Claymore Dual Miner logs
|
104
|
+
email:
|
105
|
+
- stott.timothy@gmail.com
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- ".rubocop.yml"
|
111
|
+
- ".rubocop_todo.yml"
|
112
|
+
- Gemfile
|
113
|
+
- Gemfile.lock
|
114
|
+
- LICENSE
|
115
|
+
- README.md
|
116
|
+
- Rakefile
|
117
|
+
- circle.yml
|
118
|
+
- example/1516312455_log.txt
|
119
|
+
- example/fluentd.conf
|
120
|
+
- fluent-plugin-claymore.gemspec
|
121
|
+
- lib/claymore/asset_symbol.rb
|
122
|
+
- lib/claymore/gpu_hash_rate.rb
|
123
|
+
- lib/claymore/total_hash_rate.rb
|
124
|
+
- lib/fluent/plugin/parser_claymore.rb
|
125
|
+
- test/claymore/test_gpu_hash_rate.rb
|
126
|
+
- test/claymore/test_total_hash_rate.rb
|
127
|
+
- test/helper.rb
|
128
|
+
- test/plugin/test_parser_claymore.rb
|
129
|
+
homepage: https://github.com/timstott/fluent-plugin-claymore
|
130
|
+
licenses:
|
131
|
+
- Apache-2.0
|
132
|
+
metadata: {}
|
133
|
+
post_install_message:
|
134
|
+
rdoc_options: []
|
135
|
+
require_paths:
|
136
|
+
- lib
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 2.6.14
|
150
|
+
signing_key:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Fluentd parser plugin for Claymore Dual Miner logs
|
153
|
+
test_files:
|
154
|
+
- test/claymore/test_gpu_hash_rate.rb
|
155
|
+
- test/claymore/test_total_hash_rate.rb
|
156
|
+
- test/helper.rb
|
157
|
+
- test/plugin/test_parser_claymore.rb
|