xray_method_tracer 0.1.7 → 0.1.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/.rspec +3 -0
- data/.rubocop.yml +30 -0
- data/.rubocop_todo.yml +17 -0
- data/CHANGELOG.md +5 -0
- data/README.md +77 -0
- data/Rakefile +12 -0
- data/docker-compose.yml +20 -0
- data/exe/xray_method_tracer +4 -0
- data/lib/xray_method_tracer/README.md +35 -0
- data/lib/xray_method_tracer/loggers/README.md +13 -0
- data/lib/xray_method_tracer/loggers/trace_logger.rb +23 -0
- data/lib/xray_method_tracer/methods/class_method_overrider.rb +51 -0
- data/lib/xray_method_tracer/methods/instance_method_overrider.rb +51 -0
- data/lib/xray_method_tracer/methods/method_selector.rb +22 -0
- data/lib/xray_method_tracer/rails/constants.rb +16 -0
- data/lib/xray_method_tracer/set_up/base_trace_set_up.rb +40 -0
- data/lib/xray_method_tracer/set_up/factory/method_trace_set_up_factory.rb +12 -0
- data/lib/xray_method_tracer/set_up/pure_ruby_trace_set_up.rb +13 -0
- data/lib/xray_method_tracer/set_up/rails_trace_set_up.rb +14 -0
- data/lib/xray_method_tracer/utils/segment.rb +17 -0
- data/lib/xray_method_tracer/utils/service_observer.rb +85 -0
- data/lib/xray_method_tracer/version.rb +5 -0
- data/lib/xray_method_tracer.rb +35 -0
- data/main.rb +25 -0
- data/sig/xray_method_tracer.rbs +4 -0
- metadata +129 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2449903c8b3dd706490511f87d515e440461c5646a7abccc72057c6210f4819f
|
4
|
+
data.tar.gz: a34935a6d569bcfae7daa23f4741cf6ce7b2696044100dfde98754ae33ba8042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b252304f4d94baf5e9e40670e021b60329de717c050873644e45509b8e4d78eb170d681893f21d46664c894317f4682602ad3f9ee57b5fc7a48d964671e95081
|
7
|
+
data.tar.gz: f96b3ce63c9c4bf901a9f2b98262f4112002d3611578eea2bc3409369200293b9fcc16fc26b28a42af3a1379f5345fb8c5e842ea6cf23d6766e6b5d07bfd05f9
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
require:
|
4
|
+
- rubocop-rspec
|
5
|
+
|
6
|
+
AllCops:
|
7
|
+
TargetRubyVersion: 3.0.0
|
8
|
+
|
9
|
+
Style/StringLiterals:
|
10
|
+
Enabled: true
|
11
|
+
EnforcedStyle: double_quotes
|
12
|
+
|
13
|
+
Style/StringLiteralsInInterpolation:
|
14
|
+
Enabled: true
|
15
|
+
EnforcedStyle: double_quotes
|
16
|
+
|
17
|
+
Documentation:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
# rspecではネストが長くなるため無効にする
|
21
|
+
Metrics/BlockLength:
|
22
|
+
Exclude:
|
23
|
+
- "spec/**/*"
|
24
|
+
|
25
|
+
# 日本語では〜の場合になるためfalseにする
|
26
|
+
RSpec/ContextWording:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Layout/LineLength:
|
30
|
+
Max: 120
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config --exclude-limit 999999`
|
3
|
+
# on 2024-01-23 10:09:11 UTC using RuboCop version 1.60.1.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 2
|
10
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
11
|
+
Metrics/AbcSize:
|
12
|
+
Max: 26
|
13
|
+
|
14
|
+
# Offense count: 3
|
15
|
+
# Configuration parameters: AllowedGroups.
|
16
|
+
RSpec/NestedGroups:
|
17
|
+
Max: 4
|
data/CHANGELOG.md
ADDED
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# XrayMethodTracer
|
2
|
+
|
3
|
+
X-Ray SDK for Rubyを使用してmodelやserviceなどに書いたメソッドを計装するための仕組み
|
4
|
+
|
5
|
+
## Getting Started
|
6
|
+
[aws-xray-sdk-ruby](https://github.com/aws/aws-xray-sdk-ruby)
|
7
|
+
|
8
|
+
1. Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```
|
11
|
+
gem 'xray_method_tracer’
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```
|
16
|
+
bundle install
|
17
|
+
```
|
18
|
+
|
19
|
+
If you are not using aws-xray-sdk-ruby yet, please also add this line:
|
20
|
+
|
21
|
+
```
|
22
|
+
gem "aws-xray-sdk"
|
23
|
+
```
|
24
|
+
|
25
|
+
## Ussage
|
26
|
+
|
27
|
+
Check the [Getting Started](https://github.com/Taishikun0721/xray_method_tracer/wiki/Getting-Started) pages.
|
28
|
+
|
29
|
+
1.. `/config/initializers` 配下で下記のスクリプトを設定する
|
30
|
+
|
31
|
+
``` ruby xray_method_tracer.rb
|
32
|
+
require 'xray_method_tracer'
|
33
|
+
|
34
|
+
Rails.application.config.after_initialize do
|
35
|
+
Rails.application.eager_load!
|
36
|
+
|
37
|
+
base_klasses = [BaseService, BaseUsecase]
|
38
|
+
klasses = [Human, Bird, Fish]
|
39
|
+
XRayMethodTracer.new(base_klasses: base_klasses, klasses: klasses).trace
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
## Testing
|
44
|
+
|
45
|
+
```
|
46
|
+
bundle exec rspec
|
47
|
+
```
|
48
|
+
|
49
|
+
## Lint
|
50
|
+
```
|
51
|
+
bundle exec rubocop
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
|
56
|
+
|
57
|
+
Install the gem and add to the application's Gemfile by executing:
|
58
|
+
|
59
|
+
$ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
|
60
|
+
|
61
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
62
|
+
|
63
|
+
$ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
|
64
|
+
|
65
|
+
## Usage
|
66
|
+
|
67
|
+
TODO: Write usage instructions here
|
68
|
+
|
69
|
+
## Development
|
70
|
+
|
71
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
72
|
+
|
73
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
74
|
+
|
75
|
+
## Contributing
|
76
|
+
|
77
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/xray_method_tracer.
|
data/Rakefile
ADDED
data/docker-compose.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
services:
|
3
|
+
ruby:
|
4
|
+
image: ruby:3.3.0-slim
|
5
|
+
volumes:
|
6
|
+
- ./:/app
|
7
|
+
working_dir: /app
|
8
|
+
command: bash
|
9
|
+
environment:
|
10
|
+
AWS_XRAY_DAEMON_ADDRESS: localhost:2000
|
11
|
+
|
12
|
+
collector:
|
13
|
+
image: amazon/aws-xray-daemon
|
14
|
+
ports:
|
15
|
+
- 2000:2000/udp
|
16
|
+
environment:
|
17
|
+
- AWS_REGION=ap-northeast-1
|
18
|
+
- AWS_ACCESS_KEY_ID=
|
19
|
+
- AWS_SECRET_ACCESS_KEY=
|
20
|
+
command: ["-o"]
|
@@ -0,0 +1,35 @@
|
|
1
|
+
## XRayMethodTracers
|
2
|
+
### 概要
|
3
|
+
X-Ray SDK for Rubyを使用してmodelやserviceなどに書いたメソッドを計装するための仕組み
|
4
|
+
|
5
|
+
### 依存関係
|
6
|
+
[aws-xray-sdk-ruby](https://github.com/aws/aws-xray-sdk-ruby)
|
7
|
+
|
8
|
+
|
9
|
+
### 使用方法
|
10
|
+
1. /lib配下に`xray_method_tracers`のディレクトリを設置して、application.rbで読み込む
|
11
|
+
|
12
|
+
``` ruby config/application.rb
|
13
|
+
# lib配下を事前に読み込むように設定
|
14
|
+
config.autoload_paths += %W[#{config.root}/lib]
|
15
|
+
config.eager_load_paths << Rails.root.join('lib')
|
16
|
+
```
|
17
|
+
|
18
|
+
|
19
|
+
2. `/config/initializers` 配下で初期化する
|
20
|
+
|
21
|
+
``` ruby xray_method_tracer.rb
|
22
|
+
require 'xray_method_tracers/method_tracer'
|
23
|
+
|
24
|
+
Rails.application.config.after_initialize do
|
25
|
+
unless Rails.env.test?
|
26
|
+
MethodTracer.trace_all_methods!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
```
|
31
|
+
|
32
|
+
サーバーを起動して、メソッドを実行すると該当するメソッドのトレースを取得できます
|
33
|
+
``` bash
|
34
|
+
bundle exec rails s
|
35
|
+
```
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "logger"
|
4
|
+
|
5
|
+
module Loggers
|
6
|
+
class TraceLogger
|
7
|
+
def initialize
|
8
|
+
@logger = Logger.new($stdout)
|
9
|
+
end
|
10
|
+
|
11
|
+
def debug(message)
|
12
|
+
@logger.debug("X-Ray Method Tracer: #{message}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def info(message)
|
16
|
+
@logger.info("X-Ray Method Tracer: #{message}")
|
17
|
+
end
|
18
|
+
|
19
|
+
def warn(message)
|
20
|
+
@logger.warn("X-Ray Method Tracer: #{message}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../rails/constants"
|
4
|
+
require_relative "./method_selector"
|
5
|
+
|
6
|
+
module Methods
|
7
|
+
class ClassMethodOverrider
|
8
|
+
attr_reader :klass
|
9
|
+
|
10
|
+
def initialize(klass)
|
11
|
+
@klass = klass
|
12
|
+
end
|
13
|
+
|
14
|
+
# rubocop:disable Metrics/MethodLength
|
15
|
+
def override!(source_locations)
|
16
|
+
target_method_names = MethodSelector.new(klass.singleton_class).select_method_names_by_source_location(
|
17
|
+
source_locations
|
18
|
+
)
|
19
|
+
target_klass = klass
|
20
|
+
|
21
|
+
Module.new do
|
22
|
+
require_relative "../utils/segment"
|
23
|
+
require_relative "../utils/service_observer"
|
24
|
+
|
25
|
+
target_method_names.each do |method_name|
|
26
|
+
define_method(method_name) do |*args, **kwargs, &block|
|
27
|
+
begin
|
28
|
+
segment = Utils::ServiceObserver.begin_subsegment(
|
29
|
+
Utils::Segment.build_name("CM", target_klass.name, method_name)
|
30
|
+
)
|
31
|
+
segment.add_metadata(:args, Utils::Segment.format_args(args))
|
32
|
+
result = if kwargs.empty?
|
33
|
+
super(*args, &block)
|
34
|
+
else
|
35
|
+
segment.metadata[:kwargs] = kwargs
|
36
|
+
super(*args, **kwargs, &block)
|
37
|
+
end
|
38
|
+
rescue StandardError => e
|
39
|
+
segment.add_exception(e)
|
40
|
+
raise e
|
41
|
+
ensure
|
42
|
+
Utils::ServiceObserver.end_subsegment
|
43
|
+
end
|
44
|
+
result
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
# rubocop:enable Metrics/MethodLength
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../rails/constants"
|
4
|
+
require_relative "./method_selector"
|
5
|
+
|
6
|
+
require "byebug"
|
7
|
+
|
8
|
+
module Methods
|
9
|
+
class InstanceMethodOverrider
|
10
|
+
attr_reader :klass
|
11
|
+
|
12
|
+
def initialize(klass)
|
13
|
+
@klass = klass
|
14
|
+
end
|
15
|
+
|
16
|
+
# rubocop:disable Metrics/MethodLength
|
17
|
+
def override!(source_locations)
|
18
|
+
target_method_names = MethodSelector.new(klass).select_method_names_by_source_location(source_locations)
|
19
|
+
target_klass = klass
|
20
|
+
|
21
|
+
Module.new do
|
22
|
+
require_relative "../utils/segment"
|
23
|
+
require_relative "../utils/service_observer"
|
24
|
+
|
25
|
+
target_method_names.each do |method_name|
|
26
|
+
define_method(method_name) do |*args, **kwargs, &block|
|
27
|
+
begin
|
28
|
+
segment = Utils::ServiceObserver.begin_subsegment(
|
29
|
+
Utils::Segment.build_name("IM", target_klass.name, method_name)
|
30
|
+
)
|
31
|
+
segment.add_metadata(:args, Utils::Segment.format_args(args))
|
32
|
+
result = if kwargs.empty?
|
33
|
+
super(*args, &block)
|
34
|
+
else
|
35
|
+
segment.metadata[:kwargs] = kwargs
|
36
|
+
super(*args, **kwargs, &block)
|
37
|
+
end
|
38
|
+
rescue StandardError => e
|
39
|
+
segment.add_exception(e)
|
40
|
+
raise e
|
41
|
+
ensure
|
42
|
+
Utils::ServiceObserver.end_subsegment
|
43
|
+
end
|
44
|
+
result
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
# rubocop:enable Metrics/MethodLength
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class MethodSelector
|
4
|
+
attr_reader :klass
|
5
|
+
|
6
|
+
def initialize(klass)
|
7
|
+
@klass = klass
|
8
|
+
end
|
9
|
+
|
10
|
+
def select_method_names_by_source_location(source_locations)
|
11
|
+
all_instance_method_names = klass.instance_methods(false)
|
12
|
+
return all_instance_method_names if source_locations.empty?
|
13
|
+
|
14
|
+
all_instance_method_names.map do |method_name|
|
15
|
+
source_location = klass.instance_method(method_name).source_location.first
|
16
|
+
next unless source_location.start_with?(*source_locations)
|
17
|
+
|
18
|
+
method_name
|
19
|
+
end.compact
|
20
|
+
# NOTE: nextを使ったらnilが配列に入って返ってくるので、compactでnilを除外する
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rails
|
4
|
+
class Constant
|
5
|
+
TARGET_SOURCE_LOCATIONS = [
|
6
|
+
"/app/mailers",
|
7
|
+
"/app/models",
|
8
|
+
"/app/controllers",
|
9
|
+
"/app/jobs"
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
def self.target_source_locations
|
13
|
+
TARGET_SOURCE_LOCATIONS.map { |path| XRayMethodTracer.path_prefix + path }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../methods/instance_method_overrider"
|
4
|
+
require_relative "../methods/class_method_overrider"
|
5
|
+
require "active_support/core_ext/class/subclasses"
|
6
|
+
|
7
|
+
module SetUp
|
8
|
+
class BaseTraceSetUp
|
9
|
+
attr_reader :base_klasses, :klasses, :source_locations
|
10
|
+
|
11
|
+
def initialize(base_klasses, klasses, source_locations)
|
12
|
+
@base_klasses = base_klasses
|
13
|
+
@klasses = klasses
|
14
|
+
@source_locations = source_locations
|
15
|
+
end
|
16
|
+
|
17
|
+
def apply_trace
|
18
|
+
classes_to_override = (base_klasses + klasses).uniq
|
19
|
+
classes_to_override.each { |klass| override_methods_in_class(klass) }
|
20
|
+
|
21
|
+
override_methods_in_subclasses if base_klasses.any?
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def override_methods_in_class(klass)
|
27
|
+
mod = Methods::InstanceMethodOverrider.new(klass).override!(source_locations)
|
28
|
+
klass.prepend(mod)
|
29
|
+
|
30
|
+
singleton_mod = Methods::ClassMethodOverrider.new(klass).override!(source_locations)
|
31
|
+
klass.singleton_class.prepend(singleton_mod)
|
32
|
+
end
|
33
|
+
|
34
|
+
def override_methods_in_subclasses
|
35
|
+
base_klasses.uniq.each do |base_klass|
|
36
|
+
base_klass.descendants.each { |klass| override_methods_in_class(klass) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../rails_trace_set_up"
|
4
|
+
require_relative "../pure_ruby_trace_set_up"
|
5
|
+
|
6
|
+
class MethodTraceSetUpFactory
|
7
|
+
def self.create(base_klasses, klasses)
|
8
|
+
return SetUp::RailsTraceSetUp.new(base_klasses, klasses) if Object.const_defined?("Rails::VERSION")
|
9
|
+
|
10
|
+
SetUp::PureRubyTraceSetUp.new(base_klasses, klasses)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./base_trace_set_up"
|
4
|
+
|
5
|
+
module SetUp
|
6
|
+
attr_reader :base_klasses, :klasses, :source_locations
|
7
|
+
|
8
|
+
class PureRubyTraceSetUp < BaseTraceSetUp
|
9
|
+
def initialize(base_klasses, klasses, source_locations = [])
|
10
|
+
super(base_klasses, klasses, source_locations)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./base_trace_set_up"
|
4
|
+
|
5
|
+
module SetUp
|
6
|
+
class RailsTraceSetUp < BaseTraceSetUp
|
7
|
+
attr_reader :base_klasses, :klasses, :source_locations
|
8
|
+
|
9
|
+
def initialize(base_klasses, klasses)
|
10
|
+
@source_locations = Rails::Constant.target_source_locations
|
11
|
+
super(base_klasses, klasses, source_locations)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
class Segment
|
5
|
+
def self.build_name(prefix, klass_name, method_name)
|
6
|
+
sanitize("#{prefix}##{klass_name}##{method_name}")
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.sanitize(name)
|
10
|
+
name.delete("?;*()!$~^<>")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.format_args(args)
|
14
|
+
args.map.with_index { |arg, index| ["arg_#{index + 1}", arg] }.to_h
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ServiceObserver
|
4
|
+
# ===============
|
5
|
+
# XrayやDatadogなどのツールカスタムパフォーマンス計装をする際に使用するクラス
|
6
|
+
# ===============
|
7
|
+
require "aws-xray-sdk"
|
8
|
+
|
9
|
+
module Utils
|
10
|
+
class ServiceObserver
|
11
|
+
attr_accessor :segment
|
12
|
+
|
13
|
+
class << self
|
14
|
+
# カスタム計装をする際には、下記のように記述する事で軽装を実施する事ができる
|
15
|
+
# ServiceObserver.capture('segment_name') do
|
16
|
+
# somefunction()
|
17
|
+
# end
|
18
|
+
def capture(segment_name)
|
19
|
+
begin_subsegment(segment_name)
|
20
|
+
yield
|
21
|
+
ensure
|
22
|
+
end_subsegment
|
23
|
+
end
|
24
|
+
|
25
|
+
def begin_segment_or_subsegment(segment_name)
|
26
|
+
return new(begin_subsegment(segment_name)) if current_segment?
|
27
|
+
|
28
|
+
new(begin_segment(segment_name))
|
29
|
+
end
|
30
|
+
|
31
|
+
def end_segment_or_subsegment
|
32
|
+
end_segment if current_segment?
|
33
|
+
end_subsegment
|
34
|
+
end
|
35
|
+
|
36
|
+
def begin_subsegment(segment_name)
|
37
|
+
XRay.recorder.begin_subsegment(segment_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def end_subsegment
|
41
|
+
XRay.recorder.end_subsegment
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def begin_segment(segment_name)
|
47
|
+
XRay.recorder.begin_segment(segment_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def end_segment
|
51
|
+
XRay.recorder.end_segment
|
52
|
+
end
|
53
|
+
|
54
|
+
def current_segment
|
55
|
+
XRay.recorder.current_segment
|
56
|
+
end
|
57
|
+
|
58
|
+
def current_subsegment
|
59
|
+
XRay.recorder.current_subsegment
|
60
|
+
end
|
61
|
+
|
62
|
+
def current_segment?
|
63
|
+
!XRay.recorder.current_segment.nil?
|
64
|
+
end
|
65
|
+
|
66
|
+
def current_subsegment?
|
67
|
+
!XRay.recorder.current_subsegment.nil?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_metadata(key, value)
|
72
|
+
segment.metadata[key] = value
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_exception(error)
|
76
|
+
segment.add_exception(exception: error)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def initialize(segment)
|
82
|
+
@segment = segment
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./xray_method_tracer/set_up/factory/method_trace_set_up_factory"
|
4
|
+
require_relative "./xray_method_tracer/loggers/trace_logger"
|
5
|
+
|
6
|
+
class XRayMethodTracer
|
7
|
+
attr_reader :base_klasses, :klasses
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :path_prefix # dockerなどでWORKDIRを変更した場合に対応するためのprefix
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(base_klasses: [], klasses: [])
|
14
|
+
@base_klasses = base_klasses
|
15
|
+
@klasses = klasses
|
16
|
+
end
|
17
|
+
|
18
|
+
def trace
|
19
|
+
if empty_klasses?
|
20
|
+
Loggers::TraceLogger.new.warn("At least one klasses or base_klasses is required No Tracing will be done")
|
21
|
+
return
|
22
|
+
end
|
23
|
+
|
24
|
+
Loggers::TraceLogger.new.info("setup method trace")
|
25
|
+
method_trace_setup = MethodTraceSetUpFactory.create(base_klasses, klasses)
|
26
|
+
method_trace_setup.apply_trace
|
27
|
+
Loggers::TraceLogger.new.info("setup method trace done")
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def empty_klasses?
|
33
|
+
base_klasses.empty? && klasses.empty?
|
34
|
+
end
|
35
|
+
end
|
data/main.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "aws-xray-sdk"
|
4
|
+
require "xray_method_tracer"
|
5
|
+
require "byebug"
|
6
|
+
|
7
|
+
class Main
|
8
|
+
def hello_world
|
9
|
+
"hello world"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
user_config = {
|
14
|
+
sampling: true,
|
15
|
+
name: "pure_ruby_app",
|
16
|
+
daemon_address: "127.0.0.1:2000",
|
17
|
+
context_missing: "LOG_ERROR",
|
18
|
+
patch: %I[net_http aws_sdk]
|
19
|
+
}
|
20
|
+
|
21
|
+
XRay.recorder.configure(user_config)
|
22
|
+
|
23
|
+
XRayMethodTracer.new(klasses: [Main, Human]).trace
|
24
|
+
|
25
|
+
puts Main.new.hello_world
|
metadata
CHANGED
@@ -1,22 +1,146 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xray_method_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taishikun0721
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-02-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aws-xray-sdk
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.15.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.15.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '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'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.21'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.21'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.2'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.2'
|
13
111
|
description:
|
14
112
|
email:
|
15
113
|
- tai0721abc@gmail.com
|
16
|
-
executables:
|
114
|
+
executables:
|
115
|
+
- xray_method_tracer
|
17
116
|
extensions: []
|
18
117
|
extra_rdoc_files: []
|
19
|
-
files:
|
118
|
+
files:
|
119
|
+
- ".rspec"
|
120
|
+
- ".rubocop.yml"
|
121
|
+
- ".rubocop_todo.yml"
|
122
|
+
- CHANGELOG.md
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- docker-compose.yml
|
126
|
+
- exe/xray_method_tracer
|
127
|
+
- lib/xray_method_tracer.rb
|
128
|
+
- lib/xray_method_tracer/README.md
|
129
|
+
- lib/xray_method_tracer/loggers/README.md
|
130
|
+
- lib/xray_method_tracer/loggers/trace_logger.rb
|
131
|
+
- lib/xray_method_tracer/methods/class_method_overrider.rb
|
132
|
+
- lib/xray_method_tracer/methods/instance_method_overrider.rb
|
133
|
+
- lib/xray_method_tracer/methods/method_selector.rb
|
134
|
+
- lib/xray_method_tracer/rails/constants.rb
|
135
|
+
- lib/xray_method_tracer/set_up/base_trace_set_up.rb
|
136
|
+
- lib/xray_method_tracer/set_up/factory/method_trace_set_up_factory.rb
|
137
|
+
- lib/xray_method_tracer/set_up/pure_ruby_trace_set_up.rb
|
138
|
+
- lib/xray_method_tracer/set_up/rails_trace_set_up.rb
|
139
|
+
- lib/xray_method_tracer/utils/segment.rb
|
140
|
+
- lib/xray_method_tracer/utils/service_observer.rb
|
141
|
+
- lib/xray_method_tracer/version.rb
|
142
|
+
- main.rb
|
143
|
+
- sig/xray_method_tracer.rbs
|
20
144
|
homepage: https://github.com/Taishikun0721/xray_method_tracer
|
21
145
|
licenses: []
|
22
146
|
metadata:
|