sidekiq-statistic 1.2.0 → 1.4.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.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +7 -7
  3. data/CHANGELOG.md +6 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +12 -4
  6. data/Rakefile +2 -0
  7. data/bin/console +1 -1
  8. data/lib/sidekiq-statistic.rb +2 -0
  9. data/lib/sidekiq/statistic.rb +4 -1
  10. data/lib/sidekiq/statistic/base.rb +5 -3
  11. data/lib/sidekiq/statistic/configuration.rb +5 -1
  12. data/lib/sidekiq/statistic/helpers/color.rb +28 -0
  13. data/lib/sidekiq/statistic/locales/de.yml +2 -0
  14. data/lib/sidekiq/statistic/locales/en.yml +2 -0
  15. data/lib/sidekiq/statistic/locales/fr.yml +29 -0
  16. data/lib/sidekiq/statistic/locales/it.yml +2 -0
  17. data/lib/sidekiq/statistic/locales/jp.yml +29 -0
  18. data/lib/sidekiq/statistic/locales/pt-br.yml +33 -0
  19. data/lib/sidekiq/statistic/locales/ru.yml +8 -6
  20. data/lib/sidekiq/statistic/locales/uk.yml +29 -0
  21. data/lib/sidekiq/statistic/log_parser.rb +17 -5
  22. data/lib/sidekiq/statistic/middleware.rb +19 -9
  23. data/lib/sidekiq/statistic/statistic/charts.rb +9 -19
  24. data/lib/sidekiq/statistic/statistic/realtime.rb +6 -4
  25. data/lib/sidekiq/statistic/statistic/runtime.rb +6 -4
  26. data/lib/sidekiq/statistic/statistic/workers.rb +2 -0
  27. data/lib/sidekiq/statistic/version.rb +3 -1
  28. data/lib/sidekiq/statistic/views/c3.js +5 -0
  29. data/lib/sidekiq/statistic/views/realtime.erb +10 -4
  30. data/lib/sidekiq/statistic/views/realtime_statistic.js +38 -37
  31. data/lib/sidekiq/statistic/views/sidekiq-statistic.css +471 -66
  32. data/lib/sidekiq/statistic/views/statistic.erb +8 -6
  33. data/lib/sidekiq/statistic/views/statistic.js +50 -60
  34. data/lib/sidekiq/statistic/views/worker.erb +15 -7
  35. data/lib/sidekiq/statistic/web_api_extension.rb +3 -1
  36. data/lib/sidekiq/statistic/web_extension.rb +23 -20
  37. data/lib/sidekiq/statistic/web_extension_helper.rb +14 -5
  38. data/sidekiq-statistic.gemspec +3 -2
  39. metadata +31 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 204eadc3fb3cee1ccf67c444c6d605bcbf605071
4
- data.tar.gz: 0fccef486519aa0e2d83768f799489cd84526401
2
+ SHA256:
3
+ metadata.gz: a32f2de3dc5fe06de39827e46f0b182a20f9221eeac4ddd03f01cf7d1038d699
4
+ data.tar.gz: f47b057b32feb27d543d936661cbcd440a0f5562d75f005d5bdaf53d9805d800
5
5
  SHA512:
6
- metadata.gz: cd21216040203ef9fbe3d119f246635e22b58a0593b35055ca4e6d26e9bbb553170710f76afd73cad262576ebef37d60ffcf6ec2e0480eebc5c6a60f4801d381
7
- data.tar.gz: 7a84e030ce3dd3820e9b4c428c4f3a052b91409026eeb29d29513ff23ce5866af808d0d3c0cf88ab04ce685f42fde21908ce22b51b82ea5cb2b63f1d05f9f9da
6
+ metadata.gz: b70d66e91a305176f3044fb66441430a3064404a9929089e9090c92692f154ad1b180696317d0c9bd03920b95a5d7785bb7f802ced621083321a210144449d71
7
+ data.tar.gz: b825025d90d0f899f83b347a16f217703c75037bcc9605c041a72cb48828b9ef2aca15593c09d16980f0ecee9558c0154f4af1ef64a5e384a454725d2561322a
@@ -3,15 +3,15 @@ sudo: false
3
3
  cache: bundler
4
4
  services:
5
5
  - redis-server
6
+ before_install:
7
+ - gem install bundler
8
+ - gem update bundler
6
9
  rvm:
7
- - 2.1
8
- - 2.0.0
9
- - 2.2
10
- - jruby-19mode
11
- - jruby
10
+ - 2.3.8
11
+ - 2.4.5
12
+ - 2.5.3
13
+ - jruby-head
12
14
  - rbx-2
13
15
  matrix:
14
16
  allow_failures:
15
17
  - rvm: rbx-2
16
- - rvm: jruby
17
- bundler_args: --without test --jobs 3 --retry 3
@@ -1,4 +1,10 @@
1
1
  ## HEAD
2
+ * 08.03.2019: Change LogParser regexp (#81) *Kirill Tatchihin*
3
+ * 03.02.02019: Change storing of last_runtime from date to timestamp (#87) *Kirill Tatchihin*
4
+ * 30.03.2017: Prevent excessive Redis memory usage (#107) *Gareth du Plooy*
5
+ * 08.04.2016: Add new option for displaying last N lines of log file (#91) *Nick Zhebrun*
6
+ * 20.11.2015: Convert value in redis time array to float (#76) *Anton Davydov*
7
+ * 20.11.2015: Add Ukrainian Localization (#85) *@POStroi*
2
8
 
3
9
  ## v1.2
4
10
  * 15.11.2015: Update gemspec to allow usage with sidekiq 4 (#83) *Felix Bünemann*
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015 Anton Davydov
3
+ Copyright (c) 2016 Anton Davydov
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -39,16 +39,19 @@ require 'sidekiq/web'
39
39
  require 'sidekiq-statistic'
40
40
 
41
41
  use Rack::Session::Cookie, secret: 'some unique secret string here'
42
- Sidekiq::Web.instance_eval { @middleware.reverse! } # Last added, First Run
43
42
  run Sidekiq::Web
44
43
  ```
45
44
 
46
45
  ## Configuration
47
- Sidekiq statistic gem have `log_file` option. This option lets you specify a custom path to sidekiq log file. By default this option equal `log/sidekiq.log`
46
+ Sidekiq statistic gem have `log_file` and `last_log_lines` options.
47
+ `log_file` option lets you specify a custom path to sidekiq log file. By default this option equal `log/sidekiq.log`
48
+ `last_log lines` option lets you specify a custom count of last logger file lines which will be displayed. By default this option equal 1000.
48
49
 
49
50
  ``` ruby
50
51
  Sidekiq::Statistic.configure do |config|
51
52
  config.log_file = 'test/helpers/logfile.log'
53
+ config.last_log_lines = 10_000
54
+ config.max_timelist_length = 500_000
52
55
  end
53
56
  ```
54
57
 
@@ -126,7 +129,7 @@ $ curl http://example.com/sidekiq/api/statistic/Worker.json?dateFrom=2015-07-30&
126
129
  ## Update statistic inside middleware
127
130
  You can update your worker statistic inside middleware. For this you should to update `sidekiq:statistic` redis hash.
128
131
  This hash has the following structure:
129
- * `sideki:statistic` - redis hash with all statistic
132
+ * `sidekiq:statistic` - redis hash with all statistic
130
133
  - `yyyy-mm-dd:WorkerName:passed` - count of passed jobs for Worker name on yyyy-mm-dd
131
134
  - `yyyy-mm-dd:WorkerName:failed` - count of failed jobs for Worker name on yyyy-mm-dd
132
135
  - `yyyy-mm-dd:WorkerName:failed` - count of failed jobs for Worker name on yyyy-mm-dd
@@ -137,7 +140,12 @@ This hash has the following structure:
137
140
  For time information you should push the runtime value to `yyyy-mm-dd:WorkerName:timeslist` redis list.
138
141
 
139
142
  ## How it works
140
- ![how-it-works](https://cloud.githubusercontent.com/assets/1147484/8802272/fc0a1302-2fc8-11e5-86a5-817409259338.png)
143
+ <details>
144
+ <summary>Big image 'how it works'</summary>
145
+
146
+ ![how-it-works](https://cloud.githubusercontent.com/assets/1147484/8802272/fc0a1302-2fc8-11e5-86a5-817409259338.png)
147
+
148
+ </details>
141
149
 
142
150
  ## Contributing
143
151
  1. Fork it ( https://github.com/davydovanton/sidekiq-statistic/fork )
data/Rakefile CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env rake
2
+ # frozen_string_literal: true
3
+
2
4
  require 'bundler/gem_tasks'
3
5
  require 'rake/testtask'
4
6
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "sidekiq/history"
4
+ require "sidekiq/statistic"
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sidekiq/statistic'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'sidekiq/web'
3
5
  rescue LoadError
@@ -17,10 +19,11 @@ require 'sidekiq/statistic/version'
17
19
  require 'sidekiq/statistic/web_extension'
18
20
  require 'sidekiq/statistic/web_api_extension'
19
21
  require 'sidekiq/statistic/web_extension_helper'
22
+ require 'sidekiq/statistic/helpers/color'
20
23
 
21
24
  module Sidekiq
22
25
  module Statistic
23
- REDIS_HASH = 'sidekiq:statistic'.freeze
26
+ REDIS_HASH = 'sidekiq:statistic'
24
27
 
25
28
  class << self
26
29
  attr_writer :configuration
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sidekiq
2
4
  module Statistic
3
5
  class Base
4
- KEY_SEPARATOR = /(?<!:):(?!:)/.freeze
6
+ KEY_SEPARATOR = /(?<!:):(?!:)/
5
7
 
6
8
  def initialize(days_previous, start_date = nil)
7
9
  @start_date = start_date || Time.now.utc.to_date
@@ -56,8 +58,8 @@ module Sidekiq
56
58
 
57
59
  def to_number(value)
58
60
  case value
59
- when /\A[\d.]+\z/ then value.to_f
60
- when /\A\d+\z/ then value.to_i
61
+ when /\A-?\d+\.\d+\z/ then value.to_f
62
+ when /\A-?\d+\z/ then value.to_i
61
63
  else value
62
64
  end
63
65
  end
@@ -1,10 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sidekiq
2
4
  module Statistic
3
5
  class Configuration
4
- attr_accessor :log_file
6
+ attr_accessor :log_file, :last_log_lines, :max_timelist_length
5
7
 
6
8
  def initialize
7
9
  @log_file = 'log/sidekiq.log'
10
+ @last_log_lines = 1_000
11
+ @max_timelist_length = 250_000
8
12
  end
9
13
  end
10
14
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ module Statistic
5
+ module Helpers
6
+ class Color
7
+ class << self
8
+ def for(worker_name, format = :rgb)
9
+ rgb = Digest::MD5.hexdigest(worker_name)[0..5]
10
+ .scan(/../)
11
+ .map { |color| color.to_i(16) }
12
+ .join(',')
13
+
14
+ return to_hex(rgb) if format == :hex
15
+
16
+ rgb
17
+ end
18
+
19
+ private
20
+
21
+ def to_hex(rgb)
22
+ '#' + rgb.split(',').map { |v| v.to_i.to_s(16).rjust(2, '0').upcase }.join
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -25,3 +25,5 @@ de: # <---- change this to your locale code
25
25
  WorkerLog: Arbeiter-Log
26
26
  WorkerTablePerDay: Arbeiter-Tabelle (pro Tag)
27
27
  LastRun: Letzte Ausführung
28
+ EmptyLogs: Keine Ergebnisse
29
+ SearchLogs: Suchen Sie in der Protokolldatei
@@ -25,3 +25,5 @@ en: # <---- change this to your locale code
25
25
  WorkerLog: Worker log
26
26
  WorkerTablePerDay: Worker table (per day)
27
27
  LastRun: Last run
28
+ EmptyLogs: No results
29
+ SearchLogs: Search in log file
@@ -0,0 +1,29 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ fr: # <---- change this to your locale code
3
+ Queue: Queue
4
+ Exclude: Exclure
5
+ Index: Indice
6
+ RealtimeStatistic: Statistique en temps réel
7
+ Statistic: Statistique
8
+ Start: Début
9
+ End: Fin
10
+ Failed: Échoué
11
+ Passed: Passé
12
+ WorkersTable: Workers Table
13
+ Worker: Worker
14
+ Date: Date
15
+ Success: Succès
16
+ Failure: Échec
17
+ Total: Total
18
+ TimeSec: Temps (sec)
19
+ AverageSec: Moyenne (sec)
20
+ MinTimeSec: Min temps (sec)
21
+ MaxTimeSec: Max temps (sec)
22
+ LastJobStatus: Dernier statut job
23
+ WorkerInformation: '%{worker} information'
24
+ InformationTable: Information table
25
+ WorkerLog: Journaux Worker
26
+ WorkerTablePerDay: Worker Table (par jour)
27
+ LastRun: Dernier Exécution
28
+ EmptyLogs: Jornaux Vides
29
+ SearchLogs: Journaux de recherche
@@ -25,3 +25,5 @@ it: # <---- change this to your locale code
25
25
  WorkerLog: Worker log
26
26
  WorkerTablePerDay: Tabella Worker (per giorno)
27
27
  LastRun: Ultima Esecuzione
28
+ EmptyLogs: Nessun Risultato
29
+ SearchLogs: Cerca nel file di registro
@@ -0,0 +1,29 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ jp: # <---- change this to your locale code
3
+ Queue: キュー
4
+ Exclude: 削除
5
+ Index: 索引
6
+ RealtimeStatistic: リアルタイム統計
7
+ Statistic: 統計
8
+ Start: 開始
9
+ End: 終了
10
+ Failed: 失敗
11
+ Passed: 成功
12
+ WorkersTable: ワーカー表
13
+ Worker: ワーカー
14
+ Date: 日付
15
+ Success: 成功
16
+ Failure: 失敗
17
+ Total: 合計
18
+ TimeSec: 時間(秒)
19
+ AverageSec: 平均時間(秒)
20
+ MinTimeSec: 最小時間(秒)
21
+ MaxTimeSec: 最長時間(秒)
22
+ LastJobStatus: 最後の状態
23
+ WorkerInformation: '%{worker}の情報'
24
+ InformationTable: 情報表
25
+ WorkerLog: ワーカーログ
26
+ WorkerTablePerDay: ワーカー表 (日)
27
+ LastRun: 最後の実行
28
+ EmptyLogs: データがありません
29
+ SearchLogs: ログファイルにて検索
@@ -0,0 +1,33 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ pt-br: # <---- change this to your locale code
3
+ Queue: Fila
4
+ Exclude: Excluir
5
+ Index: Índice
6
+ RealtimeStatistic: Estatística em tempo real
7
+ Statistic: Estatística
8
+ Start: Início
9
+ End: Fim
10
+ Failed: Falhou
11
+ Passed: Passou
12
+ WorkersTable: Tabela de Workers
13
+ Worker: Worker
14
+ Date: Data
15
+ Success: Successo
16
+ Failure: Falha
17
+ Total: Total
18
+ TimeSec: Tempo(s)
19
+ AverageSec: Média(s)
20
+ MinTimeSec: Tempo Min(s)
21
+ MaxTimeSec: Tempo Max(s)
22
+ LastJobStatus: Status do último trabalho
23
+ WorkerInformation: 'Informações do %{worker}'
24
+ InformationTable: Tabela de informação
25
+ WorkerLog: Log do Worker
26
+ WorkerTablePerDay: Tabela do Worker (por dia)
27
+ LastRun: Última execução
28
+ EmptyLogs: Nenhum resultado
29
+ SearchLogs: Pesquisar no arquivo de logs
30
+ date:
31
+ formats:
32
+ default: "%d/%m/%Y"
33
+ datetime: "%d/%m/%Y - %T"
@@ -7,21 +7,23 @@ ru: # <---- change this to your locale code
7
7
  Statistic: Статистика
8
8
  Start: Начало
9
9
  End: Конец
10
- Failed: Не выполненые
11
- Passed: Выполненые
10
+ Failed: Не выполненные
11
+ Passed: Выполненные
12
12
  WorkersTable: Таблица воркеров
13
13
  Worker: Воркер
14
14
  Date: Дата
15
15
  Success: Успешно
16
16
  Failure: Неудачно
17
- Total: Сумарно
17
+ Total: Суммарно
18
18
  TimeSec: Время(сек)
19
- AverageSec: Среднее(сек)
20
- MinTimeSec: Мин время(сек)
21
- MaxTimeSec: Макс время(сек)
19
+ AverageSec: Среднее время(сек)
20
+ MinTimeSec: 'Мин. время(сек)'
21
+ MaxTimeSec: 'Макс. время(сек)'
22
22
  LastJobStatus: Статус последнего джоба
23
23
  WorkerInformation: 'Информация о %{worker}'
24
24
  InformationTable: Таблица с информацией
25
25
  WorkerLog: Лог воркера
26
26
  WorkerTablePerDay: Таблица воркера (по дням)
27
27
  LastRun: Последний запуск
28
+ EmptyLogs: Нет результатов
29
+ SearchLogs: Поиск в лог-файле
@@ -0,0 +1,29 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ uk: # <---- change this to your locale code
3
+ Queue: Черга
4
+ Exclude: Вилучити
5
+ Index: Головна
6
+ RealtimeStatistic: Статистика у реальному часі
7
+ Statistic: Статистика
8
+ Start: Початок
9
+ End: Кінець
10
+ Failed: Невиконані
11
+ Passed: Виконані
12
+ WorkersTable: Таблиця обробників
13
+ Worker: Обробник
14
+ Date: Дата
15
+ Success: Успішно
16
+ Failure: Невдало
17
+ Total: Сумарно
18
+ TimeSec: Час(сек)
19
+ AverageSec: Середнє(сек)
20
+ MinTimeSec: Мін. час(сек)
21
+ MaxTimeSec: Макс. час(сек)
22
+ LastJobStatus: Стан останнього обробника
23
+ WorkerInformation: 'Інформація про %{worker}'
24
+ InformationTable: Таблиця з інформацією
25
+ WorkerLog: Журнал обробника
26
+ WorkerTablePerDay: Таблиця обробника (по днях)
27
+ LastRun: Останній запуск
28
+ EmptyLogs: немає результатів
29
+ SearchLogs: Пошук у файлі журналу
@@ -1,28 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sidekiq
2
4
  module Statistic
3
5
  # Heroku have read only file system. See more in this link:
4
6
  # https://devcenter.heroku.com/articles/read-only-filesystem
5
7
  class LogParser
6
- FILE_LINES_COUNT = 1_000
8
+ WORKER_INFO_REGEXP_TEMPLATE = "([\\W]+|^)%{worker_name}([\\W]+|$)"
9
+
7
10
  def initialize(worker_name)
8
11
  @worker_name = worker_name
9
12
  @logfile = log_file
13
+ @worker_info_regexp = Regexp.compile(WORKER_INFO_REGEXP_TEMPLATE % { worker_name: @worker_name })
14
+ @jid_tag_regexp = Regexp.compile('(JID-[\\w]+)')
10
15
  end
11
16
 
12
17
  def parse
13
- return [] unless File.exists?(@logfile)
18
+ return [] unless File.exist?(@logfile)
14
19
 
15
20
  File
16
21
  .readlines(@logfile)
17
- .first(FILE_LINES_COUNT)
18
- .map{ |line| sub_line(line) if line[/\W?#@worker_name\W?/] }
22
+ .last(last_log_lines)
23
+ .map{ |line| sub_line(line) if line.match(worker_info_regexp) }
19
24
  .compact
20
25
  end
21
26
 
22
27
  def sub_line(line)
23
28
  line
24
29
  .sub(/\n/, '')
25
- .sub(/(JID-[\w]+)/) { jid_tag($1) }
30
+ .sub(jid_tag_regexp) { jid_tag($1) }
26
31
  end
27
32
 
28
33
  def jid_tag(jid)
@@ -47,11 +52,18 @@ module Sidekiq
47
52
  end
48
53
 
49
54
  private
55
+
56
+ attr_reader :worker_info_regexp, :jid_tag_regexp
57
+
50
58
  def log_file
51
59
  Sidekiq.options[:logfile] ||
52
60
  Sidekiq.logger.instance_variable_get(:@logdev).filename ||
53
61
  Sidekiq::Statistic.configuration.log_file
54
62
  end
63
+
64
+ def last_log_lines
65
+ Sidekiq::Statistic.configuration.last_log_lines
66
+ end
55
67
  end
56
68
  end
57
69
  end