groonga-query-log 1.2.8 → 1.2.9
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 +4 -4
- data/bin/groonga-query-log-analyze +3 -4
- data/bin/groonga-query-log-analyze-load +22 -0
- data/bin/groonga-query-log-check-command-version-compatibility +2 -2
- data/bin/groonga-query-log-check-crash +22 -0
- data/bin/groonga-query-log-detect-memory-leak +2 -2
- data/bin/groonga-query-log-extract +2 -2
- data/bin/groonga-query-log-format-regression-test-logs +2 -2
- data/bin/groonga-query-log-replay +3 -5
- data/bin/groonga-query-log-run-regression-test +2 -2
- data/bin/groonga-query-log-show-running-queries +2 -2
- data/bin/groonga-query-log-verify-server +2 -2
- data/doc/text/news.md +31 -0
- data/groonga-query-log.gemspec +5 -4
- data/lib/groonga-query-log.rb +42 -0
- data/lib/{groonga/query-log/command-line-utils.rb → groonga-query-log/command-line.rb} +25 -13
- data/lib/{groonga/query-log → groonga-query-log}/command-version-compatibility-checker.rb +3 -5
- data/lib/groonga-query-log/command/analyze-load.rb +188 -0
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer.rb +60 -44
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/reporter.rb +15 -20
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/reporter/console.rb +19 -18
- data/lib/groonga-query-log/command/analyzer/reporter/csv.rb +77 -0
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/reporter/html.rb +32 -16
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/reporter/json-stream.rb +4 -6
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/reporter/json.rb +7 -7
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/sized-grouped-operations.rb +3 -5
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/sized-statistics.rb +4 -6
- data/lib/{groonga/query-log → groonga-query-log/command}/analyzer/streamer.rb +4 -6
- data/lib/groonga-query-log/command/check-command-version-compatibility.rb +69 -0
- data/lib/groonga-query-log/command/check-crash.rb +169 -0
- data/lib/groonga-query-log/command/detect-memory-leak.rb +89 -0
- data/lib/groonga-query-log/command/extract.rb +171 -0
- data/lib/groonga-query-log/command/format-regression-test-logs.rb +143 -0
- data/lib/groonga-query-log/command/replay.rb +117 -0
- data/lib/groonga-query-log/command/run-regression-test.rb +432 -0
- data/lib/groonga-query-log/command/show-running-queries.rb +78 -0
- data/lib/{groonga/query-log/command/replay.rb → groonga-query-log/command/verify-server.rb} +68 -37
- data/lib/{groonga/query-log → groonga-query-log}/incompatibility-detector.rb +3 -5
- data/lib/{groonga/query-log → groonga-query-log}/memory-leak-detector.rb +3 -7
- data/lib/groonga-query-log/parser.rb +173 -0
- data/lib/{groonga/query-log → groonga-query-log}/replayer.rb +7 -8
- data/lib/{groonga/query-log → groonga-query-log}/response-comparer.rb +3 -5
- data/lib/{groonga/query-log → groonga-query-log}/server-verifier.rb +3 -5
- data/lib/groonga-query-log/statistic.rb +192 -0
- data/lib/{groonga/query-log → groonga-query-log}/version.rb +2 -4
- data/lib/groonga/query-log.rb +21 -9
- data/lib/groonga/query-log/command/analyzer.rb +18 -0
- data/lib/groonga/query-log/command/check-command-version-compatibility.rb +2 -55
- data/lib/groonga/query-log/command/detect-memory-leak.rb +3 -78
- data/lib/groonga/query-log/command/extract.rb +5 -179
- data/lib/groonga/query-log/command/format-regression-test-logs.rb +3 -130
- data/lib/groonga/query-log/command/reply.rb +18 -0
- data/lib/groonga/query-log/command/run-regression-test.rb +2 -418
- data/lib/groonga/query-log/command/show-running-queries.rb +3 -65
- data/lib/groonga/query-log/command/verify-server.rb +2 -137
- data/test/{test-analyzer.rb → command/test-analyzer.rb} +17 -11
- data/test/command/test-extract.rb +9 -18
- data/test/command/test-format-regression-test-logs.rb +3 -3
- data/test/fixtures/reporter/html.expected +55 -20
- data/test/helper.rb +22 -7
- data/test/test-incompatibility-detector.rb +3 -3
- data/test/test-parser.rb +19 -4
- data/test/test-replayer.rb +4 -4
- data/test/test-response-comparer.rb +2 -2
- metadata +86 -97
- data/lib/groonga/query-log/analyzer/statistic.rb +0 -194
- data/lib/groonga/query-log/parser.rb +0 -125
- data/test/fixtures/run-regression-test/db.new/db +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000000 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000100 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000101 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000102 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000103 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.0000103.c +0 -0
- data/test/fixtures/run-regression-test/db.new/db.001 +0 -0
- data/test/fixtures/run-regression-test/db.new/db.conf +0 -0
- data/test/fixtures/run-regression-test/db.new/groonga.log +0 -165
- data/test/fixtures/run-regression-test/db.old/db +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000000 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000100 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000101 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000102 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000103 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.0000103.c +0 -0
- data/test/fixtures/run-regression-test/db.old/db.001 +0 -0
- data/test/fixtures/run-regression-test/db.old/db.conf +0 -0
- data/test/fixtures/run-regression-test/db.old/groonga.log +0 -79
- data/test/fixtures/run-regression-test/results/query.log +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 213e0534e4b93c131e48f76cfe2c6f8c7fea4a44
|
|
4
|
+
data.tar.gz: 326a76731faf0f948a8362800748503036dca728
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 55fd3f7d8ed2fa51f94ed333e8afeaaef19ad5230b2a4ab8c0ce9622cde117891e3c26bda0f78a0560dcb0382a3b09c843c09cc474cb62faf3b3607a59d51b44
|
|
7
|
+
data.tar.gz: eff099b4e055fc9e6e332a4d8bd8ae1987596ddab11fc842e83d965603147b68270395102cc9860cc09fb13e6004ebaf2a2bf8a949552bb9712e16552ff7bc5f
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
#
|
|
4
3
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
|
5
|
-
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
|
4
|
+
# Copyright (C) 2014-2017 Kouhei Sutou <kou@clear-code.com>
|
|
6
5
|
#
|
|
7
6
|
# This library is free software; you can redistribute it and/or
|
|
8
7
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -18,7 +17,7 @@
|
|
|
18
17
|
# License along with this library; if not, write to the Free Software
|
|
19
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
20
19
|
|
|
21
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/analyzer"
|
|
22
21
|
|
|
23
|
-
analyzer =
|
|
22
|
+
analyzer = GroongaQueryLog::Command::Analyzer.new
|
|
24
23
|
exit(analyzer.run(ARGV))
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
|
4
|
+
#
|
|
5
|
+
# This library is free software; you can redistribute it and/or
|
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
# License as published by the Free Software Foundation; either
|
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with this library; if not, write to the Free Software
|
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
|
+
|
|
19
|
+
require "groonga-query-log/command/analyze-load"
|
|
20
|
+
|
|
21
|
+
analyze_load = GroongaQueryLog::Command::AnalyzeLoad.new
|
|
22
|
+
exit(analyze_load.run(ARGV))
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# License along with this library; if not, write to the Free Software
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
18
|
|
|
19
|
-
require "groonga
|
|
19
|
+
require "groonga-query-log/command/check-command-version-compatibility"
|
|
20
20
|
|
|
21
|
-
command =
|
|
21
|
+
command = GroongaQueryLog::Command::CheckCommandVersionCompatibility.new
|
|
22
22
|
exit(command.run(ARGV))
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2018 Kouhei Sutou <kou@clear-code.com>
|
|
4
|
+
#
|
|
5
|
+
# This library is free software; you can redistribute it and/or
|
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
# License as published by the Free Software Foundation; either
|
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# License along with this library; if not, write to the Free Software
|
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
|
+
|
|
19
|
+
require "groonga-query-log/command/check-crash"
|
|
20
|
+
|
|
21
|
+
check_crash = GroongaQueryLog::Command::CheckCrash.new
|
|
22
|
+
exit(check_crash.run(ARGV))
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/detect-memory-leak"
|
|
21
21
|
|
|
22
|
-
detect_memory_leak_command =
|
|
22
|
+
detect_memory_leak_command = GroongaQueryLog::Command::DetectMemoryLeak.new
|
|
23
23
|
exit(detect_memory_leak_command.run(ARGV))
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/extract"
|
|
21
21
|
|
|
22
|
-
extract =
|
|
22
|
+
extract = GroongaQueryLog::Command::Extract.new
|
|
23
23
|
exit(extract.run(ARGV))
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# License along with this library; if not, write to the Free Software
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
18
|
|
|
19
|
-
require "groonga
|
|
19
|
+
require "groonga-query-log/command/format-regression-test-logs"
|
|
20
20
|
|
|
21
|
-
command =
|
|
21
|
+
command = GroongaQueryLog::Command::FormatRegressionTestLogs.new
|
|
22
22
|
exit(command.run(ARGV))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2013-
|
|
4
|
+
# Copyright (C) 2013-2017 Kouhei Sutou <kou@clear-code.com>
|
|
5
5
|
#
|
|
6
6
|
# This library is free software; you can redistribute it and/or
|
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -17,9 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/replay"
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
replay_command = Groonga::QueryLog::Command::Replay.new
|
|
22
|
+
replay_command = GroongaQueryLog::Command::Replay.new
|
|
25
23
|
exit(replay_command.run(ARGV))
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/run-regression-test"
|
|
21
21
|
|
|
22
|
-
command =
|
|
22
|
+
command = GroongaQueryLog::Command::RunRegressionTest.new
|
|
23
23
|
exit(command.run(ARGV))
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/show-running-queries"
|
|
21
21
|
|
|
22
|
-
command =
|
|
22
|
+
command = GroongaQueryLog::Command::ShowRunningQueries.new
|
|
23
23
|
exit(command.run(ARGV))
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# License along with this library; if not, write to the Free Software
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19
19
|
|
|
20
|
-
require "groonga
|
|
20
|
+
require "groonga-query-log/command/verify-server"
|
|
21
21
|
|
|
22
|
-
verify_server_command =
|
|
22
|
+
verify_server_command = GroongaQueryLog::Command::VerifyServer.new
|
|
23
23
|
exit(verify_server_command.run(ARGV))
|
data/doc/text/news.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# News
|
|
2
2
|
|
|
3
|
+
## 1.2.9: 2018-02-04
|
|
4
|
+
|
|
5
|
+
### Improvements
|
|
6
|
+
|
|
7
|
+
* `GroongaQueryLog`: Renamed from
|
|
8
|
+
`Groonga::QueryLog`. `Groonga::QueryLog` is deprecated but still
|
|
9
|
+
usable.
|
|
10
|
+
|
|
11
|
+
* `GroongaQueryLog::Analyzer::Statistic#each_operation`: Added
|
|
12
|
+
enumerator support.
|
|
13
|
+
|
|
14
|
+
* `groonga-query-log-analyze`: Added "N records" support in HTML report.
|
|
15
|
+
|
|
16
|
+
* `groonga-query-log-replay`: Changed the default protocol to HTTP
|
|
17
|
+
from GQTP.
|
|
18
|
+
|
|
19
|
+
* `groonga-query-log-analyze`: Added `--stream-all` option.
|
|
20
|
+
|
|
21
|
+
* `GroongaQueryLog::Parser`: Added extra information support in
|
|
22
|
+
`load` and `delete` commands' query log.
|
|
23
|
+
|
|
24
|
+
* `groonga-query-log-analyze-load`: Added.
|
|
25
|
+
|
|
26
|
+
* `groonga-query-log-analyze`: Added CSV reporter.
|
|
27
|
+
|
|
28
|
+
* `groonga-query-log-check-crash`: Added.
|
|
29
|
+
|
|
30
|
+
* `GroongaQueryLog::Parser#current_path`: Added.
|
|
31
|
+
|
|
32
|
+
* Required groonga-log 0.1.2 or later.
|
|
33
|
+
|
|
3
34
|
## 1.2.8: 2017-10-26
|
|
4
35
|
|
|
5
36
|
### Fixes
|
data/groonga-query-log.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# -*-
|
|
1
|
+
# -*- ruby -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2012-
|
|
3
|
+
# Copyright (C) 2012-2018 Kouhei Sutou <kou@clear-code.com>
|
|
4
4
|
#
|
|
5
5
|
# This library is free software; you can redistribute it and/or
|
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -20,7 +20,7 @@ base_dir = File.dirname(__FILE__)
|
|
|
20
20
|
lib_dir = File.join(base_dir, "lib")
|
|
21
21
|
|
|
22
22
|
$LOAD_PATH.unshift(lib_dir)
|
|
23
|
-
require "groonga
|
|
23
|
+
require "groonga-query-log/version"
|
|
24
24
|
|
|
25
25
|
clean_white_space = lambda do |entry|
|
|
26
26
|
entry.gsub(/(\A\n+|\n+\z)/, '') + "\n"
|
|
@@ -28,7 +28,7 @@ end
|
|
|
28
28
|
|
|
29
29
|
Gem::Specification.new do |spec|
|
|
30
30
|
spec.name = "groonga-query-log"
|
|
31
|
-
spec.version =
|
|
31
|
+
spec.version = GroongaQueryLog::VERSION.dup
|
|
32
32
|
|
|
33
33
|
spec.authors = ["Kouhei Sutou"]
|
|
34
34
|
spec.email = ["kou@clear-code.com"]
|
|
@@ -54,6 +54,7 @@ Gem::Specification.new do |spec|
|
|
|
54
54
|
|
|
55
55
|
spec.add_runtime_dependency("groonga-command-parser")
|
|
56
56
|
spec.add_runtime_dependency("groonga-client")
|
|
57
|
+
spec.add_runtime_dependency("groonga-log", ">= 0.1.2")
|
|
57
58
|
|
|
58
59
|
spec.add_development_dependency("test-unit")
|
|
59
60
|
spec.add_development_dependency("test-unit-notify")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Copyright (C) 2012-2018 Kouhei Sutou <kou@clear-code.com>
|
|
2
|
+
#
|
|
3
|
+
# This library is free software; you can redistribute it and/or
|
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
5
|
+
# License as published by the Free Software Foundation; either
|
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
7
|
+
#
|
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
11
|
+
# Lesser General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
14
|
+
# License along with this library; if not, write to the Free Software
|
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
|
+
|
|
17
|
+
require "groonga-log"
|
|
18
|
+
|
|
19
|
+
require "groonga-query-log/version"
|
|
20
|
+
require "groonga-query-log/parser"
|
|
21
|
+
require "groonga-query-log/replayer"
|
|
22
|
+
require "groonga-query-log/server-verifier"
|
|
23
|
+
require "groonga-query-log/command-version-compatibility-checker"
|
|
24
|
+
|
|
25
|
+
module GroongaQueryLog
|
|
26
|
+
module AnalyzerNamespaceBackwardCompatibility
|
|
27
|
+
def const_missing(name)
|
|
28
|
+
case name
|
|
29
|
+
when :Analyzer
|
|
30
|
+
warn("GroongaQueryLog::Analyzer is deprecated. " +
|
|
31
|
+
"Use GroongaQueryLog::Command::Analyzer instead:\n" +
|
|
32
|
+
caller.join("\n"))
|
|
33
|
+
require "groonga-query-log/command/analyzer"
|
|
34
|
+
const_set(name, Command::Analyzer)
|
|
35
|
+
else
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
extend AnalyzerNamespaceBackwardCompatibility
|
|
42
|
+
end
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
#
|
|
3
1
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
|
2
|
+
# Copyright (C) 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
|
4
3
|
#
|
|
5
4
|
# This library is free software; you can redistribute it and/or
|
|
6
5
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -15,20 +14,33 @@
|
|
|
15
14
|
# License along with this library; if not, write to the Free Software
|
|
16
15
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
16
|
|
|
18
|
-
module
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
stdin_with_pipe? or stdin_with_redirect?
|
|
23
|
-
end
|
|
17
|
+
module GroongaQueryLog
|
|
18
|
+
class CommandLine
|
|
19
|
+
class Error < StandardError
|
|
20
|
+
end
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
22
|
+
class NoInputError < Error
|
|
23
|
+
end
|
|
28
24
|
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
private
|
|
26
|
+
def parse_log(parser, log_paths, &process_statistic)
|
|
27
|
+
if log_paths.empty?
|
|
28
|
+
if stdin_with_pipe? or stdin_with_redirect?
|
|
29
|
+
parser.parse($stdin, &process_statistic)
|
|
30
|
+
else
|
|
31
|
+
raise NoInputError, "Error: Please specify input log files."
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
parser.parse_paths(log_paths, &process_statistic)
|
|
31
35
|
end
|
|
32
36
|
end
|
|
37
|
+
|
|
38
|
+
def stdin_with_pipe?
|
|
39
|
+
File.pipe?($stdin)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def stdin_with_redirect?
|
|
43
|
+
not File.select([$stdin], [], [], 0).nil?
|
|
44
|
+
end
|
|
33
45
|
end
|
|
34
46
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
|
1
|
+
# Copyright (C) 2014-2017 Kouhei Sutou <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -14,10 +14,9 @@
|
|
|
14
14
|
# License along with this library; if not, write to the Free Software
|
|
15
15
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
16
|
|
|
17
|
-
require "groonga
|
|
17
|
+
require "groonga-query-log/incompatibility-detector"
|
|
18
18
|
|
|
19
|
-
module
|
|
20
|
-
module QueryLog
|
|
19
|
+
module GroongaQueryLog
|
|
21
20
|
class CommandVersionCompatibilityChecker
|
|
22
21
|
def initialize(options)
|
|
23
22
|
@options = options
|
|
@@ -96,5 +95,4 @@ module Groonga
|
|
|
96
95
|
end
|
|
97
96
|
end
|
|
98
97
|
end
|
|
99
|
-
end
|
|
100
98
|
end
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Copyright (C) 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
|
2
|
+
#
|
|
3
|
+
# This library is free software; you can redistribute it and/or
|
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
5
|
+
# License as published by the Free Software Foundation; either
|
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
7
|
+
#
|
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
11
|
+
# Lesser General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
14
|
+
# License along with this library; if not, write to the Free Software
|
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
|
+
|
|
17
|
+
require "optparse"
|
|
18
|
+
|
|
19
|
+
require "groonga-query-log"
|
|
20
|
+
require "groonga-query-log/command-line"
|
|
21
|
+
|
|
22
|
+
module GroongaQueryLog
|
|
23
|
+
module Command
|
|
24
|
+
class AnalyzeLoad < CommandLine
|
|
25
|
+
def initialize
|
|
26
|
+
setup_options
|
|
27
|
+
@pending_entry = nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Executes load command analyzer for Groonga's query logs.
|
|
31
|
+
# "groonga-query-log-analyze-load" command run this method.
|
|
32
|
+
#
|
|
33
|
+
# @example
|
|
34
|
+
# analyze_load = GroongaQueryLog::Command::AnalyzeLoad.new
|
|
35
|
+
# analyze_load.run("--output", "statistics.csv",
|
|
36
|
+
# "query.log")
|
|
37
|
+
#
|
|
38
|
+
# If only paths of query log files are specified,
|
|
39
|
+
# this method prints a result of them to console.
|
|
40
|
+
#
|
|
41
|
+
# @param [Array<String>] arguments arguments for
|
|
42
|
+
# groonga-query-log-analyze-load. Please execute
|
|
43
|
+
# `groonga-query-log-analyze-load --help` or see
|
|
44
|
+
# #setup_options.
|
|
45
|
+
def run(arguments)
|
|
46
|
+
begin
|
|
47
|
+
log_paths = @option_parser.parse!(arguments)
|
|
48
|
+
rescue OptionParser::InvalidOption => error
|
|
49
|
+
$stderr.puts(error)
|
|
50
|
+
return false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
begin
|
|
54
|
+
open_output do |output|
|
|
55
|
+
report_header(output)
|
|
56
|
+
parse(log_paths) do |statistic|
|
|
57
|
+
report_statistic(output, statistic)
|
|
58
|
+
end
|
|
59
|
+
if @pending_entry
|
|
60
|
+
report_entry(output, @pending_entry)
|
|
61
|
+
@pending_entry = nil
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
rescue Interrupt
|
|
65
|
+
rescue Error
|
|
66
|
+
$stderr.puts($!.message)
|
|
67
|
+
return false
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
true
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
def setup_options
|
|
75
|
+
@options = {}
|
|
76
|
+
@options[:output] = "-"
|
|
77
|
+
@options[:target_commands] = ["select", "load"]
|
|
78
|
+
|
|
79
|
+
@option_parser = OptionParser.new do |parser|
|
|
80
|
+
parser.version = VERSION
|
|
81
|
+
parser.banner += " LOG1 ..."
|
|
82
|
+
|
|
83
|
+
parser.on("--output=PATH",
|
|
84
|
+
"Output to PATH.",
|
|
85
|
+
"'-' PATH means standard output.",
|
|
86
|
+
"(#{@options[:output]})") do |output|
|
|
87
|
+
@options[:output] = output
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def open_output
|
|
93
|
+
if @options[:output] == "-"
|
|
94
|
+
yield($stdout)
|
|
95
|
+
else
|
|
96
|
+
File.open(@options[:output], "w") do |output|
|
|
97
|
+
yield(output)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def parse(log_paths, &process_statistic)
|
|
103
|
+
parser = Parser.new(@options)
|
|
104
|
+
parse_log(parser, log_paths, &process_statistic)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def report_statistic(output, statistic)
|
|
108
|
+
command = statistic.command
|
|
109
|
+
if command.name == "select"
|
|
110
|
+
process_select_statistic(output, statistic, command)
|
|
111
|
+
else
|
|
112
|
+
process_load_statistic(output, statistic, command)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def process_select_statistic(output, statistic, select_command)
|
|
117
|
+
return if @pending_entry.nil?
|
|
118
|
+
|
|
119
|
+
operations = statistic.operations
|
|
120
|
+
if operations.any? {|operation| operation[:name] == "filter"}
|
|
121
|
+
return
|
|
122
|
+
end
|
|
123
|
+
select_operation = operations.find do |operation|
|
|
124
|
+
operation[:name] == "select"
|
|
125
|
+
end
|
|
126
|
+
return if select_operation.nil?
|
|
127
|
+
|
|
128
|
+
return if @pending_entry[2] != select_command[:table]
|
|
129
|
+
|
|
130
|
+
@pending_entry[6] = select_operation[:n_records]
|
|
131
|
+
report_entry(output, @pending_entry)
|
|
132
|
+
@pending_entry = nil
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def process_load_statistic(output, statistic, load_command)
|
|
136
|
+
operation = statistic.operations.first
|
|
137
|
+
if operation and operation[:extra]
|
|
138
|
+
extra = operation[:extra]
|
|
139
|
+
extra_counts = extra.scan(/\[(\d+)\]/).flatten.collect(&:to_i)
|
|
140
|
+
n_loaded_records = operation[:n_records]
|
|
141
|
+
n_record_errors = extra_counts[0]
|
|
142
|
+
n_column_errors = extra_counts[1]
|
|
143
|
+
total = extra_counts[2]
|
|
144
|
+
else
|
|
145
|
+
n_loaded_records = nil
|
|
146
|
+
n_record_errors = nil
|
|
147
|
+
n_column_errors = nil
|
|
148
|
+
total = nil
|
|
149
|
+
end
|
|
150
|
+
entry = [
|
|
151
|
+
statistic.start_time.iso8601,
|
|
152
|
+
statistic.elapsed_in_seconds,
|
|
153
|
+
load_command.table,
|
|
154
|
+
n_loaded_records,
|
|
155
|
+
n_record_errors,
|
|
156
|
+
n_column_errors,
|
|
157
|
+
total,
|
|
158
|
+
]
|
|
159
|
+
if @pending_entry
|
|
160
|
+
report_entry(output, @pending_entry)
|
|
161
|
+
@pending_entry = nil
|
|
162
|
+
end
|
|
163
|
+
if total.nil?
|
|
164
|
+
@pending_entry = entry
|
|
165
|
+
else
|
|
166
|
+
report_entry(output, entry)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def report_header(output)
|
|
171
|
+
header = [
|
|
172
|
+
"start_time",
|
|
173
|
+
"elapsed",
|
|
174
|
+
"table",
|
|
175
|
+
"n_loaded_records",
|
|
176
|
+
"n_record_errors",
|
|
177
|
+
"n_column_errors",
|
|
178
|
+
"n_total_records",
|
|
179
|
+
]
|
|
180
|
+
output.puts(header.join(","))
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def report_entry(output, entry)
|
|
184
|
+
output.puts(entry.join(","))
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|